このチュートリアルの以前のバージョンは、Brennan Bearnesによって作成されました。
はじめに
ユーザーの多くは、MySQLのようなデータベース管理システムの機能を必要としますが、MySQLプロンプトだけを介してのシステムとの対話は不便です。
phpMyAdminは、ユーザーがWebインターフェースを介してMySQLとやり取りできるように作成されました。 このガイドでは、Ubuntu 20.04システムでデータベースを安全に管理できるように、phpMyAdminをインストールしてセキュリティを保護する方法について説明します。
前提条件
このガイドを完了するには、以下が必要です。
また、phpMyAdminのようなソフトウェアを使用する際には、次の理由からセキュリティ上の考慮事項があります。
- MySQLインストールと直接通信する
- MySQL資格情報を使用した認証を処理する
- 任意のSQLクエリの結果を実行して返する
これらの理由ならびに、攻撃の対象となることが多く広く展開されるPHPアプリケーションであるため、プレーンHTTP接続を介してリモートシステムでphpMyAdminを実行しないでください。
SSL/TLS証明書で設定した既存のドメインがなければ、 Ubuntu 20.04でLet’s Encryptを使用してApacheを保護する方法を参照してください。この場合は、ドメイン名の登録、サーバーのDNSレコード作成、そしてApache Virtual Hostのセットアップが必要です。
ステップ1— phpMyAdminのインストール
APTを使用して、デフォルトのUbuntuリポジトリからphpMyAdminをインストールします。
root以外のsudoユーザーとして、サーバーのパッケージインデックスを更新します。
その後、phpmyadmin
パッケージをインストールできます。このパッケージと併せて、PHP拡張モジュールをいくつかサーバーにインストールし、特定の機能を有効にしてパフォーマンスを向上させることを公式ドキュメントは推奨しています。
前提条件のLAMPスタックチュートリアルに従うと、これらのモジュールのいくつかはphp
パッケージとともにインストールされます。また、次のパッケージも併せてインストールすることをお勧めします。
php-mbstring
: ASCII以外の文字列を管理し、文字列を別のエンコーディングに変換するモジュールphp-zip
: この拡張モジュールは.zip
ファイルのphpMyAdminへのアップロードをサポートします。php-gd
: GDグラフィックライブラリのサポートを有効にします。php-json
: JSONシリアライズをサポートするPHPを提供します。php-curl
: PHPと、異なるプロトコルを使用するさまざまなサーバーとのやり取りを可能にします。
以下のコマンドを実行して、これらのパッケージをシステムにインストールします。ただし、インストールプロセスではphpMyAdminを正しく設定するためにいくつかの選択をする必要があることに注意してください。 後ほどこれらの選択肢について説明します。
- sudo apt install phpmyadmin php-mbstring php-zip php-gd php-json php-curl
正しくインストールするために、要求に応じて次のように選択していきます。
- サーバーの選択では、
apache2
を選択します。
警告: プロンプトが表示される際、apache2がハイライト表示されますが、選択されているわけではありません。SPACE
キーを押してApacheを選択しないと、インストーラーがインストール中に必要なファイルを移動しません。SPACE
、TAB
、ENTER
キーを押してApacheを選択します。
dbconfig-common
を使用してデータベースのセットアップするか尋ねられたら、Yes
を選択します。- 次に、phpMyAdminのMySQLアプリケーションパスワードの選択と確認を求められます。
注: 前提条件であるLAMPスタックチュートリアル ステップ2に従ってMySQLをインストールした場合、Valudate Passwordプラグインが有効になっている場合があります。執筆時点では、このコンポーネントを有効にすると、phpmyadminユーザーのパスワードを設定する際にエラーが発生します。
これを解決するには、インストールを中断するabortオプションを選択します。次に、MySQLプロンプトを開きます。
あるいは、root MySQLユーザーのパスワード認証を有効にしていた場合は、このコマンドを実行し、要求に応じてパスワードを入力します。
プロンプトから、Passwordコンポーネントを無効にするために、次のコマンドを実行します。これでコンポーネントがMySQLサーバーにロードされなくなりますが、実際にアンインストールされるわけではありません。
- UNINSTALL COMPONENT "file://component_validate_password";
その後、MySQLクライアントを閉じます。
続けて、phpmyadmin
パッケージを再インストールしてみましょう。正常に動作します。
- sudo apt install phpmyadmin
phpMyAdminをインストールしたら、sudo mysql
またはmysql -u root -p
でMySQLプロンプトをもう一度開き、次のコマンドを実行して、コンポーネントのパスワード認証を再有効化します。
- INSTALL COMPONENT "file://component_validate_password";
インストールプロセスにより、phpMyAdmin Apache設定ファイルが/etc/apache2/conf-enabled/
ディレクトリに追加され、自動的に読み込まれます。 この段階で、ApacheとPHPをphpMyAdminで動作させるために最後に必要なのは、mbstring
PHP拡張モジュールを明示的に有効にすることだけです。次のように入力します。
その後、Apacheを再起動して変更を認識させます。
- sudo systemctl restart apache2
phpMyAdminがインストールされ、Apacheで動作するように設定されました。ただし、ログインしてMySQLデータベースと対話する前に、MySQLユーザーがプログラムと対話するために必要な権限を持っていることを確認する必要があります。
ステップ2 — ユーザー認証と権限の調整
サーバーにphpMyAdminをインストールした際、プログラムの特定の基礎的なプロセスを実行するphpmyadmin というデータベースユーザーが自動生成されました。インストール中に設定した管理パスワードを持つこのユーザーとしてはログインせず、rootMySQLユーザーまたはphpMyAdminインターフェースを介したデータベース管理専用ユーザーとしてログインすることをお勧めします。
MySQ Rootアカウントのパスワードアクセスの設定
MySQL 5.7(またそれ以降のバージョン)を実行しているUbuntuシステムでは、rootMySQLユーザーはデフォルトによりパスワードではなくauth_socket
プラグインを使用して認証するように設定されています。これにより、多くの場合、セキュリティと使いやすさが向上しますが、外部プログラム(phpMyAdminなど)からユーザーへのアクセスを許可する必要がある場合にも事態が複雑になります。
root MySQLユーザーとしてphpMyAdminにログインするには、認証方法をauth_socket
からパスワードを利用したものに切り替える必要があります(まだ行っていない場合)。これを行うには、ターミナルからMySQLプロンプトを開きます。
次に、次のコマンドで各MySQLユーザーアカウントが使用する認証方法を確認します。
- SELECT user,authentication_string,plugin,host FROM mysql.user;
Output
+------------------+-------------------------------------------+-----------------------+-----------+
| user | authentication_string | plugin | host |
+------------------+-------------------------------------------+-----------------------+-----------+
| root | | auth_socket | localhost |
| mysql.session | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | caching_sha2_password | localhost |
| mysql.sys | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | caching_sha2_password | localhost |
| debian-sys-maint | *8486437DE5F65ADC4A4B001CA591363B64746D4C | caching_sha2_password | localhost |
| phpmyadmin | *5FD2B7524254B7F81B32873B1EA6D681503A5CA9 | caching_sha2_password | localhost |
+------------------+-------------------------------------------+-----------------------+-----------+
5 rows in set (0.00 sec)
この例では、rootユーザーが実際に auth_socket
プラグインで認証していることがわかります。rootアカウントがパスワードで認証するように設定するには、次のALTER USER
コマンドを実行します。 必ずpassword
を強力なパスワードに変更してください。
- ALTER USER 'root'@'localhost' IDENTIFIED WITH caching_sha2_password BY 'password';
注: 前述のALTER USER
ステートメントは、rootMySQLユーザーがcaching_sha2_password
プラグインで認証するように設定しています。公式MySQLドキュメントでは、caching_sha2_password
をMySQLが推奨する認証プラグインとしていますが、それはこのプラグインが、古いながらもまだ広く使用されているmysql_native_password
よりも安全なパスワード暗号化を実現するためです。
ただし、PHPのバージョンによっては、caching_sha2_password
が安定動作しない場合もあります。PHPは、この問題をPHP 7.4で解消済と報告していますが、今後phpMyAdminログインエラーが発生した場合は、代わりにmysql_native_password
でroot認証した方がよいでしょう。
- ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';
次に、ユーザーごとの認証方法を再度確認して、rootの認証にauth_socket
プラグインが使用されていないことを確認します。
- SELECT user,authentication_string,plugin,host FROM mysql.user;
Output
+------------------+-------------------------------------------+-----------------------+-----------+
| user | authentication_string | plugin | host |
+------------------+-------------------------------------------+-----------------------+-----------+
| root | *DE06E242B88EFB1FE4B5083587C260BACB2A6158 | caching_sha2_password | localhost |
| mysql.session | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | caching_sha2_password | localhost |
| mysql.sys | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | caching_sha2_password | localhost |
| debian-sys-maint | *8486437DE5F65ADC4A4B001CA591363B64746D4C | caching_sha2_password | localhost |
| phpmyadmin | *5FD2B7524254B7F81B32873B1EA6D681503A5CA9 | caching_sha2_password | localhost |
+------------------+-------------------------------------------+-----------------------+-----------+
5 rows in set (0.00 sec)
この出力から、rootユーザーがパスワードを使用して認証するのがわかります。これで、ここで設定したパスワードを使用して、rootユーザーとしてphpMyAdminインターフェースにログインできます。
専用のMySQLユーザーのパスワードアクセスの設定
あるいは、専用ユーザーとしてphpMyAdminに接続する方がワークフローに適している場合もあります。これを行うには、MySQLシェルをもう一度開きます。
前節の説明に従って、rootユーザーのパスワード認証が有効になっている場合は、次のコマンドを実行して、接続時に要求されたパスワードを入力する必要があります。
そこから、新しいユーザーを作成し、強力なパスワードを設定します。
- CREATE USER 'sammy'@'localhost' IDENTIFIED WITH caching_sha2_password BY 'password';
注: ここでも、インストールしたPHPのバージョンによって、新しいユーザーの認証にはcaching_sha2_password
ではなく、mysql_native_password
を使用するのがよいでしょう。
- ALTER USER 'sammy'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';
次に、新しいユーザーに適切な権限を付与します。たとえば、次のコマンドを使用して、データベース内のすべてのテーブルにユーザー権限を付与したり、ユーザー権限を追加、変更、削除したりする権限を付与できます。
- GRANT ALL PRIVILEGES ON *.* TO 'sammy'@'localhost' WITH GRANT OPTION;
その後、MySQLシェルを終了します。
サーバーのドメイン名またはパブリックIPアドレスに続けて/phpmyadmin/
にアクセスすると、Webインターフェースにアクセスできます。
https://your_domain_or_IP/phpmyadmin
rootとして、または設定したばかりの新しいユーザー名とパスワードを使用して、インターフェースにログインします。
ログインすると、次のようなユーザーインターフェースが表示されます。
phpMyAdminに接続してやり取りできるようになったので、あとはシステムのセキュリティを強化して攻撃者から保護するだけです。
ステップ3ーphpMyAdminインスタンスの保護
広く普及しているphpMyAdminは、攻撃者に人気のあるターゲットであるため、不正アクセスを防ぐために細心の注意を払う必要があります。 その方法の一つは、Apacheの組み込みの.htaccess
認証機能と認可機能を使用して、アプリケーション全体の手前にゲートウェイを置くことです。
これを行うには、まずphpMyAdminにインストールされたApache設定ファイルを編集して、.htaccess
ファイルオーバーライドの使用を有効にする必要があります。
お好みのテキストエディターを使用して、Apache設定ディレクトリにあるphpmyadmin.conf
ファイルを編集します。 ここでは、nano
を使用します。
- sudo nano /etc/apache2/conf-available/phpmyadmin.conf
次のように、設定ファイルの<Directory/usr/share/phpmyadmin>
セクション内にAllowOverride All
ディレクティブを追加します。
/etc/apache2/conf-available/phpmyadmin.conf
<Directory /usr/share/phpmyadmin>
Options FollowSymLinks
DirectoryIndex index.php
AllowOverride All
. . .
この行を追加したら、ファイルを保存して閉じます。nano
を使用した場合は、CTRL + X
、Y
、ENTER
キーを押します。
この変更を実装するには、Apacheを再起動します。
- sudo systemctl restart apache2
アプリケーションで.htaccess
ファイルの使用を有効にしたので、実装する保護するものを作成します。
これを成功させるには、アプリケーションディレクトリ内にファイルを作成する必要があります。次のように入力して、必要なファイルを作成し、root権限でテキストエディターで開きます。
- sudo nano /usr/share/phpmyadmin/.htaccess
このファイル内で、次の情報を入力します。
/usr/share/phpmyadmin/.htaccess
AuthType Basic
AuthName "Restricted Files"
AuthUserFile /etc/phpmyadmin/.htpasswd
Require valid-user
これらの各行の意味は次のとおりです。
AuthType Basic
: この行は、実装している認証タイプを指定します。このタイプは、パスワードファイルを使用したパスワード認証を実装します。AuthName
: 認証ダイアログボックスのメッセージを設定します。 権限のないユーザーが保護対象に関する情報を取得できないように、一般的な名前をつける必要があります。AuthUserFile
: 認証に使用するパスワードファイルの場所を設定します。 これは、提供されているディレクトリの外にある必要があります。 後ほどこのファイルを作成します。Require valid-user
: 認証されたユーザーだけにこのリソースへのアクセスを許可するように指定します。これは、実際に許可されていないユーザーが入るのを阻止するものです。
完了したら、ファイルを保存して閉じます。
パスワードファイル用に選択した場所は、/etc/phpmyadmin/.htpasswd
です。これで、このファイルを作成し、htpasswd
ユーティリティを使用して初期ユーザーを渡すことができます:
- sudo htpasswd -c /etc/phpmyadmin/.htpasswd username
作成するユーザーのパスワードを選択・確認するように求められます。 その後、入力したハッシュ化パスワードでファイルが生成されます。
追加のユーザーを入力する場合は、-c
フラグを付けず、次のように入力します。
- sudo htpasswd /etc/phpmyadmin/.htpasswd additionaluser
これで、phpMyAdminサブディレクトリにアクセスすると、今設定した追加のアカウント名とパスワードの入力を求められます。
https://domain_name_or_IP/phpmyadmin
Apache認証が通ると、通常のphpMyAdmin認証ページへ移動し、MySQL資格情報の入力を求められます。MySQL資格情報とば別の資格情報を追加することで、データベースにセキュリティレイヤーが新たに追加されます。 phpMyAdminが過去に脆弱性に悩まされていたので、これは望ましいことです。
まとめ
これで、phpMyAdminが設定され、Ubuntu 20.04サーバーで使用できるようになりました。このインターフェイスを使用すると、データベース、ユーザー、テーブルを作成したり、構造やデータの削除や変更などの通常の操作を実行したりすることができます。