Ubuntu16.04でNginxを使用してphpMyAdminをインストールして保護する方法
序章
多くのユーザーはMySQLのようなデータベース管理システムの機能を必要としていますが、そのコマンドラインインターフェイスは直感的でなく、ユーザーフレンドリーではない場合があり、参入障壁があります。
phpMyAdmin は、ユーザーがWebインターフェイスを介してMySQLと対話できるように作成されました。 このガイドでは、phpMyAdminをインストールして保護し、Ubuntu16.04システムからデータベースを安全に管理できるようにする方法について説明します。 このセットアップは、Nginx Webサーバー上に構築します。このサーバーは、優れたパフォーマンスプロファイルを備えており、他のWebサーバーよりも高負荷を処理できます。
前提条件
このガイドを開始する前に、次の前提条件の手順を完了していることを確認してください。
- まず、Ubuntu 16.04 の初期サーバーセットアップの手順1〜4で説明されているように、sudo権限を持つroot以外のユーザーを使用していると想定します。
- また、Ubuntu 16.04サーバーへのLEMP(Linux、Nginx、MySQL、およびPHP)のインストールが完了していることを前提としています。 まだこれを行っていない場合は、 Ubuntu16.04へのLEMPスタックのインストールに関するガイドに従うことができます。 MySQLデータベース管理者のパスワードを必ずメモしてください。
最後に、phpMyAdminなどのソフトウェアを使用する際に注意すべき重要なセキュリティ上の考慮事項があります。これは、MySQLインストールと直接通信し、MySQLクレデンシャルを使用して認証を処理し、任意のSQLクエリの結果を実行して返します。
これらの理由と、攻撃の標的となることが多い広く展開されているPHPアプリケーションであるため、プレーンHTTP接続を介してリモートシステムでphpMyAdminを実行しないでください。 SSL / TLS証明書で構成された既存のドメインがない場合は、 Ubuntu16.04でLet’sEncryptを使用してNginxを保護する方法に関するこのガイドに従うことができます。
これらの前提条件の手順を完了すると、このガイドを開始する準備が整います。
ステップ1—phpMyAdminをインストールします
LEMPプラットフォームがすでに配置されているので、Ubuntuのデフォルトリポジトリから利用できるphpMyAdminをインストールすることから始めることができます。
まず、サーバーのローカルパッケージインデックスを更新して、使用可能なパッケージへの新しい参照セットがあることを確認します。 次に、apt
パッケージツールを使用して、ソフトウェアをリポジトリからプルダウンし、システムにインストールします。
- sudo apt-get update
- sudo apt-get install phpmyadmin
インストール中に、いくつかの情報の入力を求められます。 ソフトウェアで自動的に構成するWebサーバーを尋ねられます。 使用しているWebサーバーであるNginxは使用可能なオプションの1つではないため、TAB
を押してから、ENTER
を押すだけでこのプロンプトをバイパスできます。
次のプロンプトでは、dbconfig-common
でphpMyAdminが使用するデータベースを構成するかどうかを尋ねられます。 「はい」を選択して続行します。 これらの変更を許可するには、MySQLのインストール中に構成したデータベース管理者パスワードを入力する必要があります。
ここで、phpMyAdminアプリケーションとそのデータベース(このステップで作成されます)のパスワードを選択して確認するように求められます。 安全なパスワードを選択して確認し、メモします。
これでインストールが完了します。 Nginx WebサーバーがphpMyAdminファイルを正しく検索して提供するには、インストールファイルからNginxドキュメントのルートディレクトリへのシンボリックリンクを作成する必要があります。
- sudo ln -s /usr/share/phpmyadmin /var/www/html
最後に、phpMyAdminが依存するmcrypt
PHPモジュールを有効にする必要があります。 これはphpMyAdminとともにインストールされたため、オンに切り替えてPHPプロセッサを再起動します。
- sudo phpenmod mcrypt
- sudo systemctl restart php7.0-fpm
これで、phpMyAdminのインストールが機能するようになりました。 インターフェイスにアクセスするには、サーバーのドメイン名またはパブリックIPアドレスに移動し、続いてWebブラウザーで/phpmyadmin
に移動します。
http://server_domain_or_IP/phpmyadmin
サインインするには、有効なMySQLユーザーの一連の資格情報を使用します。 たとえば、root
ユーザーとMySQL管理者パスワードは開始するのに適しています。 これで、管理インターフェイスにアクセスできるようになります。
周りをクリックして、インターフェースに慣れてください。
次の2つのセクションでは、新しいphpMyAdminWebコンソールを保護するための手順を実行します。
ステップ2—デフォルトのphpMyAdminURLを変更する
この時点で、phpMyAdminのインストールは完全に機能しているはずです。 ただし、Webインターフェイスをインストールすることにより、MySQLデータベースサーバーを外部に公開しました。 phpMyAdminの人気と、phpMyAdminがアクセスを提供する可能性のある大量のデータのために、このようなインストールは攻撃の一般的なターゲットです。
このセクションでは、インターフェースのURLを/phpmyadmin
から非標準に変更して、自動化されたボットブルートフォース攻撃の一部を回避することにより、インストールを「強化」またはロックダウンします。
前のステップで、Nginx WebサーバーがphpMyAdminファイルを見つけて提供できるように、phpMyAdminディレクトリからドキュメントルートへのシンボリックリンクを作成しました。 phpMyAdminインターフェイスのURLを変更するには、このシンボリックリンクの名前を変更します。
まず、Nginxドキュメントのルートディレクトリに移動して、行う変更をよりよく理解しましょう。
- cd /var/www/html/
- ls -l
次の出力が表示されます。
Outputtotal 4
-rw-r--r-- 1 root root 612 Apr 10 16:40 index.nginx-debian.html
lrwxrwxrwx 1 root root 21 Apr 10 17:06 phpmyadmin -> /usr/share/phpmyadmin
出力は、このディレクトリにphpmyadmin
というシンボリックリンクがあることを示しています。 このリンク名は任意の名前に変更できます。 これにより、phpMyAdminのアクセスURLが変更され、一般的なエンドポイント名(「phpmyadmin」など)を検索するようにハードコードされたボットからエンドポイントを隠すことができます。
エンドポイントの目的をわかりにくくする名前を選択してください。 このガイドでは、エンドポイントに/nothingtosee
という名前を付けますが、別の名前を選択する必要があります。 これを実現するために、リンクの名前を変更します。
- sudo mv phpmyadmin nothingtosee
- ls -l
上記のコマンドを実行すると、次の出力が表示されます。
Outputtotal 4
-rw-r--r-- 1 root root 612 Apr 10 16:40 index.nginx-debian.html
lrwxrwxrwx 1 root root 21 Apr 10 17:06 nothingtosee -> /usr/share/phpmyadmin
これで、古いURLにアクセスすると、404エラーが発生します。
http://server_domain_or_IP/phpmyadmin
これで、phpMyAdminインターフェイスが、構成したばかりの新しいURLで使用できるようになります。
http://server_domain_or_IP/nothingtosee
これで、認証ゲートウェイを設定することで、phpMyAdminのインストールをさらに強化できます。
ステップ3—Nginx認証ゲートウェイを設定する
次に設定する機能は、ユーザーがphpMyAdminログイン画面を表示する前にパスする必要がある認証プロンプトです。 Nginxを含むほとんどのWebサーバーは、この機能をネイティブに提供します。 Nginx構成ファイルを詳細で変更する必要があります。
これを行う前に、認証資格情報を保存するパスワードファイルを作成します。 Nginxでは、crypt()
関数を使用してパスワードを暗号化する必要があります。 すでにサーバーにインストールされているはずのOpenSSLスイートには、この機能が含まれています。
暗号化されたパスワードを作成するには、次のように入力します。
- openssl passwd
使用するパスワードを入力して確認するように求められます。 ユーティリティは、次のような暗号化されたバージョンのパスワードを表示します。
OutputO5az.RSPzd.HE
この値をコピーします。これは、作成する認証ファイルに貼り付ける必要があるためです。
次に、認証ファイルを作成します。 このファイルをpma_pass
と呼び、Nginx構成ディレクトリに配置します。
- sudo nano /etc/nginx/pma_pass
このファイルでは、使用するユーザー名、コロン(:
)、openssl passwd
ユーティリティから受け取ったパスワードの暗号化バージョンを指定します。
ユーザーにsammy
という名前を付けますが、別のユーザー名を選択する必要があります。 ファイルは次のようになります。
sammy:O5az.RSPzd.HE
完了したら、ファイルを保存して閉じます。
これで、Nginx構成ファイルを変更する準備が整いました。 開始するには、テキストエディタで開きます。
- sudo nano /etc/nginx/sites-available/default
このファイル内に、新しいlocation
セクションを追加する必要があります。 これは、phpMyAdminインターフェイス用に選択したlocation
を対象とします(このガイドでは/nothingtosee
を選択しました)。
このセクションは、server
ブロック内に作成しますが、他のブロックの外に作成します。 この例では、新しいlocation
ブロックを/
ブロックの下に配置します。
server {
. . .
location / {
# First attempt to serve request as file, then
# as directory, then fall back to displaying a 404.
try_files $uri $uri/ =404;
}
location /nothingtosee {
}
. . .
}
このブロック内で、auth_basic
という変数の値を、プロンプトがユーザーに表示する認証メッセージに設定する必要があります。 認証されていないユーザーに保護対象を示したくないので、具体的な詳細を提供しないでください。 この例では、「管理者ログイン」を使用します。
次に、auth_basic_user_file
という変数を追加して、作成したばかりの認証ファイルをWebサーバーにポイントする必要があります。 Nginxはユーザーに認証の詳細の入力を求め、入力された値が指定されたファイルで見つかった値と一致することを確認します。
終了すると、ファイルは次のようになります。
server {
. . .
location / {
try_files $uri $uri/ =404;
}
location /nothingtosee {
auth_basic "Admin Login";
auth_basic_user_file /etc/nginx/pma_pass;
}
. . .
}
完了したら、ファイルを保存して閉じます。
新しい認証ゲートをアクティブにするには、Webサーバーを再起動する必要があります。
- sudo service nginx restart
これで、WebブラウザでphpMyAdmin URLにアクセスした場合(ページの更新が機能しない場合は、キャッシュをクリアするか、すでにphpMyAdminを使用している場合は別のブラウザセッションを使用する必要があります)、 pma_pass
ファイルに追加したユーザー名とパスワード:
http://server_domain_or_IP/nothingtosee
クレデンシャルを入力すると、標準のphpMyAdminログインページが表示されます。
このゲートウェイは、セキュリティの追加レイヤーを提供するだけでなく、MySQLログからスパム認証の試行を排除するのに役立ちます。
結論
このチュートリアルを完了すると、適度に安全なWebインターフェイスからMySQLデータベースを管理できるようになります。 このユーザーインターフェイスは、MySQLコマンドラインを介して利用可能な機能のほとんどを公開します。 データベースとスキーマを参照し、クエリを実行し、新しいデータセットと構造を作成できます。