このチュートリアルの以前のバージョンは、 BrennanBearnesによって作成されました。

序章

多くのユーザーはMySQLのようなデータベース管理システムの機能を必要としていますが、MySQLプロンプトだけからシステムを操作することに抵抗を感じる場合があります。

phpMyAdmin は、ユーザーがWebインターフェイスを介してMySQLと対話できるように作成されました。 このガイドでは、phpMyAdminをインストールして保護し、Ubuntu20.04システムでデータベースを安全に管理できるようにする方法について説明します。

前提条件

このガイドを完了するには、次のものが必要です。

  • Ubuntu20.04サーバー。 このサーバーには、管理者権限を持つroot以外のユーザーと、で構成されたファイアウォールが必要です。 ufw. これを設定するには、Ubuntu20.04初期サーバー設定ガイドに従ってください。
  • Ubuntu 20.04サーバーにインストールされたLAMP(Linux、Apache、MySQL、およびPHP)スタック。 これがまだ完了していない場合は、 Ubuntu20.04へのLAMPスタックのインストールに関するこのガイドに従うことができます。

さらに、phpMyAdminなどのソフトウェアを使用する場合は、次のような重要なセキュリティ上の考慮事項があります。

  • MySQLインストールと直接通信します
  • MySQLクレデンシャルを使用して認証を処理します
  • 任意のSQLクエリの結果を実行して返します

これらの理由と、攻撃の標的となることが多い広く展開されているPHPアプリケーションであるため、プレーンHTTP接続を介してリモートシステムでphpMyAdminを実行しないでください。

SSL / TLS証明書で構成された既存のドメインがない場合は、 Ubuntu20.04でLet’sEncryptを使用してApacheを保護する方法に関するこのガイドに従うことができます。 これには、ドメイン名の登録サーバーのDNSレコードの作成、およびApache仮想ホストの設定が必要になります。

ステップ1—phpMyAdminをインストールする

APTを使用して、デフォルトのUbuntuリポジトリからphpMyAdminをインストールできます。

root以外のsudoユーザーとして、サーバーのパッケージインデックスを更新します。

  1. sudo apt update

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

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

  • php-mbstring:非ASCII文字列を管理し、文字列を異なるエンコーディングに変換するためのモジュール
  • php-zip:この拡張機能はアップロードをサポートします .zip phpMyAdminへのファイル
  • php-gdGDグラフィックライブラリのサポートを有効にします
  • php-json:PHPにJSONシリアル化のサポートを提供します
  • php-curl:PHPがさまざまなプロトコルを使用してさまざまな種類のサーバーと対話できるようにします

前提条件のLAMPスタックチュートリアルにインストールされているデフォルト以外のバージョンのPHPを使用している場合は、これらのモジュールパッケージの適切なバージョンをインストールする必要があることに注意してください。 たとえば、PHPバージョン 8.0 を使用している場合は、 php8.0-mbstring デフォルトの代わりにパッケージ php-mbstring パッケージ。

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

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

インストールを正しく構成するためにプロンプトが表示されたときに選択する必要があるオプションは次のとおりです。

  • サーバーの選択には、 apache2

警告:プロンプトが表示されると、「apache2」が強調表示されますが、は選択されていません。 ヒットしない場合 SPACE Apacheを選択すると、インストーラーはインストール中に必要なファイルを移動しません。 打つ SPACE, TAB、 その後 ENTER Apacheを選択します。

  • 選択する Yes 使用するかどうか尋ねられたとき dbconfig-common データベースを設定します
  • 次に、phpMyAdminのMySQLアプリケーションパスワードを選択して確認するように求められます

:前提条件のLAMPスタックチュートリアルステップ2に従ってMySQLをインストールしたとすると、パスワードの検証プラグインを有効にすることを決定した可能性があります。 この記事の執筆時点では、 phpmyadmin ユーザーのパスワードを設定しようとすると、このコンポーネントを有効にするとエラーが発生します。

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

  1. sudo mysql

または、 root MySQLユーザーのパスワード認証を有効にした場合は、次のコマンドを実行し、プロンプトが表示されたらパスワードを入力します。

  1. mysql -u root -p

プロンプトから、次のコマンドを実行して、パスワードの検証コンポーネントを無効にします。 これは実際にはアンインストールされないことに注意してください。ただし、コンポーネントがMySQLサーバーにロードされないようにするだけです。

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

