Ubuntu22.04にphpMyAdminをインストールして保護する方法
序章
多くのユーザーはMySQLのようなデータベース管理システムの機能を必要としていますが、MySQLプロンプトだけからシステムを操作することに抵抗を感じる場合があります。
phpMyAdmin は、ユーザーがWebインターフェイスを介してMySQLと対話できるように作成されました。 このガイドでは、phpMyAdminをインストールして保護し、Ubuntu22.04システムでデータベースを安全に管理できるようにする方法について説明します。
前提条件
このガイドを完了するには、次のものが必要です。
- Ubuntu22.04サーバー。 このサーバーには、管理者権限を持つroot以外のユーザーと、
ufw
で構成されたファイアウォールが必要です。 これを設定するには、Ubuntu22.04の初期サーバー設定ガイドに従ってください。 - Ubuntu 22.04サーバーにインストールされたLAMP(Linux、Apache、MySQL、およびPHP)スタック。 これがまだ完了していない場合は、 Ubuntu22.04へのLAMPスタックのインストールに関するこのガイドに従うことができます。
さらに、phpMyAdminなどのソフトウェアを使用する場合は、次のような重要なセキュリティ上の考慮事項があります。
- MySQLインストールと直接通信します
- MySQLクレデンシャルを使用して認証を処理します
- 任意のSQLクエリの結果を実行して返します
これらの理由と、攻撃の標的となることが多い広く展開されているPHPアプリケーションであるため、プレーンHTTP接続を介してリモートシステムでphpMyAdminを実行しないでください。
SSL / TLS証明書で構成された既存のドメインがない場合は、 Ubuntu22.04でLet’sEncryptを使用してApacheを保護する方法についてこのガイドに従うことができます。 これには、ドメイン名の登録、サーバーのDNSレコードの作成、およびApache仮想ホストの設定が必要になります。
ステップ1—phpMyAdminをインストールする
APTを使用して、デフォルトのUbuntuリポジトリからphpMyAdminをインストールできます。
root以外のsudoユーザーとして、最近更新していない場合は、サーバーのパッケージインデックスを更新します。
- sudo apt update
その後、phpmyadmin
パッケージをインストールできます。 このパッケージに加えて、公式ドキュメントでは、特定の機能を有効にしてパフォーマンスを向上させるために、サーバーにいくつかのPHP拡張機能をインストールすることを推奨しています。
前提条件のLAMPスタックチュートリアルに従った場合、これらのモジュールのいくつかはphp
パッケージと一緒にインストールされます。 ただし、次のパッケージもインストールすることをお勧めします。
php-mbstring
:非ASCII文字列を管理し、文字列を異なるエンコーディングに変換するためのモジュールphp-zip
:この拡張機能は、phpMyAdminへの.zip
ファイルのアップロードをサポートしますphp-gd
:GDグラフィックライブラリのサポートを有効にしますphp-json
:PHPにJSONシリアル化のサポートを提供します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をインストールしたとすると、パスワードの検証プラグインを有効にすることを決定した可能性があります。 この記事の執筆時点では、 phpmyadmin ユーザーのパスワードを設定しようとすると、このコンポーネントを有効にするとエラーが発生します。
これを解決するには、abortオプションを選択してインストールプロセスを停止します。 次に、MySQLプロンプトを開きます。
- sudo mysql
または、 root MySQLユーザーのパスワード認証を有効にした場合は、次のコマンドを実行し、プロンプトが表示されたらパスワードを入力します。
- mysql -u root -p
プロンプトから、次のコマンドを実行して、パスワードの検証コンポーネントを無効にします。 これは実際にはアンインストールされないことに注意してください。ただし、コンポーネントがMySQLサーバーにロードされないようにするだけです。
- UNINSTALL COMPONENT "file://component_validate_password";
その後、MySQLクライアントを閉じることができます。
- exit
次に、phpmyadmin
パッケージを再度インストールしてみてください。これで、期待どおりに機能します。
- sudo apt install phpmyadmin
phpMyAdminをインストールしたら、sudo mysql
またはmysql -u root -p
を使用してMySQLプロンプトをもう一度開き、次のコマンドを実行して[パスワードの検証]コンポーネントを再度有効にします。
- INSTALL COMPONENT "file://component_validate_password";
インストールプロセスにより、phpMyAdminApache構成ファイルが/etc/apache2/conf-enabled/
ディレクトリに追加され、そこで自動的に読み取られます。 phpMyAdminで動作するようにApacheとPHPの構成を完了するには、チュートリアルのこのセクションに残っている唯一のタスクは、mbstring
PHP拡張機能を明示的に有効にすることです。
- sudo phpenmod mbstring
その後、変更が認識されるようにApacheを再起動します。
- sudo systemctl restart apache2
これで、phpMyAdminがインストールされ、Apacheで動作するように構成されました。 ただし、ログインしてMySQLデータベースとの対話を開始する前に、MySQLユーザーがプログラムとの対話に必要な権限を持っていることを確認する必要があります。
ステップ2—ユーザー認証と特権の調整
サーバーにphpMyAdminをインストールすると、プログラムの特定の基盤となるプロセスを実行するphpmyadminというデータベースユーザーが自動的に作成されます。 インストール時に設定した管理者パスワードを使用してこのユーザーとしてログインするのではなく、 root MySQLユーザーとして、またはphpMyAdminインターフェイスを介したデータベース管理専用のユーザーとしてログインすることをお勧めします。
MySQLルートアカウントのパスワードアクセスの構成
MySQL 5.7(およびそれ以降のバージョン)を実行しているUbuntuシステムでは、 root MySQLユーザーは、パスワードではなく、デフォルトでauth_socket
プラグインを使用して認証するように設定されています。 これにより、多くの場合、セキュリティと使いやすさが向上しますが、phpMyAdminなどの外部プログラムにユーザーへのアクセスを許可する必要がある場合は、事態が複雑になる可能性もあります。
root MySQLユーザーとしてphpMyAdminにログインするには、認証方法をauth_socket
から、パスワードを使用する方法に切り替える必要があります(まだ行っていない場合)。それで。 これを行うには、ターミナルからMySQLプロンプトを開きます。
- sudo mysql
次に、次のコマンドを使用して、各MySQLユーザーアカウントが使用する認証方法を確認します。
- SELECT user,authentication_string,plugin,host FROM mysql.user;
Output+------------------+------------------------------------------------------------------------+-----------------------+-----------+
| user | authentication_string | plugin | host |
+------------------+------------------------------------------------------------------------+-----------------------+-----------+
| debian-sys-maint | $A$005$I:jOry?]Sy<|qhQRj3fBRQ43i4UJxrpm.IaT6lOHkgveJjmeIjJrRe6 | caching_sha2_password | localhost |
| mysql.infoschema | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED | caching_sha2_password | localhost |
| mysql.session | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED | caching_sha2_password | localhost |
| mysql.sys | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED | caching_sha2_password | localhost |
| phpmyadmin | $A$005$?#{Z?`gN!c2az)}V-INCWXSuVdqB9zWteH1IkZfTe/rOLgVhSzEMM9R3G6K9 | caching_sha2_password | localhost |
| root | | auth_socket | localhost |
+------------------+------------------------------------------------------------------------+-----------------------+-----------+
6 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_native_password
よりも安全なパスワード暗号化を提供するため、MySQLの推奨認証プラグインです。
ただし、PHPの一部のバージョンは、caching_sha2_password
では確実に機能しません。 PHPは、この問題がPHP 7.4 で修正されたことを報告していますが、後でphpMyAdminにログインしようとしたときにエラーが発生した場合は、rootを設定して認証することをお勧めします。代わりにmysql_native_password
:
- 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 |
+------------------+------------------------------------------------------------------------+-----------------------+-----------+
| debian-sys-maint | $A$005$I:jOry?]Sy<|qhQRj3fBRQ43i4UJxrpm.IaT6lOHkgveJjmeIjJrRe6 | caching_sha2_password | localhost |
| mysql.infoschema | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED | caching_sha2_password | localhost |
| mysql.session | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED | caching_sha2_password | localhost |
| mysql.sys | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED | caching_sha2_password | localhost |
| phpmyadmin | $A$005$?#{Z?`gN!c2az)}V-INCWXSuVdqB9zWteH1IkZfTe/rOLgVhSzEMM9R3G6K9 | caching_sha2_password | localhost |
| root | $A$005$3y�y|Z?'_[} ZyVHuESVwNmjKWOH/ndETwS.Kty0IH7UfiXjOfVvyWroy4a. | caching_sha2_password | localhost |
+------------------+------------------------------------------------------------------------+-----------------------+-----------+
6 rows in set (0.00 sec)
この出力は、rootユーザーがパスワードを使用して認証することを示しています。 これで、ここで設定したパスワードを使用して、rootユーザーとしてphpMyAdminインターフェイスにログインできます。
専用のMySQLユーザーのパスワードアクセスの構成
または、専用ユーザーを使用してphpMyAdminに接続する方がワークフローに適していると感じる人もいます。 これを行うには、MySQLシェルをもう一度開きます。
- sudo mysql
前のセクションで説明したように、 root ユーザーに対してパスワード認証を有効にしている場合は、接続するために次のコマンドを実行し、プロンプトが表示されたらパスワードを入力する必要があります。
- mysql -u root -p
そこから、新しいユーザーを作成し、強力なパスワードを設定します。
- 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シェルを終了します。
- exit
これで、サーバーのドメイン名またはパブリックIPアドレスに続いて/phpmyadmin
にアクセスして、Webインターフェイスにアクセスできます。
https://your_domain_or_IP/phpmyadmin
root として、または設定したばかりの新しいユーザー名とパスワードを使用して、インターフェイスにログインします。
ログインすると、phpMyAdminのユーザーインターフェイスが表示されます。
phpMyAdminに接続して操作できるようになったので、あとはシステムのセキュリティを強化して攻撃者からシステムを保護するだけです。
ステップ3—phpMyAdminインスタンスを保護する
phpMyAdminはどこにでもあるため、攻撃者に人気のあるターゲットであり、不正アクセスを防ぐために特別な注意を払う必要があります。 これを行う1つの方法は、Apacheの組み込みの.htaccess
認証および承認機能を使用して、アプリケーション全体の前にゲートウェイを配置することです。
これを行うには、最初にphpMyAdminインストールのApache構成ファイルを編集して、.htaccess
ファイルオーバーライドの使用を有効にする必要があります。
お好みのテキストエディタを使用して、Apache構成ディレクトリに配置されているphpmyadmin.conf
ファイルを編集します。 ここでは、nano
を使用します。
- sudo nano /etc/apache2/conf-available/phpmyadmin.conf
次のように、構成ファイルの<Directory /usr/share/phpmyadmin>
セクション内にAllowOverride All
ディレクティブを追加します。
<Directory /usr/share/phpmyadmin>
Options SymLinksIfOwnerMatch
DirectoryIndex index.php
AllowOverride All
. . .
この行を追加したら、ファイルを保存して閉じます。 nano
を使用してファイルを編集した場合は、CTRL + X
、Y
、ENTER
の順に押して編集します。
行った変更を実装するには、Apacheを再起動します。
- sudo systemctl restart apache2
アプリケーションで.htaccess
ファイルの使用を有効にしたので、実際にセキュリティを実装するためにファイルを作成する必要があります。
これを成功させるには、ファイルをアプリケーションディレクトリ内に作成する必要があります。 次のように入力して、必要なファイルを作成し、root権限でテキストエディタで開くことができます。
- sudo nano /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
次に、Apacheを再起動して、.htaccess
認証を有効にします。
- sudo systemctl restart apache2
これで、phpMyAdminサブディレクトリにアクセスすると、設定した追加のアカウント名とパスワードの入力を求められます。
https://domain_name_or_IP/phpmyadmin
Apache認証を入力すると、通常のphpMyAdmin認証ページに移動してMySQLクレデンシャルを入力します。 MySQL以外のクレデンシャルのセットを追加することで、データベースにセキュリティの追加レイヤーを提供します。 phpMyAdminは過去にセキュリティの脅威に対して脆弱であったため、これは望ましいことです。
結論
これで、phpMyAdminが構成され、Ubuntu22.04サーバーで使用できるようになります。 このインターフェースを使用すると、データベース、ユーザー、およびテーブルを作成できるだけでなく、構造やデータの削除や変更などの通常の操作を実行できます。