// Tutorial //

Ubuntu 20.04にphpMyAdminをインストールしてセキュリティを保護する方法

Published on October 26, 2020
Default avatar
By Mark Drake
Manager, Developer Education
日本語
Ubuntu 20.04にphpMyAdminをインストールしてセキュリティを保護する方法

このチュートリアルの以前のバージョンは、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ユーザーとして、サーバーのパッケージインデックスを更新します。

  1. sudo apt update

その後、phpmyadminパッケージをインストールできます。このパッケージと併せて、PHP拡張モジュールをいくつかサーバーにインストールし、特定の機能を有効にしてパフォーマンスを向上させることを公式ドキュメントは推奨しています。

前提条件のLAMPスタックチュートリアルに従うと、これらのモジュールのいくつかはphpパッケージとともにインストールされます。また、次のパッケージも併せてインストールすることをお勧めします。

  • php-mbstring: ASCII以外の文字列を管理し、文字列を別のエンコーディングに変換するモジュール
  • php-zip: この拡張モジュールは.zipファイルのphpMyAdminへのアップロードをサポートします。
  • php-gd: GDグラフィックライブラリのサポートを有効にします。
  • php-json: JSONシリアライズをサポートするPHPを提供します。
  • php-curl: PHPと、異なるプロトコルを使用するさまざまなサーバーとのやり取りを可能にします。

以下のコマンドを実行して、これらのパッケージをシステムにインストールします。ただし、インストールプロセスではphpMyAdminを正しく設定するためにいくつかの選択をする必要があることに注意してください。                      後ほどこれらの選択肢について説明します。

  1. sudo apt install phpmyadmin php-mbstring php-zip php-gd php-json php-curl

正しくインストールするために、要求に応じて次のように選択していきます。

  • サーバーの選択では、apache2を選択します。 <$>[warning] 警告: プロンプトが表示される際、apache2がハイライト表示されますが、選択されているわけではありません。 SPACEキーを押してApacheを選択しないと、インストーラーがインストール中に必要なファイルを移動しません。    SPACETABENTER キーを押してApacheを選択します。 <$>
  • dbconfig-commonを使用してデータベースのセットアップするか尋ねられたら、Yesを選択します。
  • 次に、phpMyAdminのMySQLアプリケーションパスワードの選択と確認を求められます。

: 前提条件であるLAMPスタックチュートリアル ステップ2に従ってMySQLをインストールした場合、Valudate Passwordプラグインが有効になっている場合があります。執筆時点では、このコンポーネントを有効にすると、phpmyadminユーザーのパスワードを設定する際にエラーが発生します。

phpMyAdmin パスワード認証エラー

これを解決するには、インストールを中断するabortオプションを選択します。次に、MySQLプロンプトを開きます。

  1. sudo mysql

あるいは、root MySQLユーザーのパスワード認証を有効にしていた場合は、このコマンドを実行し、要求に応じてパスワードを入力します。

  1. mysql -u root -p

プロンプトから、Passwordコンポーネントを無効にするために、次のコマンドを実行します。これでコンポーネントがMySQLサーバーにロードされなくなりますが、実際にアンインストールされるわけではありません。

  1. UNINSTALL COMPONENT "file://component_validate_password";

その後、MySQLクライアントを閉じます。

  1. exit

続けて、phpmyadminパッケージを再インストールしてみましょう。正常に動作します。

  1. sudo apt install phpmyadmin

phpMyAdminをインストールしたら、sudo mysqlまたはmysql -u root -pでMySQLプロンプトをもう一度開き、次のコマンドを実行して、コンポーネントのパスワード認証を再有効化します。

  1. INSTALL COMPONENT "file://component_validate_password";

インストールプロセスにより、phpMyAdmin Apache設定ファイルが/etc/apache2/conf-enabled/ディレクトリに追加され、自動的に読み込まれます。 この段階で、ApacheとPHPをphpMyAdminで動作させるために最後に必要なのは、mbstringPHP拡張モジュールを明示的に有効にすることだけです。次のように入力します。

  1. sudo phpenmod mbstring

その後、Apacheを再起動して変更を認識させます。

  1. 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プロンプトを開きます。

  1. sudo mysql

次に、次のコマンドで各MySQLユーザーアカウントが使用する認証方法を確認します。

  1. 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を強力なパスワードに変更してください。

  1. 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_passwordroot認証した方がよいでしょう。

  1. ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';

次に、ユーザーごとの認証方法を再度確認して、rootの認証にauth_socketプラグインが使用されていないことを確認します。

  1. 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シェルをもう一度開きます。

  1. sudo mysql

