ウェブサイト検索

Ubuntu に phpMyAdmin をインストールして保護する方法


導入

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

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

Ubuntu に phpMyAdmin をインストールして保護する方法

  1. phpMyAdminのインストール
  2. ユーザー認証と権限の調整
  3. phpMyAdmin インスタンスの保護

前提条件

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

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

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

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

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

SSL/TLS 証明書を使用して構成された既存のドメインがない場合は、Ubuntu で Let's Encrypt を使用して 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 をインストールしたと仮定すると、Validate Password プラグインを有効にすることにした可能性があります。この記事の執筆時点では、このコンポーネントを有効にすると、phpmyadmin ユーザーのパスワードを設定しようとするとエラーが発生します。

これを解決するには、中止 オプションを選択してインストール プロセスを停止します。次に、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";

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

sudo phpenmod mbstring

その後、変更を認識させるために Apache を再起動します。

sudo systemctl restart apache2

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

ステップ2-ユーザー認証と権限の調整

phpMyAdmin をサーバーにインストールすると、phpmyadmin というデータベース ユーザーが自動的に作成され、プログラムの基礎となる特定のプロセスが実行されます。インストール時に設定した管理パスワードを使用してこのユーザーとしてログインするのではなく、 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;

+------------------+------------------------------------------------------------------------+-----------------------+-----------+
| 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 ステートメントは、root MySQL ユーザーを 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;

+------------------+------------------------------------------------------------------------+-----------------------+-----------+
| 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

次のように、構成ファイルの セクション内に 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 が構成され、Ubuntu サーバーで使用できるようになりました。このインターフェイスを使用すると、データベース、ユーザー、テーブルを作成できるだけでなく、構造やデータの削除や変更などの通常の操作を実行できます。

関連記事: