インストール

phpMyAdmin は MySQL データベースサーバに特別なセキュリティをほどこすものではありません。phpMyAdmin を使ったとしても、MySQL データベースに適切なパーミッションを付与するのは、やはりシステム管理者の仕事です。ただし、その目的で phpMyAdmin の ユーザアカウント ページを使うことはできます。

Linux ディストリビューション

phpMyAdmin は多くの Linux ディストリビューションに含まれています。できればディストリビューションのパッケージを使用することをお勧めします。そちらはふつう、ディストリビューションとの統合が提供され、ディストリビューションからのセキュリティ更新を自動的に受けることができるからです。

Debian と Ubuntu

Debian と Ubuntu のほとんどのバージョンは phpMyAdmin パッケージを含んでいますが、設定ファイルは /etc/phpmyadmin の中で管理されており、公式の phpMyAdmin のドキュメントといくつかの点で異なることがあります。特に、以下のような点です。

Debian または Ubuntu パッケージのインストールに関する詳細は Wiki 内 にあります。

参考

詳しい情報は README.Debian にあります (パッケージの /usr/share/doc/phpmyadmin/README.Debian としてインストールされます)。

OpenSUSE

OpenSUSE ではすでに phpMyAdmin パッケージがあり、 openSUSE Build Service からパッケージをインストールするだけです。

Gentoo

Gentoo は、ストックに近い設定と webapp-config 設定の両方で phpMyAdmin パッケージを提供しています。インストールするには emerge dev-db/phpmyadmin を使用してください。

Mandriva

Mandriva は phpMyAdmin パッケージを contrib ブランチで提供しており、通常の Control Center からインストールすることができます。

Fedora

Fedora は phpMyAdmin パッケージを提供していますが、設定ファイルは /etc/phpMyAdmin/ に保持されており、公式の phpMyAdmin ドキュメントとは異なる場合があることに注意してください。

Red Hat Enterprise Linux

Red Hat Enterprise Linux itself and thus derivatives like CentOS don't ship phpMyAdmin, but the Fedora-driven repository Extra Packages for Enterprise Linux (EPEL) is doing so, if it's enabled. But be aware that the configuration file is maintained in /etc/phpMyAdmin/ and may differ in some ways from the official phpMyAdmin documentation.

Windows へのインストール

phpMyAdmin を Windows 上で利用できるようにするもっとも簡単な方法は、 XAMPP のような phpMyAdmin とデータベース、ウェブサーバを一緒に含むサードパーティ製品をインストールすることです。

それ以外の同様の選択肢は Wikipedia を参照してください。

Git からのインストール

Git からインストールするためには、いくつかのサポートアプリケーションが必要になります。

  • Git <https://git-scm.com/downloads> _ でソースをダウンロードします。または最新のソースを Github <https://codeload.github.com/phpmyadmin/phpmyadmin/zip/master> _ から直接ダウンロードすることができます
  • Composer
  • Node.js (version 14 or higher)
  • Yarn

現在の phpMyAdmin のソースを https://github.com/phpmyadmin/phpmyadmin.git からクローンすることができます。

git clone https://github.com/phpmyadmin/phpmyadmin.git

加えて、 Composer を使用して依存するものをインストールする必要があります。

composer update

開発目的でなければ、次のように実行すると開発者ツールのインストールをスキップすることができます。

composer update --no-dev

最後に、 Yarn を使用して JavaScript の依存モジュールをいくつかインストールする必要があります。

yarn install --production

Composer を使用したインストール

phpMyAdmin は Composer tool を用いてインストールすることもでき、 4.7.0 からはデフォルトの Packagist リポジトリに自動的に反映されます。

注釈

Composer のリポジトリの内容は、リリースとは独立して自動的に生成されるため、必ずしもダウンロード版と 100% 同じとは限りません。しかし、機能的な違いはないでしょう。

phpMyAdmin をインストールするには、次のように実行するだけです。

composer create-project phpmyadmin/phpmyadmin

他にもリリース版を含む独自の Composer リポジトリを使用することもできます。 <https://www.phpmyadmin.net/packages.json> から利用することができます。

composer create-project phpmyadmin/phpmyadmin --repository-url=https://www.phpmyadmin.net/packages.json --no-dev

Docker を使用したインストール

phpMyAdmin には簡単に配布することができる Docker official image が付属しており、次のようにダウンロードすることができます。

docker pull phpmyadmin

phpMyAdmin サーバはポート80を待ち受けします。データベースサーバへのリンクを設定する方法は複数あり、データベースコンテナを phpMyAdmin の db にリンクするDockerのリンク機能を使用したり (--link your_db_host:db を指定)、環境変数で指定したりします (この場合、 phpMyAdmin コンテナがネットワーク経由でデータベースコンテナにアクセスできるように Docker でネットワークを設定する必要があります)。

Docker の環境変数

以下の環境変数を使用して phpMyAdmin のいくつかの機能を設定することができます。

PMA_ARBITRARY

ログインフォームでデータベースサーバのホスト名を入力できるようにします。

PMA_HOST

使用するデータベースサーバのホスト名と IP アドレスです。

PMA_HOSTS

カンマ区切りの使用するデータベースサーバのホスト名と IP アドレスです。

注釈

PMA_HOST が空の場合のみ使用されます。

PMA_VERBOSE

このデータベースサーバの詳細な名前です。

PMA_VERBOSES

カンマ区切りのデータベースサーバの詳細な名前です。

注釈

PMA_VERBOSE が空の場合のみ使用されます。

PMA_USER

config 認証モード で使用するユーザ名です。

PMA_PASSWORD

config 認証モード で使用するパスワードです。

PMA_PORT

使用するデータベースサーバのポート番号です。

PMA_PORTS

カンマ区切りで使用するデータベースサーバのポート番号です。

注釈

PMA_PORT が空の場合のみ使用されます。

PMA_SOCKET

Socket file for the database connection.

PMA_SOCKETS

Comma-separated list of socket files for the database connections.

注釈

Used only if PMA_SOCKET is empty.

PMA_ABSOLUTE_URI