前節の説明に従って、rootユーザーのパスワード認証が有効になっている場合は、次のコマンドを実行して、接続時に要求されたパスワードを入力する必要があります。

  1. mysql -u root -p

そこから、新しいユーザーを作成し、強力なパスワードを設定します。

  1. CREATE USER 'sammy'@'localhost' IDENTIFIED WITH caching_sha2_password BY 'password';

: ここでも、インストールしたPHPのバージョンによって、新しいユーザーの認証にはcaching_sha2_passwordではなく、mysql_native_passwordを使用するのがよいでしょう。

  1. ALTER USER 'sammy'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';

次に、新しいユーザーに適切な権限を付与します。たとえば、次のコマンドを使用して、データベース内のすべてのテーブルにユーザー権限を付与したり、ユーザー権限を追加、変更、削除したりする権限を付与できます。

  1. GRANT ALL PRIVILEGES ON *.* TO 'sammy'@'localhost' WITH GRANT OPTION;

その後、MySQLシェルを終了します。

  1. exit

サーバーのドメイン名またはパブリックIPアドレスに続けて/phpmyadmin/にアクセスすると、Webインターフェースにアクセスできます。

https://your_domain_or_IP/phpmyadmin

phpMyAdminログイン画面

rootとして、または設定したばかりの新しいユーザー名とパスワードを使用して、インターフェースにログインします。

ログインすると、次のようなユーザーインターフェースが表示されます。

phpMyAdminユーザーインターフェース

phpMyAdminに接続してやり取りできるようになったので、あとはシステムのセキュリティを強化して攻撃者から保護するだけです。

ステップ3ーphpMyAdminインスタンスの保護

広く普及しているphpMyAdminは、攻撃者に人気のあるターゲットであるため、不正アクセスを防ぐために細心の注意を払う必要があります。      その方法の一つは、Apacheの組み込みの.htaccess認証機能と認可機能を使用して、アプリケーション全体の手前にゲートウェイを置くことです。

これを行うには、まずphpMyAdminにインストールされたApache設定ファイルを編集して、.htaccessファイルオーバーライドの使用を有効にする必要があります。

お好みのテキストエディターを使用して、Apache設定ディレクトリにあるphpmyadmin.confファイルを編集します。 ここでは、nanoを使用します。

  1. 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 + XYENTERキーを押します。

この変更を実装するには、Apacheを再起動します。

  1. sudo systemctl restart apache2

アプリケーションで.htaccessファイルの使用を有効にしたので、実装する保護するものを作成します。

これを成功させるには、アプリケーションディレクトリ内にファイルを作成する必要があります。次のように入力して、必要なファイルを作成し、root権限でテキストエディターで開きます。

  1. 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ユーティリティを使用して初期ユーザーを渡すことができます:

  1. sudo htpasswd -c /etc/phpmyadmin/.htpasswd username

作成するユーザーのパスワードを選択・確認するように求められます。 その後、入力したハッシュ化パスワードでファイルが生成されます。

追加のユーザーを入力する場合は、-c フラグを付けず、次のように入力します。

  1. sudo htpasswd /etc/phpmyadmin/.htpasswd additionaluser

これで、phpMyAdminサブディレクトリにアクセスすると、今設定した追加のアカウント名とパスワードの入力を求められます。

https://domain_name_or_IP/phpmyadmin

phpMyAdmin apache password

Apache認証が通ると、通常のphpMyAdmin認証ページへ移動し、MySQL資格情報の入力を求められます。MySQL資格情報とば別の資格情報を追加することで、データベースにセキュリティレイヤーが新たに追加されます。    phpMyAdminが過去に脆弱性に悩まされていたので、これは望ましいことです。

まとめ

これで、phpMyAdminが設定され、Ubuntu 20.04サーバーで使用できるようになりました。このインターフェイスを使用すると、データベース、ユーザー、テーブルを作成したり、構造やデータの削除や変更などの通常の操作を実行したりすることができます。

Thanks for learning with the DigitalOcean Community. Check out our offerings for compute, storage, networking, and managed databases.

Learn more about us


About the authors
Default avatar
Manager, Developer Education

Technical Writer @ DigitalOcean

Still looking for an answer?

Ask a questionSearch for more help

Was this helpful?
 
Leave a comment
Leave a comment...

This textbox defaults to using Markdown to format your answer.

You can type !ref in this text area to quickly search our full set of tutorials, documentation & marketplace offerings and insert the link!

Try DigitalOcean for free

Click here to Sign up and get $200 of credit to try our products over 60 days!