Translated using Weblate (Korean)
[phpmyadmin.git] / doc / setup.rst
blob474a93e86661ce5692c404c7fdd6027adcd26d88
1 .. _setup:
3 Installation
4 ============
6 phpMyAdmin does not apply any special security methods to the MySQL
7 database server. It is still the system administrator's job to grant
8 permissions on the MySQL databases properly. phpMyAdmin's :guilabel:`Users`
9 page can be used for this.
11 .. warning::
13     :term:`Mac` users should note that if you are on a version before
14     :term:`Mac OS X`, StuffIt unstuffs with :term:`Mac` formats. So you'll have
15     to resave as in BBEdit to Unix style ALL phpMyAdmin scripts before
16     uploading them to your server, as PHP seems not to like :term:`Mac`-style
17     end of lines character ("``\r``").
19 Linux distributions
20 +++++++++++++++++++
22 phpMyAdmin is included in most Linux distributions. It is recommended to use
23 distribution packages when possible - they usually provide integration to your
24 distribution and you will automatically get security updates from your distribution.
27 Debian
28 ------
30 Debian's package repositories include a phpMyAdmin package, but be aware that
31 the configuration file is maintained in ``/etc/phpmyadmin`` and may differ in
32 some ways from the official phpMyAdmin documentation.
34 OpenSUSE
35 --------
37 OpenSUSE already comes with phpMyAdmin package, just install packages from
38 the `openSUSE Build Service <https://software.opensuse.org/package/phpMyAdmin>`_.
40 Ubuntu
41 ------
43 Ubuntu ships phpMyAdmin package, however if you want to use recent version, you
44 can use packages from
45 `PPA for Michal Čihař <https://launchpad.net/~nijel/+archive/phpmyadmin>`_.
47 Gentoo
48 ------
50 Gentoo ships the phpMyAdmin package, both in a near stock configuration as well
51 as in a ``webapp-config`` configuration. Use ``emerge dev-db/phpmyadmin`` to
52 install.
54 Mandriva
55 --------
57 Mandriva ships the phpMyAdmin package in their ``contrib`` branch and can be
58 installed via the usual Control Center.
60 Fedora
61 ------
63 Fedora ships the phpMyAdmin package, but be aware that the configuration file
64 is maintained in ``/etc/phpMyAdmin/`` and may differ in some ways from the
65 official phpMyAdmin documentation.
67 Red Hat Enterprise Linux
68 ------------------------
70 Red Hat Enterprise Linux itself and thus derivatives like CentOS don't
71 ship phpMyAdmin, but the Fedora-driven repository
72 `Extra Packages for Enterprise Linux (EPEL) <https://fedoraproject.org/wiki/EPEL>`_
73 is doing so, if it's
74 `enabled <https://fedoraproject.org/wiki/EPEL/FAQ#howtouse>`_.
75 But be aware that the configuration file is maintained in
76 ``/etc/phpMyAdmin/`` and may differ in some ways from the
77 official phpMyAdmin documentation.
80 Installing on Windows
81 +++++++++++++++++++++
83 The easiest way to get phpMyAdmin on Windows is using third party products
84 which include phpMyAdmin together with a database and web server such as
85 `XAMPP <https://www.apachefriends.org/>`_.
87 You can find more of such options at `Wikipedia <https://en.wikipedia.org/wiki/List_of_AMP_packages>`_.
90 Installing using Composer
91 +++++++++++++++++++++++++
93 You can install phpMyAdmin using `Composer <https://getcomposer.org/>`_,
94 however it's currently not available in the default
95 `Packagist <https://packagist.org/>`_ repository due to its technical
96 limitations.
98 The installation is possible by adding our own repository
99 <https://www.phpmyadmin.net/packages.json>:
101 .. code-block:: sh
103     composer create-project phpmyadmin/phpmyadmin --repository-url=https://www.phpmyadmin.net/packages.json --no-dev
105 Installing using Docker
106 +++++++++++++++++++++++
108 phpMyAdmin comes with a Docker image, which you can easily deploy. You can
109 download it using:
111 .. code-block:: sh
113     docker pull phpmyadmin/phpmyadmin
115 The phpMyAdmin server will be executed on port 80. It supports several ways of
116 configuring the link to the database server, which you can manage using
117 environment variables:
119 .. envvar:: PMA_ARBITRARY
121     Allows you to enter database server hostname on login form (see
122     :config:option:`$cfg['AllowArbitraryServer']`).
124 .. envvar:: PMA_HOST
125     
126     Host name or IP address of the database server to use.
128 .. envvar:: PMA_HOSTS
129     
130     Comma separated host names or IP addresses of the database servers to use.
132 .. envvar:: PMA_USER
133     
134     User name to use for :ref:`auth_config`.
136 .. envvar:: PMA_PASSWORD
137     
138     Password to use for :ref:`auth_config`.
140 .. envvar:: PMA_PORT
141     
142     Port of the databse server to use.
144 .. envvar:: PMA_ABSOLUTE_URI
145    
146     The fully-qualified path (``https://pma.example.net/``) where the reverse
147     proxy makes phpMyAdmin available.
149 By default, :ref:`cookie` is used, but if :envvar:`PMA_USER` and
150 :envvar:`PMA_PASSWORD` are set, it is switched to :ref:`auth_config`.
152 .. note::
154     The credentials you need to login are stored in the MySQL server, in case
155     of Docker image there are various ways to set it (for example
156     :envvar:`MYSQL_ROOT_PASSWORD` when starting MySQL container). Please check 
157     documentation for `MariaDB container <https://hub.docker.com/r/_/mariadb/>`_
158     or `MySQL container <https://hub.docker.com/r/_/mysql/>`_.
160 Additionally configuration can be tweaked by :file:`/config.user.inc.php`. If
161 this file exists, it will be loaded after configuration generated from above
162 environment variables, so you can override any configuration variable. This
163 configuraiton can be added as a volume when invoking docker using 
164 `-v /some/local/directory/config.user.inc.php:/config.user.inc.php` parameters.
166 .. seealso:: 
167    
168     See :ref:`config` for detailed description of configuration options.
170 Docker Examples
171 ---------------
173 To connect phpMyAdmin to given server use:
175 .. code-block:: sh
177     docker run --name myadmin -d -e PMA_HOST=dbhost -p 8080:80 phpmyadmin/phpmyadmin
179 To connect phpMyAdmin to more servers use:
181 .. code-block:: sh
183     docker run --name myadmin -d -e PMA_HOSTS=dbhost1,dbhost2,dbhost3 -p 8080:80 phpmyadmin/phpmyadmin
185 To use arbitrary server option:
187 .. code-block:: sh
189     docker run --name myadmin -d --link mysql_db_server:db -p 8080:80 -e PMA_ARBITRARY=1 phpmyadmin/phpmyadmin
191 You can also link the database container using Docker:
193 .. code-block:: sh
195     docker run --name phpmyadmin -d --link mysql_db_server:db -p 8080:80 phpmyadmin/phpmyadmin
197 Running with additional configration:
199 .. code-block:: sh
201     docker run --name phpmyadmin -d --link mysql_db_server:db -p 8080:80 -v /some/local/directory/config.user.inc.php:/config.user.inc.php phpmyadmin/phpmyadmin
203 Using docker-compose
204 --------------------
206 Alternatively you can also use docker-compose with the docker-compose.yml from
207 <https://github.com/phpmyadmin/docker>.  This will run phpMyAdmin with
208 arbitrary server - allowing you to specify MySQL/MariaDB server on login page.
210 .. code-block:: sh
212     docker-compose up -d
214 .. _quick_install:
216 Quick Install
217 +++++++++++++
219 #. Choose an appropriate distribution kit from the phpmyadmin.net
220    Downloads page. Some kits contain only the English messages, others
221    contain all languages. We'll assume you chose a kit whose name
222    looks like ``phpMyAdmin-x.x.x -all-languages.tar.gz``.
223 #. Ensure you have downloaded a genuine archive, see :ref:`verify`.
224 #. Untar or unzip the distribution (be sure to unzip the subdirectories):
225    ``tar -xzvf phpMyAdmin_x.x.x-all-languages.tar.gz`` in your
226    webserver's document root. If you don't have direct access to your
227    document root, put the files in a directory on your local machine,
228    and, after step 4, transfer the directory on your web server using,
229    for example, ftp.
230 #. Ensure that all the scripts have the appropriate owner (if PHP is
231    running in safe mode, having some scripts with an owner different from
232    the owner of other scripts will be a problem). See :ref:`faq4_2` and
233    :ref:`faq1_26` for suggestions.
234 #. Now you must configure your installation. There are two methods that
235    can be used. Traditionally, users have hand-edited a copy of
236    :file:`config.inc.php`, but now a wizard-style setup script is provided
237    for those who prefer a graphical installation. Creating a
238    :file:`config.inc.php` is still a quick way to get started and needed for
239    some advanced features.
242 Manually creating the file
243 --------------------------
245 To manually create the file, simply use your text editor to create the
246 file :file:`config.inc.php` (you can copy :file:`config.sample.inc.php` to get
247 a minimal configuration file) in the main (top-level) phpMyAdmin
248 directory (the one that contains :file:`index.php`). phpMyAdmin first
249 loads :file:`libraries/config.default.php` and then overrides those values
250 with anything found in :file:`config.inc.php`. If the default value is
251 okay for a particular setting, there is no need to include it in
252 :file:`config.inc.php`. You'll probably need only a few directives to get going; a
253 simple configuration may look like this:
255 .. code-block:: xml+php
258     <?php
259     // use here a value of your choice at least 32 chars long
260     $cfg['blowfish_secret'] = '1{dd0`<Q),5XP_:R9UK%%8\"EEcyH#{o';
262     $i=0;
263     $i++;
264     $cfg['Servers'][$i]['auth_type']     = 'cookie';
265     ?>
267 Or, if you prefer to not be prompted every time you log in:
269 .. code-block:: xml+php
272     <?php
274     $i=0;
275     $i++;
276     $cfg['Servers'][$i]['user']          = 'root';
277     $cfg['Servers'][$i]['password']      = 'cbb74bc'; // use here your password
278     $cfg['Servers'][$i]['auth_type']     = 'config';
279     ?>
281 For a full explanation of possible configuration values, see the
282 :ref:`config` of this document.
284 .. index:: Setup script
286 .. _setup_script:
288 Using Setup script
289 ------------------
291 Instead of manually editing :file:`config.inc.php`, you can use phpMyAdmin's 
292 setup feature. First you must manually create a folder ``config``
293 in the phpMyAdmin directory. This is a security measure. On a
294 Linux/Unix system you can use the following commands:
296 .. code-block:: sh
299     cd phpMyAdmin
300     mkdir config                        # create directory for saving
301     chmod o+rw config                   # give it world writable permissions
303 And to edit an existing configuration, copy it over first:
305 .. code-block:: sh
308     cp config.inc.php config/           # copy current configuration for editing
309     chmod o+w config/config.inc.php     # give it world writable permissions
311 .. note::
313     Debian and Ubuntu have simplified this setup and all you need to do is to
314     execute :program:`/usr/sbin/pma-configure`.
316 On other platforms, simply create the folder and ensure that your web
317 server has read and write access to it. :ref:`faq1_26` can help with
318 this.
320 Next, open your browser and visit the location where you installed phpMyAdmin, with the ``/setup`` suffix. If you have an existing configuration,
321 use the ``Load`` button to bring its content inside the setup panel.
322 Note that **changes are not saved to disk until you explicitly choose ``Save``**
323 from the *Configuration* area of the screen. Normally the script saves the new
324 :file:`config.inc.php` to the ``config/`` directory, but if the webserver does
325 not have the proper permissions you may see the error "Cannot load or
326 save configuration." Ensure that the ``config/`` directory exists and
327 has the proper permissions - or use the ``Download`` link to save the
328 config file locally and upload it (via FTP or some similar means) to the
329 proper location.
331 Once the file has been saved, it must be moved out of the ``config/``
332 directory and the permissions must be reset, again as a security
333 measure:
335 .. code-block:: sh
338     mv config/config.inc.php .         # move file to current directory
339     chmod o-rw config.inc.php          # remove world read and write permissions
340     rm -rf config                      # remove not needed directory
342 .. note::
344     Debian and Ubuntu have simplified this setup and all you need to do is to
345     execute :program:`/usr/sbin/pma-secure`.
347 Now the file is ready to be used. You can choose to review or edit the
348 file with your favorite editor, if you prefer to set some advanced
349 options which the setup script does not provide.
351 #. If you are using the ``auth_type`` "config", it is suggested that you
352    protect the phpMyAdmin installation directory because using config
353    does not require a user to enter a password to access the phpMyAdmin
354    installation. Use of an alternate authentication method is
355    recommended, for example with HTTP–AUTH in a :term:`.htaccess` file or switch to using
356    ``auth_type`` cookie or http. See the :ref:`faqmultiuser`
357    for additional information, especially :ref:`faq4_4`.
358 #. Open the `main phpMyAdmin directory <index.php>`_ in your browser.
359    phpMyAdmin should now display a welcome screen and your databases, or
360    a login dialog if using :term:`HTTP` or
361    cookie authentication mode.
362 #. You should deny access to the ``./libraries`` and ``./setup/lib``
363    subfolders in your webserver configuration.
364    Such configuration prevents from possible
365    path exposure and cross side scripting vulnerabilities that might
366    happen to be found in that code. For the Apache webserver, this is
367    often accomplished with a :term:`.htaccess` file in those directories.
368 #. It is generally a good idea to protect a public phpMyAdmin installation
369    against access by robots as they usually can not do anything good
370    there. You can do this using ``robots.txt`` file in root of your
371    webserver or limit access by web server configuration, see
372    :ref:`faq1_42`.
375 .. _verify:
377 Verifying phpMyAdmin releases
378 +++++++++++++++++++++++++++++
380 Since July 2015 all phpMyAdmin releases are cryptographically signed by the
381 releasing developer, who through January 2016 was Marc Delisle. His key id is
382 0xFEFC65D181AF644A, his PGP fingerprint is:
384 .. code-block:: console
386     436F F188 4B1A 0C3F DCBF 0D79 FEFC 65D1 81AF 644A
388 and you can get more identification information from <https://keybase.io/lem9>.
390 Beginning in January 2016, the release manager is Isaac Bennetch. His key id is
391 0xCE752F178259BD92, and his PGP fingerprint is:
393 .. code-block:: console
395     3D06 A59E CE73 0EB7 1B51 1C17 CE75 2F17 8259 BD92
397 and you can get more identification information from <https://keybase.io/ibennetch>.
399 Some additional downloads (for example themes) might be signed by Michal Čihař. His key id is
400 0x9C27B31342B7511D, and his PGP fingerprint is:
402 .. code-block:: console
404     63CB 1DF1 EF12 CF2A C0EE 5A32 9C27 B313 42B7 511D
406 and you can get more identification information from <https://keybase.io/nijel>.
408 You should verify that the signature matches
409 the archive you have downloaded. This way you can be sure that you are using
410 the same code that was released.
412 Each archive is accompanied with ``.asc`` files which contains the PGP signature
413 for it. Once you have both of them in the same folder, you can verify the signature:
415 .. code-block:: console
417     $ gpg --verify phpMyAdmin-4.5.4.1-all-languages.zip.asc
418     gpg: Signature made Fri 29 Jan 2016 08:59:37 AM EST using RSA key ID 8259BD92
419     gpg: Can't check signature: public key not found
421 As you can see gpg complains that it does not know the public key. At this
422 point you should do one of the following steps:
424 * Download the keyring from `our download server <https://files.phpmyadmin.net/phpmyadmin.keyring>`_, then import it with:
426 .. code-block:: console
428    $ gpg --import phpmyadmin.keyring
430 * Download and import the key from one of the key servers:
432 .. code-block:: console
434     $ gpg --keyserver hkp://pgp.mit.edu --recv-keys 3D06A59ECE730EB71B511C17CE752F178259BD92
435     gpg: requesting key 8259BD92 from hkp server pgp.mit.edu
436     gpg: key 8259BD92: public key "Isaac Bennetch <bennetch@gmail.com>" imported
437     gpg: no ultimately trusted keys found
438     gpg: Total number processed: 1
439     gpg:               imported: 1  (RSA: 1)
441 This will improve the situation a bit - at this point you can verify that the
442 signature from the given key is correct but you still can not trust the name used
443 in the key:
445 .. code-block:: console
447     $ gpg --verify phpMyAdmin-4.5.4.1-all-languages.zip.asc
448     gpg: Signature made Fri 29 Jan 2016 08:59:37 AM EST using RSA key ID 8259BD92
449     gpg: Good signature from "Isaac Bennetch <bennetch@gmail.com>"
450     gpg:                 aka "Isaac Bennetch <isaac@bennetch.org>"
451     gpg: WARNING: This key is not certified with a trusted signature!
452     gpg:          There is no indication that the signature belongs to the owner.
453     Primary key fingerprint: 3D06 A59E CE73 0EB7 1B51  1C17 CE75 2F17 8259 BD92
455 The problem here is that anybody could issue the key with this name.  You need to
456 ensure that the key is actually owned by the mentioned person.  The GNU Privacy
457 Handbook covers this topic in the chapter `Validating other keys on your public
458 keyring`_. The most reliable method is to meet the developer in person and
459 exchange key fingerprints, however you can also rely on the web of trust. This way
460 you can trust the key transitively though signatures of others, who have met
461 the developer in person. For example you can see how `Isaac's key links to
462 Linus's key`_.
464 Once the key is trusted, the warning will not occur:
466 .. code-block:: console
468     $ gpg --verify phpMyAdmin-4.5.4.1-all-languages.zip.asc
469     gpg: Signature made Fri 29 Jan 2016 08:59:37 AM EST using RSA key ID 8259BD92
470     gpg: Good signature from "Isaac Bennetch <bennetch@gmail.com>" [full]
472 Should the signature be invalid (the archive has been changed), you would get a
473 clear error regardless of the fact that the key is trusted or not:
475 .. code-block:: console
477     $ gpg --verify phpMyAdmin-4.5.4.1-all-languages.zip.asc
478     gpg: Signature made Fri 29 Jan 2016 08:59:37 AM EST using RSA key ID 8259BD92
479     gpg: BAD signature from "Isaac Bennetch <bennetch@gmail.com>" [unknown]
481 .. _Validating other keys on your public keyring: https://www.gnupg.org/gph/en/manual.html#AEN335
483 .. _Isaac's key links to Linus's key: https://pgp.cs.uu.nl/mk_path.cgi?FROM=ABAF11C65A2970B130ABE3C479BE3E4300411886&TO=3D06A59ECE730EB71B511C17CE752F178259BD92
486 .. index::
487     single: Configuration storage
488     single: phpMyAdmin configuration storage
489     single: pmadb
491 .. _linked-tables:
493 phpMyAdmin configuration storage
494 ++++++++++++++++++++++++++++++++
496 For a whole set of additional features (bookmarks, comments, :term:`SQL`-history,
497 tracking mechanism, :term:`PDF`-generation, column contents transformation,
498 etc.) you need to create a set of special tables.  Those tables can be located
499 in your own database, or in a central database for a multi-user installation
500 (this database would then be accessed by the controluser, so no other user
501 should have rights to it).
503 Zero configuration
504 ------------------
506 In many cases, this database structure can be automatically created and
507 configured. This is called “Zero Configuration” mode and can be particularly
508 useful in shared hosting situations. “Zeroconf” mode is on by default, to
509 disable set :config:option:`$cfg['ZeroConf']` to false.
511 The following three scenarios are covered by the Zero Configuration mode:
513 * When entering a database where the configuration storage tables are not
514   present, phpMyAdmin offers to create them from the Operations tab.
515 * When entering a database where the tables do already exist, the software
516   automatically detects this and begins using them. This is the most common
517   situation; after the tables are initially created automatically they are
518   continually used without disturbing the user; this is also most useful on
519   shared hosting where the user is not able to edit :file:`config.inc.php` and
520   usually the user only has access to one database.
521 * When having access to multiple databases, if the user first enters the
522   database containing the configuration storage tables then switches to
523   another database,
524   phpMyAdmin continues to use the tables from the first database; the user is
525   not prompted to create more tables in the new database.
528 Manual configuration
529 --------------------
531 Please look at your ``./sql/`` directory, where you should find a
532 file called *create\_tables.sql*. (If you are using a Windows server,
533 pay special attention to :ref:`faq1_23`).
535 If you already had this infrastructure and:
537 * upgraded to MySQL 4.1.2 or newer, please use
538   :file:`sql/upgrade_tables_mysql_4_1_2+.sql`.
539 * upgraded to phpMyAdmin 4.3.0 or newer from 2.5.0 or newer (<= 4.2.x),
540   please use :file:`sql/upgrade_column_info_4_3_0+.sql`.
542 and then create new tables by importing :file:`sql/create_tables.sql`.
544 You can use your phpMyAdmin to create the tables for you. Please be
545 aware that you may need special (administrator) privileges to create
546 the database and tables, and that the script may need some tuning,
547 depending on the database name.
549 After having imported the :file:`sql/create_tables.sql` file, you
550 should specify the table names in your :file:`config.inc.php` file. The
551 directives used for that can be found in the :ref:`config`.
553 You will also need to have a controluser
554 (:config:option:`$cfg['Servers'][$i]['controluser']` and
555 :config:option:`$cfg['Servers'][$i]['controlpass']` settings)
556 with the proper rights to those tables. For example you can create it
557 using following statement:
559 .. code-block:: mysql
561    GRANT SELECT, INSERT, UPDATE, DELETE ON <pma_db>.* TO 'pma'@'localhost'  IDENTIFIED BY 'pmapass';
563 .. _upgrading:
565 Upgrading from an older version
566 +++++++++++++++++++++++++++++++
568 .. warning::
570     **Never** extract the new version over an existing installation of
571     phpMyAdmin, always first remove the old files keeping just the
572     configuration.
574     This way you will not leave old no longer working code in the directory,
575     which can have severe security implications or can cause various breakages.
578 Simply copy :file:`config.inc.php` from your previous installation into
579 the newly unpacked one. Configuration files from old versions may
580 require some tweaking as some options have been changed or removed.
581 For compatibility with PHP 5.3 and later, remove a
582 ``set_magic_quotes_runtime(0);`` statement that you might find near
583 the end of your configuration file.
585 You should **not** copy :file:`libraries/config.default.php` over
586 :file:`config.inc.php` because the default configuration file is version-
587 specific.
589 If you have upgraded your MySQL server from a version previous to 4.1.2 to
590 version 5.x or newer and if you use the phpMyAdmin configuration storage, you
591 should run the :term:`SQL` script found in
592 :file:`sql/upgrade_tables_mysql_4_1_2+.sql`.
594 If you have upgraded your phpMyAdmin to 4.3.0 or newer from 2.5.0 or
595 newer (<= 4.2.x) and if you use the phpMyAdmin configuration storage, you
596 should run the :term:`SQL` script found in
597 :file:`sql/upgrade_column_info_4_3_0+.sql`.
599 Do not forget to clear the browser cache and to empty the old session by
600 logging out and logging in again.
602 .. index:: Authentication mode
604 .. _authentication_modes:
606 Using authentication modes
607 ++++++++++++++++++++++++++
609 :term:`HTTP` and cookie authentication modes are recommended in a **multi-user
610 environment** where you want to give users access to their own database and
611 don't want them to play around with others. Nevertheless be aware that MS
612 Internet Explorer seems to be really buggy about cookies, at least till version
613 6. Even in a **single-user environment**, you might prefer to use :term:`HTTP`
614 or cookie mode so that your user/password pair are not in clear in the
615 configuration file.
617 :term:`HTTP` and cookie authentication
618 modes are more secure: the MySQL login information does not need to be
619 set in the phpMyAdmin configuration file (except possibly for the
620 :config:option:`$cfg['Servers'][$i]['controluser']`).
621 However, keep in mind that the password travels in plain text, unless
622 you are using the HTTPS protocol. In cookie mode, the password is
623 stored, encrypted with the AES algorithm, in a temporary cookie.
625 Then each of the *true* users should be granted a set of privileges
626 on a set of particular databases. Normally you shouldn't give global
627 privileges to an ordinary user, unless you understand the impact of those
628 privileges (for example, you are creating a superuser).
629 For example, to grant the user *real_user* with all privileges on
630 the database *user_base*:
632 .. code-block:: mysql
634    GRANT ALL PRIVILEGES ON user_base.* TO 'real_user'@localhost IDENTIFIED BY 'real_password';
637 What the user may now do is controlled entirely by the MySQL user management
638 system. With HTTP or cookie authentication mode, you don't need to fill the
639 user/password fields inside the :config:option:`$cfg['Servers']`.
641 .. index:: pair: HTTP; Authentication mode
643 HTTP authentication mode
644 ------------------------
646 * Uses :term:`HTTP` Basic authentication
647   method and allows you to log in as any valid MySQL user.
648 * Is supported with most PHP configurations. For :term:`IIS` (:term:`ISAPI`)
649   support using :term:`CGI` PHP see :ref:`faq1_32`, for using with Apache
650   :term:`CGI` see :ref:`faq1_35`.
651 * When PHP is running under Apache's :term:`mod_proxy_fcgi` (e.g. with PHP-FPM),
652   ``Authorization`` headers are not passed to the underlying FCGI application,
653   such that your credentials will not reach the application. In this case, you can
654   add the following configuration directive:
656   .. code-block:: apache
658      SetEnvIf Authorization "(.*)" HTTP_AUTHORIZATION=$1
660 * See also :ref:`faq4_4` about not using the :term:`.htaccess` mechanism along with
661   ':term:`HTTP`' authentication mode.
663 .. index:: pair: Cookie; Authentication mode
665 .. _cookie:
667 Cookie authentication mode
668 --------------------------
670 * Username and password are stored in cookies during the session and password
671   is deleted when it ends.
672 * With this mode, the user can truly log out of phpMyAdmin and log
673   back in with the same username.
674 * If you want to allow users to enter any hostname to connect (rather than only
675   servers that are configured in :file:`config.inc.php`),
676   see the :config:option:`$cfg['AllowArbitraryServer']` directive.
677 * As mentioned in the :ref:`require` section, having the ``mcrypt`` extension will
678   speed up access considerably, but is not required.
680 .. index:: pair: Signon; Authentication mode
682 .. _auth_signon:
684 Signon authentication mode
685 --------------------------
687 * This mode is a convenient way of using credentials from another
688   application to authenticate to phpMyAdmin to implement single signon
689   solution.
690 * The other application has to store login information into session
691   data (see :config:option:`$cfg['Servers'][$i]['SignonSession']`) or you
692   need to implement script to return the credentials (see
693   :config:option:`$cfg['Servers'][$i]['SignonScript']`).
694 * When no credentials are available, the user is being redirected to
695   :config:option:`$cfg['Servers'][$i]['SignonURL']`, where you should handle
696   the login process.
698 The very basic example of saving credentials in a session is available as
699 :file:`examples/signon.php`:
701 .. literalinclude:: ../examples/signon.php
702     :language: php
704 Alternatively you can also use this way to integrate with OpenID as shown
705 in :file:`examples/openid.php`:
707 .. literalinclude:: ../examples/openid.php
708     :language: php
710 If you intend to pass the credentials using some other means than, you have to
711 implement wrapper in PHP to get that data and set it to
712 :config:option:`$cfg['Servers'][$i]['SignonScript']`. There is very minimal example
713 in :file:`examples/signon-script.php`:
715 .. literalinclude:: ../examples/signon-script.php
716     :language: php
718 .. seealso::
719     :config:option:`$cfg['Servers'][$i]['auth_type']`,
720     :config:option:`$cfg['Servers'][$i]['SignonSession']`,
721     :config:option:`$cfg['Servers'][$i]['SignonScript']`,
722     :config:option:`$cfg['Servers'][$i]['SignonURL']`
725 .. index:: pair: Config; Authentication mode
727 .. _auth_config:
729 Config authentication mode
730 --------------------------
732 * This mode is sometimes the less secure one because it requires you to fill the
733   :config:option:`$cfg['Servers'][$i]['user']` and
734   :config:option:`$cfg['Servers'][$i]['password']`
735   fields (and as a result, anyone who can read your :file:`config.inc.php`
736   can discover your username and password).
737 * In the :ref:`faqmultiuser` section, there is an entry explaining how
738   to protect your configuration file.
739 * For additional security in this mode, you may wish to consider the
740   Host authentication :config:option:`$cfg['Servers'][$i]['AllowDeny']['order']`
741   and :config:option:`$cfg['Servers'][$i]['AllowDeny']['rules']` configuration directives.
742 * Unlike cookie and http, does not require a user to log in when first
743   loading the phpMyAdmin site. This is by design but could allow any
744   user to access your installation. Use of some restriction method is
745   suggested, perhaps a :term:`.htaccess` file with the HTTP-AUTH directive or disallowing
746   incoming HTTP requests at one’s router or firewall will suffice (both
747   of which are beyond the scope of this manual but easily searchable
748   with Google).
751 Securing your phpMyAdmin installation
752 +++++++++++++++++++++++++++++++++++++
754 The phpMyAdmin team tries hard to make the application secure, however there
755 are always ways to make your installation more secure:
757 * Serve phpMyAdmin on HTTPS only. Preferably, you should use HSTS as well, so that
758   you're protected from protocol downgrade attacks.
759 * Remove the ``test`` directory from phpMyAdmin, unless you are developing and need test suite.
760 * Remove the ``setup`` directory from phpMyAdmin, you will probably not
761   use it after the initial setup.
762 * Properly choose an authentication method - :ref:`cookie`
763   is probably the best choice for shared hosting.
764 * In case you don't want all MySQL users to be able to access
765   phpMyAdmin, you can use :config:option:`$cfg['Servers'][$i]['AllowDeny']['rules']` to limit them.
766 * Consider hiding phpMyAdmin behind an authentication proxy, so that
767   users need to authenticate prior to providing MySQL credentials
768   to phpMyAdmin. You can achieve this by configuring your web server to request
769   HTTP authentication. For example in Apache this can be done with:
770     
771   .. code-block:: apache
773      AuthType Basic
774      AuthName "Restricted Access"
775      AuthUserFile /usr/share/phpmyadmin/passwd
776      Require valid-user
778   Once you have changed the configuration, you need to create a list of users which
779   can authenticate. This can be done using the :program:`htpasswd` utility:
781   .. code-block:: sh
783      htpasswd -c /usr/share/phpmyadmin/passwd username
785 * If you are afraid of automated attacks, enabling Captcha by
786   :config:option:`$cfg['CaptchaLoginPublicKey']` and
787   :config:option:`$cfg['CaptchaLoginPrivateKey']` might be an option.
789 Known issues
790 ++++++++++++
792 Users with column-specific privileges are unable to "Browse"
793 ------------------------------------------------------------
795 If a user has only column-specific privileges on some (but not all) columns in a table, "Browse"
796 will fail with an error message.
798 As a workaround, a bookmarked query with the same name as the table can be created, this will
799 run when using the "Browse" link instead. `Issue 11922 <https://github.com/phpmyadmin/phpmyadmin/issues/11922>`_.
801 Trouble logging back in after logging out using 'http' authentication
802 ----------------------------------------------------------------------
804 When using the 'http' ``auth_type``, it can be impossible to log back in (when the logout comes
805 manually or after a period of inactivity). `Issue 11898 <https://github.com/phpmyadmin/phpmyadmin/issues/11898>`_.