phpMyAdmin を利用できるようにするリバースプロキシの完全修飾パス (https://pma.example.net/) です。

PMA_QUERYHISTORYDB

true に設定すると、 SQL 履歴が $cfg['Servers'][$i]['pmadb'] に保存できるようになります。 false の場合、履歴はブラウザに保存され、ログアウト時に消去されます。

PMA_QUERYHISTORYMAX

整数に設定すると、履歴項目の数を制御します。

PMA_CONTROLHOST

すると、 "phpMyAdmin 環境保管領域" データベースを格納するために使用される代替データベースホストを指します。

PMA_CONTROLUSER

phpMyAdmin が "phpMyAdmin 環境保管領域" データベースで使用するユーザ名を定義します。

PMA_CONTROLPASS

phpMyAdmin が "phpMyAdmin 環境保管領域" データベースで使用するためのパスワードを定義します。

PMA_CONTROLPORT

設定された場合、制御ホストに接続するための既定値 (3306) を上書きします。

PMA_PMADB

設定された場合、 "phpMyAdmin 環境保管領域" データベースで使用するデータベース名を定義します。設定しない場合、高度な機能はデフォルトで有効になりません。 ゼロ設定 機能でログインした場合には、ユーザが潜在的に有効化することができます。

注釈

推奨値: phpmyadmin または pmadb

HIDE_PHP_VERSION

定義すると、 PHP のバージョンを非表示にします (expose_php = Off)。任意の値を設定してください (HIDE_PHP_VERSION=true など)。

UPLOAD_LIMIT

設定されている場合、このオプションは apache および php-fpm のデフォルト値を上書きします (これにより、 upload_max_filesize および post_max_size の値が変更されます)。

注釈

[0-9+](K,M,G) という書式で、デフォルト値は`2048K` です

MEMORY_LIMIT

設定すると、phpMyAdmin のメモリ制限 $cfg['MemoryLimit'] と PHP の memory_limit を上書きするようになります。

注釈

書式は`[0-9+](K,M,G)` で、K はキロバイト、M はメガバイト、G はギガバイトを表し、 1K = 1024 バイトです。デフォルト値は 512M です。

MAX_EXECUTION_TIME

設定された場合、このオプションは phpMyAdmin の $cfg['ExecTimeLimit'] と PHP の max_execution_time の最大実行時間 (秒) を上書きすることになります。

注釈

書式は [0-9+] です。デフォルト値は`600` です。

PMA_CONFIG_BASE64

設定されている場合、このオプションは変数を base64 デコードした内容でデフォルトの config.inc.php を上書きします。

PMA_USER_CONFIG_BASE64

設定されている場合、このオプションは変数を base64 デコードした内容でデフォルトの config.user.inc.php を上書きします。

PMA_UPLOADDIR

設定された場合、このオプションは、インポートするためにファイルを保存できるパスを設定します ($cfg['UploadDir'])

PMA_SAVEDIR

設定された場合、このオプションはエクスポートされたファイルを保存するためのパスを設定します ($cfg['SaveDir'])

APACHE_PORT

このオプションを設定すると、権限のないポートのような別のポートで Apache を実行したい場合に、デフォルトの Apache のポートを 80 から変更することができます。任意のポート値 (例: APACHE_PORT=8090) を設定することができます。

デフォルトでは クッキー認証モード が使用されますが、 PMA_USERPMA_PASSWORD が設定された場合 config 認証モード に切り替わります。

注釈

ログインに必要な資格情報は MySQL サーバに保存されます。 Docker イメージの場合、さまざまな方法で設定できます (たとえば、 MySQL コンテナの起動時は MYSQL_ROOT_PASSWORD)。 MariaDB コンテナ または MySQL コンテナ のドキュメントを確認してください。

設定のカスタマイズ

さらに、設定は /etc/phpmyadmin/config.user.inc.php で調整できます。このファイルが存在する場合は、上記の環境変数から設定が生成された後に読み込まれるため、任意の設定変数を上書きできます。この設定は、 -v /some/local/directory/config.user.inc.php:/etc/phpmyadmin/config.user.inc.php 引数を使用して docker を呼び出すときにボリュームとして追加できます。

なお、提供された設定ファイルは Docker の環境変数 の後で適用されますが、任意の値を上書きできます。

例えば、 CSV エクスポートのデフォルトの動作を変更する場合は、以下の設定ファイルを使用してください。

<?php
$cfg['Export']['csv_columns'] = true;

Docker の環境変数 に書かれている環境変数を使用する代わりに、サーバ設定を定義することで利用することもできます。

<?php
/* Override Servers array */
$cfg['Servers'] = [
    1 => [
        'auth_type' => 'cookie',
        'host' => 'mydb1',
        'port' => 3306,
        'verbose' => 'Verbose name 1',
    ],
    2 => [
        'auth_type' => 'cookie',
        'host' => 'mydb2',
        'port' => 3306,
        'verbose' => 'Verbose name 2',
    ],
];

参考

設定オプションの詳細な説明は 設定 を参照してください。

Docker ボリューム

以下のボリュームを使用して、イメージの動作をカスタマイズすることができます。

/etc/phpmyadmin/config.user.inc.php

追加の設定に使用することができます。詳しくは前の節を参照してください。

/sessions/

セッションが保存されるディレクトリです。例えば サインオン認証モード を使用するときに共有したくなるかもしれません。

/www/themes/

phpMyAdmin がテーマを検索するディレクトリです。デフォルトでは、 phpMyAdmin に付属しているものだけが含まれていますが、 Docker ボリュームを利用して、追加の phpMyAdmin テーマ (カスタムテーマ を参照) を入れることができます。

Docker の例

phpMyAdmin を指定されたサーバに接続させるには、以下を使用してください。

docker run --name phpmyadmin -d -e PMA_HOST=dbhost -p 8080:80 phpmyadmin:latest

phpMyAdmin を他のサーバにも接続させるには、以下を使用してください。

docker run --name phpmyadmin -d -e PMA_HOSTS=dbhost1,dbhost2,dbhost3 -p 8080:80 phpmyadmin:latest

任意のサーバオプションを使用する場合です。

docker run --name phpmyadmin -d --link mysql_db_server:db -p 8080:80 -e PMA_ARBITRARY=1 phpmyadmin:latest

Docker を用いてデータベースコンテナをリンクすることもできます。

docker run --name phpmyadmin -d --link mysql_db_server:db -p 8080:80 phpmyadmin:latest

追加の設定で実行する方法です。

docker run --name phpmyadmin -d --link mysql_db_server:db -p 8080:80 -v /some/local/directory/config.user.inc.php:/etc/phpmyadmin/config.user.inc.php phpmyadmin:latest

追加のテーマで実行します。

docker run --name phpmyadmin -d --link mysql_db_server:db -p 8080:80 -v /some/local/directory/custom/phpmyadmin/themeName/:/var/www/html/themes/themeName/ phpmyadmin:latest

docker-compose の使用

または、 <https://github.com/phpmyadmin/docker> の docker-compose.yml で docker-compose を使用することもできます。これにより、 phpMyAdmin を任意のサーバで実行できます。ログインページで MySQL/MariaDB サーバを指定できます。

docker compose up -d

docker-compose を使用した設定ファイルのカスタマイズ

外部ファイルを使用して phpMyAdmin の設定をカスタマイズし、 volumes 設定項目を使用して渡すことができます。

phpmyadmin:
    image: phpmyadmin:latest
    container_name: phpmyadmin
    environment:
     - PMA_ARBITRARY=1
    restart: always
    ports:
     - 8080:80
    volumes:
     - /sessions
     - ~/docker/phpmyadmin/config.user.inc.php:/etc/phpmyadmin/config.user.inc.php
     - /custom/phpmyadmin/theme/:/www/themes/theme/

サブディレクトリの haproxy の背後で実行

サブディレクトリの Docker コンテナで実行されている phpMyAdmin を公開する場合は、リクエストを中継するサーバのリクエストパスを書き換える必要があります。

たとえば、 haproxy を使用すると、次のように実行できます。

frontend http
    bind *:80
    option forwardfor
    option http-server-close

    ### NETWORK restriction
    acl LOCALNET  src 10.0.0.0/8 192.168.0.0/16 172.16.0.0/12

    # /phpmyadmin
    acl phpmyadmin  path_dir /phpmyadmin
    use_backend phpmyadmin if phpmyadmin LOCALNET

backend phpmyadmin
    mode http

    reqirep  ^(GET|POST|HEAD)\ /phpmyadmin/(.*)     \1\ /\2

    # phpMyAdmin container IP
    server localhost     172.30.21.21:80

traefik を使用する場合、次のようなものが機能するはずです。

defaultEntryPoints = ["http"]
[entryPoints]
  [entryPoints.http]
  address = ":80"
    [entryPoints.http.redirect]
      regex = "(http:\\/\\/[^\\/]+\\/([^\\?\\.]+)[^\\/])$"
      replacement = "$1/"

[backends]
  [backends.myadmin]
    [backends.myadmin.servers.myadmin]
    url="http://internal.address.to.pma"

[frontends]
   [frontends.myadmin]
   backend = "myadmin"
   passHostHeader = true
     [frontends.myadmin.routes.default]
     rule="PathPrefixStrip:/phpmyadmin/;AddPrefix:/"

次に、 docker-compose の設定で PMA_ABSOLUTE_URI を指定してください。

version: '2'

services:
  phpmyadmin:
    restart: always
    image: phpmyadmin:latest
    container_name: phpmyadmin
    hostname: phpmyadmin
    domainname: example.com
    ports:
      - 8000:80
    environment:
      - PMA_HOSTS=172.26.36.7,172.26.36.8,172.26.36.9,172.26.36.10
      - PMA_VERBOSES=production-db1,production-db2,dev-db1,dev-db2
      - PMA_USER=root
      - PMA_PASSWORD=
      - PMA_ABSOLUTE_URI=http://example.com/phpmyadmin/

IBM クラウド

ユーザの1人が、 phpMyAdmin を IBM Cloud プラットフォーム にインストールするための役立つガイドを作成してくれました。

クイックインストール

  1. Choose an appropriate distribution kit from the phpmyadmin.net Downloads page. Some kits contain only the English messages, others contain all languages. We'll assume you chose a kit whose name looks like phpMyAdmin-x.x.x-all-languages.tar.gz.
  2. 正しいアーカイブをダウンロードしたことを確認してください。 phpMyAdmin リリースの検証 を参照してください。
  3. tar または zip の配布ファイルを展開します (unzip の場合はサブディレクトリ付きで)。ウェブサーバのドキュメントルートで tar -xzvf phpMyAdmin_x.x.x-all-languages.tar.gz を実行します。ドキュメントルートへの直接アクセス権がない場合は、ローカルマシンのディレクトリにファイルを解凍し、ステップ 4 まで済んだらそのディレクトリを FTP などでウェブサーバに転送してください。
  4. 必ずすべてのスクリプトの所有者を適切に設定してください (PHP がセーフモードで実行されている場合、スクリプトによって所有者が異なると問題が発生します)。解説については 4.2 phpMyAdmin を悪意のあるアクセスから守るようにするお勧めの方法はありますか?1.26 phpMyAdmin を IIS のドキュメントルートにインストールしたところなのですが、phpMyAdmin を実行しようとすると「No input file specified(入力ファイルが指定されていません)」というエラーが出ます。 を参照してください。
  5. まず最初に、インストールを設定する必要があります。やり方は 2 つあります。1 つは、ユーザが config.inc.php を手動で編集・コピーする伝統的な方法ですが、グラフィカルなインストールを好む人向けにウィザード形式のセットアップスクリプトも提供するようになりました。現在でも config.inc.php を作成する方がすばやく始められる方法であり、一部の高度な機能にはこちらが必要です。

手作業でのファイルの作成

手作業でファイルを作成するには、テキストエディタを使用して config.inc.php ファイルを phpMyAdmin のメイン (トップレベル) ディレクトリ (index.php があるところ) に作成するだけです (その際、 config.sample.inc.php をコピーすることで最小限の設定ファイルを作成することもできます)。最初に phpMyAdmin はデフォルトの設定値をを読み込み、それから config.inc.php 内で見つかった値でデフォルト値を上書きします。設定に問題がなければ、デフォルト値は config.inc.php に含める必要はありません。稼動させるにはいくつかの設定項目が必要ですが、単純な設定では以下にようになります。

<?php
// The string is a hexadecimal representation of a 32-bytes long string of random bytes.
$cfg['blowfish_secret'] = sodium_hex2bin('f16ce59f45714194371b48fe362072dc3b019da7861558cd4ad29e4d6fb13851');

$i=0;
$i++;
$cfg['Servers'][$i]['auth_type']     = 'cookie';
// if you insist on "root" having no password:
// $cfg['Servers'][$i]['AllowNoPassword'] = true;

あるいは、ログインするたびにプロンプトを表示させたくないのであれば以下のようにします。

<?php

$i=0;
$i++;
$cfg['Servers'][$i]['user']          = 'root';
$cfg['Servers'][$i]['password']      = 'changeme'; // use here your password
$cfg['Servers'][$i]['auth_type']     = 'config';

警告

設定にパスワードを保存すると、誰でもデータベースを操作できるようになるため安全ではありません。

使用可能な設定値の詳細な解説については、このドキュメントの 設定 を参照してください。

セットアップスクリプトの使用

config.inc.php を手動で編集する代わりに、 phpMyAdmin のセットアップ機能を使用することができます。セットアップを使用してファイルを生成し、サーバにアップロードするためにダウンロードすることができます。

次にブラウザを開き、 phpMyAdmin をインストールした場所の最後に /setup を付けてアクセスします。変更はサーバに保存されません。 ダウンロード ボタンを使用して変更をコンピュータに保存してから、サーバにアップロードする必要があります。

これで、ファイルを使用する準備ができました。セットアップスクリプトが提供していない一部の高度なオプションを設定したい場合は、好きなエディタでファイルを確認したり編集したりすることを選択できます。

  1. auth_type に ”config" を使用した場合は、phpMyAdmin をインストールしたディレクトリを保護することをお勧めします。なぜなら、config 認証を使用した場合、インストールされた phpMyAdmin にアクセスするのに、ユーザがパスワードの入力を必要としないからです。 .htaccess ファイルで HTTP 認証を設定したり、 auth_type を cookie または http で使用するなど、その他の認証方法の使うことをお勧めします。詳細については ISP やマルチユーザのインストール 、特に 4.4 HTTP 認証を使用すると必ず「Access denied (アクセスは拒否されました)」になります。 を参照してください。
  2. ブラウザで phpMyAdmin のメインディレクトリを開きます。 HTTP 認証やクッキー認証モードを使用している場合、 phpMyAdmin はようこそ画面とデータベース、またはログインダイアログが表示されるようになりました。

Debian、Ubuntu とその派生製品のセットアップスクリプト

Debian と Ubuntu では、セットアップスクリプトを有効にしたり無効にしたりする方法が変更されました。これにより、それぞれのために単一のコマンドを実行する必要があります。

設定を編集できるようにするには、次のように呼び出してください。

/usr/sbin/pma-configure

設定の編集を防止するには、次のように呼び出してください。

/usr/sbin/pma-secure

openSUSE のセットアップスクリプト

openSUSE の一部のリリースでは、パッケージにセットアップスクリプトが含まれていません。そのような環境の場合は、 <https://www.phpmyadmin.net/> から元のパッケージをダウンロードしたり、デモサーバ <https://demo.phpmyadmin.net/master/setup/> のセットアップスクリプトを使用したりすることで、設定を作成することができます。

phpMyAdmin リリースの検証

2015年7月以降、すべての phpMyAdmin のリリースはリリース開発者によって暗号で署名されており、2016年1月までは Marc Delisle でした。彼のキーIDは 0xFEFC65D181AF644A であり、彼の PGP フィンガープリントは次のとおりです。

436F F188 4B1A 0C3F DCBF 0D79 FEFC 65D1 81AF 644A

また、他の識別情報は <https://keybase.io/lem9> から入手できます。

2016年1月から、リリース管理者は Isaac Bennetch です。彼のキー ID は 0xCE752F178259BD92 であり、 PGP フィンガープリントは次の通りです。

3D06 A59E CE73 0EB7 1B51 1C17 CE75 2F17 8259 BD92

また、他の識別情報は <https://keybase.io/ibennetch> から入手できます。

その他のいくつかのダウンロード (例えばテーマ) は、 Michal Čihař が署名していることがあります。彼のキー ID は 0x9C27B31342B7511D で、 PGP フィンガープリントは次の通りです。

63CB 1DF1 EF12 CF2A C0EE 5A32 9C27 B313 42B7 511D

また、他の識別情報は <https://keybase.io/nijel> から入手できます。

署名がダウンロードしたアーカイブと一致することを確認してください。この方法で、リリースされたものと同じコードを使用していることを確認できます。また、署名の日付を確認して、最新バージョンをダウンロードしたことを確認してください。

各アーカイブには、その PGP 署名を含む .asc ファイルが付属しています。両方を同じフォルダに入れれば、署名を検証することができます。

$ gpg --verify phpMyAdmin-4.5.4.1-all-languages.zip.asc
gpg: Signature made Fri 29 Jan 2016 08:59:37 AM EST using RSA key ID 8259BD92
gpg: Can't check signature: public key not found

ご覧のとおり、 gpg は公開鍵を知らないと報告します。この時点で、次のいずれかの手順を実行する必要があります。

  • ダウンロードサーバ からキーリングをダウンロードし、次のようにしてインポートしてください。
$ gpg --import phpmyadmin.keyring
  • 鍵サーバのうちの 1 つから鍵をダウンロードしてインポートしてください。
$ gpg --keyserver hkp://pgp.mit.edu --recv-keys 3D06A59ECE730EB71B511C17CE752F178259BD92
gpg: requesting key 8259BD92 from hkp server pgp.mit.edu
gpg: key 8259BD92: public key "Isaac Bennetch <bennetch@gmail.com>" imported
gpg: no ultimately trusted keys found
gpg: Total number processed: 1
gpg:               imported: 1  (RSA: 1)

これにより、状況が少し改善されます。この時点で、指定された鍵の署名が正しいことを確認できますが、鍵で使用されている名前を信頼することはできません。

$ gpg --verify phpMyAdmin-4.5.4.1-all-languages.zip.asc
gpg: Signature made Fri 29 Jan 2016 08:59:37 AM EST using RSA key ID 8259BD92
gpg: Good signature from "Isaac Bennetch <bennetch@gmail.com>"
gpg:                 aka "Isaac Bennetch <isaac@bennetch.org>"
gpg: WARNING: This key is not certified with a trusted signature!
gpg:          There is no indication that the signature belongs to the owner.
Primary key fingerprint: 3D06 A59E CE73 0EB7 1B51  1C17 CE75 2F17 8259 BD92

ここでの問題は、誰でもこの名前の鍵を発行できることです。実際に言及された人が鍵を所有していることを確認する必要があります。 GNU プライバシーハンドブックは、 Validating other keys on your public keyring の章でこのトピックを扱っています。最も信頼できる方法は、開発者に直接会ってキーフィンガープリントを交換することですが、信頼できるウェブに頼ることもできます。このようにして、開発者に直接会った他の人の署名を介して、キーを推移的に信頼することができます。

キーが信頼されると、警告は発生しません。

$ gpg --verify phpMyAdmin-4.5.4.1-all-languages.zip.asc
gpg: Signature made Fri 29 Jan 2016 08:59:37 AM EST using RSA key ID 8259BD92
gpg: Good signature from "Isaac Bennetch <bennetch@gmail.com>" [full]

署名が無効な場合 (アーカイブが変更されている場合)、鍵が信頼されているかどうかに関係なく、明確なエラーが発生します。

$ gpg --verify phpMyAdmin-4.5.4.1-all-languages.zip.asc
gpg: Signature made Fri 29 Jan 2016 08:59:37 AM EST using RSA key ID 8259BD92
gpg: BAD signature from "Isaac Bennetch <bennetch@gmail.com>" [unknown]

phpMyAdmin 環境保管領域

バージョン 3.4.0 で変更: phpMyAdmin 3.4.0 より前は、これはリンクテーブル基盤と呼ばれていましたが、ストレージの用途が拡大されたため、名前が変更されました。

一連の追加機能 (ブックマーク、コメント、 SQL の履歴、コマンド追跡機能、 PDF 生成、 変換機能リレーション など) を使うには専用のテーブル群を作成する必要があります。これらのテーブル群は自分のデータベースに格納することもできますし、マルチユーザのインストールの場合はセントラルデータベースに格納することもできます (このセントラルデータベースは制御ユーザがアクセスするものです。ほかのユーザに権限を持たせないでください)。

ゼロ設定

In many cases, this database structure can be automatically created and configured. This is called “Zero Configuration” mode and can be particularly useful in shared hosting situations. “ZeroConf” mode is on by default, to disable set $cfg['ZeroConf'] to false.

ゼロ設定モードは、以下の3種類のシナリオに対応しています。

  • 環境保管領域のテーブルが存在しないデータベースに入ると、 phpMyAdmin は [操作] タブから作成することを提案します。
  • テーブルがすでに存在するデータベースに入ると、ソフトウェアはこれを自動的に検出して使用し始めます。これは最も一般的な状況です。テーブルが最初に自動的に作成された後、ユーザを邪魔することなく継続的に使用されます。これは、共有ホスティングでユーザが config.inc.php を編集できず、通常、ユーザが1つのデータベースにしかアクセスしない場面で最も有用です。
  • 複数のデータベースにアクセスする場合、ユーザが先に環境保管領域のテーブルを含むデータベースに入ってから、別のデータベースに切り替えた場合、 phpMyAdmin は最初のデータベースのテーブルを使用し続けます。ユーザに対して、新しいデータベースにさらにテーブルを作成するよう求めることはありません。

手作業での設定

./sql/ ディレクトリを確認してください。 create_tables.sql というファイルがあるはずです (Windows サーバを使用している場合は、 1.23 MySQL を Win32 マシンで稼動させているのですが、新規テーブルを作成するたびにテーブル名とカラム名が小文字に変わってしまいます! を注意深く読んでください)。

すでにこの仕組みを使用している場合は、次のことを実行してください。

  • MySQL 4.1.2 以降にアップグレードする場合は、 sql/upgrade_tables_mysql_4_1_2+.sql を使用してください。
  • phpMyAdmin 2.5.0 以降 (4.2.x 以前) から 4.3.0 以降にアップグレードした場合は、 sql/upgrade_column_info_4_3_0+.sql を使用してください。
  • phpMyAdmin 4.3.0 以降から 4.7.0 以降にアップグレードした場合は、 sql/upgrade_tables_4_7_0+.sql を使用してください。

それから sql/create_tables.sql をインポートして新しいテーブルを作成してください。

phpMyAdmin を使ってテーブル群を作成することもできますが、いくつか注意することがあります。データベースやテーブルを作成する際には特別な (管理者の) 権限が必要になるかもしれません。また、データベース名によってはスクリプトに多少の修正を加える必要があるかもしれません。

sql/create_tables.sql ファイルをインポートしたら、 config.inc.php ファイルでテーブル名を指定してください。このとき使う設定項目の説明は 設定 にあります。

これらのテーブルに対して正しい権限を持った制御ユーザ ($cfg['Servers'][$i]['controluser'] および $cfg['Servers'][$i]['controlpass'] 設定) が必要です。例えば、以下の文を使用して作成することができます。

MariaDB の任意のバージョンの場合:

CREATE USER 'pma'@'localhost' IDENTIFIED VIA mysql_native_password USING 'pmapass';
GRANT SELECT, INSERT, UPDATE, DELETE ON `<pma_db>`.* TO 'pma'@'localhost';

MySQL 8.0 以降の場合:

CREATE USER 'pma'@'localhost' IDENTIFIED WITH caching_sha2_password BY 'pmapass';
GRANT SELECT, INSERT, UPDATE, DELETE ON <pma_db>.* TO 'pma'@'localhost';

MySQL 8.0 以前の場合:

CREATE USER 'pma'@'localhost' IDENTIFIED WITH mysql_native_password AS 'pmapass';
GRANT SELECT, INSERT, UPDATE, DELETE ON <pma_db>.* TO 'pma'@'localhost';

なお、 PHP 7.4 より前と MySQL 8.0 より後の MySQL インストールでは、応急措置として mysql_native_password 認証を使用する必要があるかもしれません。詳しくは 1.45 ログインしようとすると、 caching_sha2_password が不明な認証方法であることに関するエラーメッセージが表示されます を参照してください。

旧版からのアップグレード

警告

絶対に インストール済みの phpMyAdmin の上に新しいバージョンを展開しないでください。必ず先に古いファイルを削除し、設定のみを保持するようにしてください。

このようにして、セキュリティに深刻な影響を及ぼしたり、さまざまな破損を引き起こしたりする可能性がある古いファイルをディレクトリに残さないようにします。

以前インストールされたものから config.inc.php を新しく展開した先にコピーするだけです。古いバージョンにあった設定ファイルは、一部のオプションを変更したり削除したりする若干の調整が必要な場合があります。設定ファイルの末尾付近に set_magic_quotes_runtime(0); 文が見つかった場合は、 PHP 5.3 以降との互換性のために削除してください。

いくつかの単純な手順で完全なアップグレードを行うことができます。

  1. 最新版の phpMyAdmin を <https://www.phpmyadmin.net/downloads/> からダウンロードしてください。
  2. 既存の phpMyAdmin のフォルダの名前を変更します (例えば phpmyadmin-old などへ)。
  3. 新しくダウンロードした phpMyAdmin を必要な場所 (例えば phpmyadmin) に展開してください。
  4. config.inc.php を古い場所 (phpmyadmin-old) から新しい場所 (phpmyadmin) へコピーします。
  5. すべてが正しく動作することをテストします。
  6. 以前のバージョンのバックアップ (phpmyadmin-old) を削除します。

MySQL サーバをバージョン 4.1.2 以前から 5.x 以降へアップグレードして、かつ、 phpMyAdmin 環境保管領域を使用している場合、 sql/upgrade_tables_mysql_4_1_2+.sql にある SQL スクリプトを実行する必要があります。

phpMyAdmin 2.5.0 以降 (4.2.x 以前) を 4.3.0 以降にアップグレードした場合で、 phpMyAdmin 環境保管領域を使用している場合は、 sql/upgrade_column_info_4_3_0+.sql にある SQL スクリプトを実行してください。

ブラウザのキャッシュをクリアすることと、ログアウトして古いセッションを空にし、ログインし直すことを忘れないでください。

認証モードの使い方

HTTP 認証モードとクッキー認証モードは、ユーザに自分のデータベースへのアクセスを許可し、他のデータベースにアクセスしてほしくない マルチユーザ環境 にお勧めです。それでも、 MS Internet Explorer の少なくともバージョン 6 までは、クッキーについて実にバグが多いことに注意してください。 シングルユーザ環境 でも、ユーザ名とパスワードのが設定ファイルで明らかにならないので、 HTTP 認証モードやクッキー認証モードを使用することをお勧めします。

HTTP 認証モードやクッキー認証モードの方がより安全です。 MySQL のログイン情報を phpMyAdmin の設定ファイルに書く必要がないからです ($cfg['Servers'][$i]['controluser'])。しかし、 HTTPS プロトコルを使用しない限り、パスワードはプレーンテキストで送信されることに気を付けてください。クッキーモードでは、パスワードは一時的なクッキーに AES アルゴリズムで暗号化した上で保存されます。

それから、それぞれの 本当の ユーザには、特定のデータベースのセットに対する一連の権限を与えなければなりません。通常、権限の影響を理解しているユーザでない限り(例えばスーパーユーザを作成している場合など)、通常のユーザにグローバル権限を与えるべきではありません。例えば、 real_user にデータベース user_base 上のすべての権限を付与するには、以下のようにしてください。

GRANT ALL PRIVILEGES ON user_base.* TO 'real_user'@localhost IDENTIFIED BY 'real_password';

ユーザが実行できることは、完全に MySQL のユーザ管理システムによって制御されます。 HTTP またはクッキー認証モードでは、 $cfg['Servers'] のユーザ/パスワードフィールドに記入する必要はありません。

HTTP 認証モード

注釈

HTTP 認証で適切なログアウトを行う方法はありません。ほとんどのブラウザでは、他の認証が成功しない限り、資格情報を保持します。このため、この方法ではログアウト後に同じユーザでログインできないという制限があります。

サインオン認証モード

資格情報をセッションに保存するとても基本的な例が examples/signon.php にあります。

<?php
/**
 * Single signon for phpMyAdmin
 *
 * This is just example how to use session based single signon with
 * phpMyAdmin, it is not intended to be perfect code and look, only
 * shows how you can integrate this functionality in your application.
 */

declare(strict_types=1);

/* Use cookies for session */
ini_set('session.use_cookies', 'true');
/* Change this to true if using phpMyAdmin over https */
$secureCookie = false;
/* Need to have cookie visible from parent directory */
session_set_cookie_params(0, '/', '', $secureCookie, true);
/* Create signon session */
$sessionName = 'SignonSession';
session_name($sessionName);
// Uncomment and change the following line to match your $cfg['SessionSavePath']
//session_save_path('/foobar');
@session_start();

/* Was data posted? */
if (isset($_POST['user'])) {
    /* Store there credentials */
    $_SESSION['PMA_single_signon_user'] = $_POST['user'];
    $_SESSION['PMA_single_signon_password'] = $_POST['password'];
    $_SESSION['PMA_single_signon_host'] = $_POST['host'];
    $_SESSION['PMA_single_signon_port'] = $_POST['port'];
    /* Update another field of server configuration */
    $_SESSION['PMA_single_signon_cfgupdate'] = ['verbose' => 'Signon test'];
    $_SESSION['PMA_single_signon_HMAC_secret'] = hash('sha1', uniqid(strval(random_int(0, mt_getrandmax())), true));
    $id = session_id();
    /* Close that session */
    @session_write_close();
    /* Redirect to phpMyAdmin (should use absolute URL here!) */
    header('Location: ../index.php');
} else {
    /* Show simple form */
    header('Content-Type: text/html; charset=utf-8');

    echo '<?xml version="1.0" encoding="utf-8"?>' . "\n";
    echo '<!DOCTYPE HTML>
<html lang="en" dir="ltr">
<head>
<link rel="icon" href="../favicon.ico" type="image/x-icon">
<link rel="shortcut icon" href="../favicon.ico" type="image/x-icon">
<meta charset="utf-8">
<title>phpMyAdmin single signon example</title>
</head>
<body>';

    if (isset($_SESSION['PMA_single_signon_error_message'])) {
        echo '<p class="error">';
        echo $_SESSION['PMA_single_signon_error_message'];
        echo '</p>';
    }

    echo '<form action="signon.php" method="post">
Username: <input type="text" name="user" autocomplete="username" spellcheck="false"><br>
Password: <input type="password" name="password" autocomplete="current-password" spellcheck="false"><br>
Host: (will use the one from config.inc.php by default)
<input type="text" name="host"><br>
Port: (will use the one from config.inc.php by default)
<input type="text" name="port"><br>
<input type="submit">
</form>
</body>
</html>';
}

または、 examples/openid.php にあるように、この方法を使用して OpenID と統合することもできます。

<?php
/**
 * Single signon for phpMyAdmin using OpenID
 *
 * This is just example how to use single signon with phpMyAdmin, it is
 * not intended to be perfect code and look, only shows how you can
 * integrate this functionality in your application.
 *
 * It uses OpenID pear package, see https://pear.php.net/package/OpenID
 *
 * User first authenticates using OpenID and based on content of $AUTH_MAP
 * the login information is passed to phpMyAdmin in session data.
 */

declare(strict_types=1);

if (false === @include_once 'OpenID/RelyingParty.php') {
    exit;
}

/* Change this to true if using phpMyAdmin over https */
$secureCookie = false;

/**
 * Map of authenticated users to MySQL user/password pairs.
 */
$authMap = ['https://launchpad.net/~username' => ['user' => 'root', 'password' => '']];

// phpcs:disable PSR1.Files.SideEffects,Squiz.Functions.GlobalFunction

/**
 * Simple function to show HTML page with given content.
 *
 * @param string $contents Content to include in page
 */
function Show_page(string $contents): void
{
    header('Content-Type: text/html; charset=utf-8');

    echo '<?xml version="1.0" encoding="utf-8"?>' . "\n";
    echo '<!DOCTYPE HTML>
<html lang="en" dir="ltr">
<head>
<link rel="icon" href="../favicon.ico" type="image/x-icon">
<link rel="shortcut icon" href="../favicon.ico" type="image/x-icon">
<meta charset="utf-8">
<title>phpMyAdmin OpenID signon example</title>
</head>
<body>';

    if (isset($_SESSION['PMA_single_signon_error_message'])) {
        echo '<p class="error">' . $_SESSION['PMA_single_signon_message'] . '</p>';
        unset($_SESSION['PMA_single_signon_message']);
    }

    echo $contents;
    echo '</body></html>';
}

/**
 * Display error and exit
 *
 * @param Exception $e Exception object
 */
function Die_error(Throwable $e): void
{
    $contents = "<div class='relyingparty_results'>\n";
    $contents .= '<pre>' . htmlspecialchars($e->getMessage()) . "</pre>\n";
    $contents .= "</div class='relyingparty_results'>";
    Show_page($contents);
    exit;
}

// phpcs:enable

/* Need to have cookie visible from parent directory */
session_set_cookie_params(0, '/', '', $secureCookie, true);
/* Create signon session */
$sessionName = 'SignonSession';
session_name($sessionName);
@session_start();

// Determine realm and return_to
$base = 'http';
if (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on') {
    $base .= 's';
}

$base .= '://' . $_SERVER['SERVER_NAME'] . ':' . $_SERVER['SERVER_PORT'];

$realm = $base . '/';
$returnTo = $base . dirname($_SERVER['PHP_SELF']);
if ($returnTo[strlen($returnTo) - 1] !== '/') {
    $returnTo .= '/';
}

$returnTo .= 'openid.php';

/* Display form */
if ((! count($_GET) && ! count($_POST)) || isset($_GET['phpMyAdmin'])) {
    /* Show simple form */
    $content = '<form action="openid.php" method="post">
OpenID: <input type="text" name="identifier"><br>
<input type="submit" name="start">
</form>';
    Show_page($content);
    exit;
}

/* Grab identifier */
$identifier = null;
if (isset($_POST['identifier']) && is_string($_POST['identifier'])) {
    $identifier = $_POST['identifier'];
} elseif (isset($_SESSION['identifier']) && is_string($_SESSION['identifier'])) {
    $identifier = $_SESSION['identifier'];
}

/* Create OpenID object */
try {
    $o = new OpenID_RelyingParty($returnTo, $realm, $identifier);
} catch (Throwable $e) {
    Die_error($e);
}

/* Redirect to OpenID provider */
if (isset($_POST['start'])) {
    try {
        $authRequest = $o->prepare();
    } catch (Throwable $e) {
        Die_error($e);
    }

    $url = $authRequest->getAuthorizeURL();

    header('Location: ' . $url);
    exit;
}

/* Grab query string */
if (! count($_POST)) {
    [, $queryString] = explode('?', $_SERVER['REQUEST_URI']);
} else {
    // Fetch the raw query body
    $queryString = file_get_contents('php://input');
}

/* Check reply */
try {
    $message = new OpenID_Message($queryString, OpenID_Message::FORMAT_HTTP);
} catch (Throwable $e) {
    Die_error($e);
}

$id = $message->get('openid.claimed_id');

if (empty($id) || ! isset($authMap[$id])) {
    Show_page('<p>User not allowed!</p>');
    exit;
}

$_SESSION['PMA_single_signon_user'] = $authMap[$id]['user'];
$_SESSION['PMA_single_signon_password'] = $authMap[$id]['password'];
$_SESSION['PMA_single_signon_HMAC_secret'] = hash('sha1', uniqid(strval(random_int(0, mt_getrandmax())), true));
session_write_close();
/* Redirect to phpMyAdmin (should use absolute URL here!) */
header('Location: ../index.php');

他の方法で認証情報を渡す場合は、 PHP にラッパーを実装してデータを取得し、 $cfg['Servers'][$i]['SignonScript'] に設定しなければなりません。 examples/signon-script.php に非常にシンプルな例があります。

<?php
/**
 * Single signon for phpMyAdmin
 *
 * This is just example how to use script based single signon with
 * phpMyAdmin, it is not intended to be perfect code and look, only
 * shows how you can integrate this functionality in your application.
 */

declare(strict_types=1);

// phpcs:disable Squiz.Functions.GlobalFunction

/**
 * This function returns username and password.
 *
 * It can optionally use configured username as parameter.
 *
 * @param string $user User name
 *
 * @return array<int,string>
 */
function get_login_credentials(string $user): array
{
    /* Optionally we can use passed username */
    if (! empty($user)) {
        return [$user, 'password'];
    }

    /* Here we would retrieve the credentials */
    return ['root', ''];
}

config 認証モード

  • このモードはあまり安全ではありません。設定項目の $cfg['Servers'][$i]['user']$cfg['Servers'][$i]['password'] を記入する必要があるからです (そのため、 config.inc.php を読める人なら誰でもユーザ名とパスワードを見ることができてしまいます)。
  • ISP やマルチユーザのインストール 節の中で、構成ファイルを保護する方法を説明している項目があります。
  • このモードのセキュリティを向上させるには、 $cfg['Servers'][$i]['AllowDeny']['order']$cfg['Servers'][$i]['AllowDeny']['rules'] の設定項目でホスト認証することを検討してみてください。
  • クッキー認証や HTTP 認証とは異なり、最初に phpMyAdmin サイトを読み込んだときに、ユーザがログインする必要がありません。これは仕様によるものですが、インストール先へのアクセスをどのユーザにも許可しているということです。いくつかの制約をかけることを推奨します。 .htaccess ファイルで HTTP 認証を設定したり、ルータやファイアウォールで入ってくる HTTP リクエストを拒否したりすればおそらく十分でしょう (どちらもこのマニュアルの範疇を超えていますが、Google で容易に検索できます)。

phpMyAdmin のインストールを安全にする

phpMyAdmin チームは、アプリケーションを安全にするために一生懸命努力していますが、インストールをより安全にする方法は常にあります。

  • 私たちの セキュリティアナウンス をフォローし、新しい脆弱性が公開されるたびに phpMyAdmin をアップグレードしてください。

  • phpMyAdmin を HTTPS のみで提供してください。できれば、プロトコルのダウングレード攻撃から保護するために、 HSTS も使用してください。

  • PHP の設定が本番サイトの推奨事項に従っていることを確認してください。たとえば、 display_errors を無効にしてください。

  • 開発中でテストスイートが必要な場合を除いて、 phpMyAdmin から test ディレクトリを削除してください。

  • phpMyAdmin から setup ディレクトリを削除してください。おそらく初期セットアップの後は使用しないでしょう。

  • 認証方法を適切に選択してください。 - 共有ホスティングにはおそらく クッキー認証モード が最良の選択でしょう。

  • ウェブサーバの設定で、サブフォルダ ./libraries/ または ./templates/ にある外部ファイルへのアクセスを拒否してください。このような設定により、そのコードで発生する可能性のあるパスの公開やクロスサイトスクリプティングの脆弱性を防ぐことができます。 Apache ウェブサーバでは、多くの場合、これらのディレクトリにある .htaccess ファイルで設定します。

  • 一時ファイルへのアクセスを拒否するようにしてください。 $cfg['TempDir'] を参照してください (ウェブルート内に配置されている場合は、「ウェブサーバのアップロード/保存/インポートディレクトリ」も参照してください)。

  • 一般的に、公開している phpMyAdmin のインストールをロボットからのアクセスから保護することは良い考えです。ウェブサーバのルートにある robots.txt ファイルを使用して行ったり、ウェブサーバの構成でアクセスを制限したりすることで実現できます。 1.42 ロボットから phpMyAdmin へのアクセスを防ぐにはどうすればいいのでしょうか? を参照してください。

  • すべての MySQL ユーザが phpMyAdmin にアクセスできるようにしたくない場合は、 $cfg['Servers'][$i]['AllowDeny']['rules'] を使用して制限したり、 $cfg['Servers'][$i]['AllowRoot'] を使用して root ユーザのアクセスを拒否したりすることができます。

  • アカウントで 二要素認証 を有効にしてください。

  • phpMyAdmin を認証プロキシの背後に隠すことを検討してください。そうすればユーザが phpMyAdmin に MySQL の資格情報を入力する前に認証を受けるようになります。これは、ウェブサーバに HTTP 認証を要求するように構成することで実現できます。例えば Apache では、次のようにして実現できます。

    AuthType Basic
    AuthName "Restricted Access"
    AuthUserFile /usr/share/phpmyadmin/passwd
    Require valid-user
    

    構成を変更したら、認証するユーザの一覧を作成する必要があります。これは htpasswd ユーティリティを使用して行うことができます。

    htpasswd -c /usr/share/phpmyadmin/passwd username
    
  • 自動攻撃を恐れているのであれば、 $cfg['CaptchaLoginPublicKey']$cfg['CaptchaLoginPrivateKey'] で Captcha を有効にするのも選択肢の一つです。

  • 失敗したログインの試みは syslog に記録されます (利用可能な場合は、 $cfg['AuthLog'] を参照してください)。これにより、 fail2ban などのツールを使用して総当たり攻撃をブロックできます。 syslog が使用するログファイルは、 Apache のエラーログやアクセスログファイルと同じではないことに注意してください。

  • phpMyAdmin を他の PHP アプリケーションと一緒に実行している場合は、 phpMyAdmin に対して個別のセッションストレージを使用して、セッションベースの攻撃を回避することをお勧めします。これを実現するには、 $cfg['SessionSavePath'] が使用できます。

データベースサーバへの接続で SSL を使用する

リモートデータベースサーバに接続するときは SSL を使用することをお勧めします。 SSL のセットアップに関連するいくつかの設定オプションがあります。

$cfg['Servers'][$i]['ssl']
SSLを使用するかどうかを定義します。これのみを有効にすると、接続は暗号化されますが、接続の認証は行われません。適切なサーバと通信していることを確認することはできません。
$cfg['Servers'][$i]['ssl_key']$cfg['Servers'][$i]['ssl_cert']
これはクライアントからサーバの認証に使用されます。
$cfg['Servers'][$i]['ssl_ca']$cfg['Servers'][$i]['ssl_ca_path']
サーバ証明書で信頼する認証局です。これは、信頼できるサーバと通信していることを確認するために使用されます。
$cfg['Servers'][$i]['ssl_verify']
この構成はサーバ証明書の検証を無効にします。注意して使用してください。

データベースサーバがローカル接続やプライベートネットワークを使用していて SSL が構成できない場合は、 $cfg['MysqlSslWarningSafeHosts'] に安全と見なすホスト名を明示的に並べることができます。

既知の問題

カラム固有の権限を持ったユーザが [表示] を利用できない

ユーザがテーブルの一部の (すべてではない) カラムに特有の権限しか持っていない場合、 [表示] は失敗してエラーメッセージを表示します。

回避策として、テーブルと同じ名前のブックマーククエリを作成することができ、そうすれば [表示] リンクを使用したときに代わりに実行されます。 課題 11922

'http' 認証を使用してログアウトした後、再度ログインする際の問題

'http' auth_type を使用している場合、(ログアウトが手動で行われたとき、または一定時間非アクティブになった後で) 再度のログインができない場合があります。 課題 11898