その後、MySQLクライアントを閉じることができます。

  1. exit

次に、をインストールしてみてください phpmyadmin 再度パッケージ化すると、期待どおりに機能します。

  1. sudo apt install phpmyadmin

phpMyAdminがインストールされると、MySQLプロンプトをもう一度開くことができます。 sudo mysql また mysql -u root -p 次に、次のコマンドを実行して、パスワードの検証コンポーネントを再度有効にします。

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

インストールプロセスにより、phpMyAdminApache構成ファイルが /etc/apache2/conf-enabled/ ディレクトリ。自動的に読み取られます。 phpMyAdminと連携するようにApacheとPHPの構成を完了するには、チュートリアルのこのセクションに残っている唯一のタスクは、明示的に有効にすることです。 mbstring PHP拡張機能。次のように入力して実行できます。

  1. sudo phpenmod mbstring

その後、変更が認識されるようにApacheを再起動します。

  1. sudo systemctl restart apache2

これで、phpMyAdminがインストールされ、Apacheで動作するように構成されました。 ただし、ログインしてMySQLデータベースとの対話を開始する前に、MySQLユーザーがプログラムとの対話に必要な権限を持っていることを確認する必要があります。

ステップ2—ユーザー認証と特権の調整

サーバーにphpMyAdminをインストールすると、プログラムの特定の基盤となるプロセスを実行するphpmyadminというデータベースユーザーが自動的に作成されます。 インストール時に設定した管理者パスワードを使用してこのユーザーとしてログインするのではなく、 root MySQLユーザーとして、またはphpMyAdminインターフェイスを介したデータベース管理専用のユーザーとしてログインすることをお勧めします。

MySQLルートアカウントのパスワードアクセスの構成

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にログインしようとしたときにエラーが発生した場合は、rootを設定して認証することをお勧めします。 mysql_native_password 代わりは:

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

次に、各ユーザーが採用している認証方法をもう一度確認して、rootauth_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のバージョンによっては、新しいユーザーを認証するように設定することをお勧めします。 mysql_native_password それ以外の caching_sha2_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アドレスにアクセスしてからWebインターフェイスにアクセスできます。 /phpmyadmin:

https://your_domain_or_IP/phpmyadmin

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

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

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

ステップ3—phpMyAdminインスタンスを保護する

phpMyAdminはどこにでもあるため、攻撃者に人気のあるターゲットであり、不正アクセスを防ぐために特別な注意を払う必要があります。 これを行う1つの方法は、Apacheの組み込みを使用して、アプリケーション全体の前にゲートウェイを配置することです。 .htaccess 認証および承認機能。

これを行うには、最初にの使用を有効にする必要があります .htaccess phpMyAdminインストールのApache構成ファイルを編集してファイルを上書きします。

お好みのテキストエディタを使用して、 phpmyadmin.conf Apache構成ディレクトリに配置されたファイル。 ここでは、 nano:

  1. sudo nano /etc/apache2/conf-available/phpmyadmin.conf

追加します AllowOverride All 内のディレクティブ <Directory /usr/share/phpmyadmin> 次のような構成ファイルのセクション:

/etc/apache2/conf-available/phpmyadmin.conf
<Directory /usr/share/phpmyadmin>
    Options SymLinksIfOwnerMatch
    DirectoryIndex index.php
    AllowOverride All
    . . .

この行を追加したら、ファイルを保存して閉じます。 使用した場合 nano ファイルを編集するには、を押して編集します CTRL + X, Y、 その後 ENTER.

行った変更を実装するには、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

次に、Apacheを再起動して配置します .htaccess 認証が有効になります:

  1. sudo systemctl restart apache2

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

https://domain_name_or_IP/phpmyadmin

Apache認証を入力すると、通常のphpMyAdmin認証ページに移動してMySQLクレデンシャルを入力します。 MySQL以外のクレデンシャルのセットを追加することで、データベースにセキュリティの追加レイヤーを提供します。 phpMyAdminは過去にセキュリティの脅威に対して脆弱であったため、これは望ましいことです。

結論

これで、phpMyAdminが構成され、Ubuntu20.04サーバーで使用できるようになります。 このインターフェースを使用すると、データベース、ユーザー、およびテーブルを作成できるだけでなく、構造やデータの削除や変更などの通常の操作を実行できます。