前書き
多くのユーザーはMySQLのようなデータベース管理システムの機能を必要としますが、そのコマンドラインインターフェイスは一部の人にとっては直感的でなく、ユーザーフレンドリーであり、参入の障壁となります。
phpMyAdminは、ユーザーがWebインターフェースを介してMySQLと対話できるように作成されました。 このガイドでは、phpMyAdminをインストールしてセキュリティで保護し、Ubuntu 16.04システムからデータベースを安全に管理できるようにする方法について説明します。 Nginx Webサーバー上にこのセットアップを構築します。NginxWebサーバーは、優れたパフォーマンスプロファイルを備えており、他のいくつかのWebサーバーよりも高い負荷を処理できます。
前提条件
このガイドを開始する前に、次の前提条件の手順を完了していることを確認してください。
-
まず、initial server setup of Ubuntu 16.04の手順1〜4で説明されているように、sudo権限を持つroot以外のユーザーを使用していると想定します。
-
また、Ubuntu 16.04サーバーでLEMP(Linux、Nginx、MySQL、およびPHP)のインストールを完了したと想定します。 まだこれを行っていない場合は、installing a LEMP stack on Ubuntu 16.04のガイドに従うことができます。 必ずMySQLデータベース管理者のパスワードをメモしてください。
最後に、phpMyAdminなどのソフトウェアを使用する際に注意すべき重要なセキュリティ上の考慮事項があります。MySQLインストールと直接通信し、MySQL資格情報を使用して認証を処理し、任意のSQLクエリの結果を実行して返します。
これらの理由により、また攻撃の対象となることが多い、広く展開されたPHPアプリケーションであるため、プレーンHTTP接続を介してリモートシステムでphpMyAdminを実行しないでください。 SSL / TLS証明書で構成された既存のドメインがない場合は、securing Nginx with Let’s Encrypt on Ubuntu 16.04でこのガイドに従うことができます。
これらの前提条件の手順を完了すると、このガイドを使用する準備が整います。
[[step-1 -—- install-phpmyadmin]] ==ステップ1—phpMyAdminをインストールします
LEMPプラットフォームがすでに整っているので、Ubuntuのデフォルトリポジトリから入手できるphpMyAdminをインストールすることから始めます。
最初に、サーバーのローカルパッケージインデックスを更新して、利用可能なパッケージへの新しい参照セットがあることを確認します。 次に、apt
パッケージツールを使用して、ソフトウェアをリポジトリからプルダウンし、システムにインストールします。
sudo apt-get update
sudo apt-get install phpmyadmin
インストール中に、いくつかの情報の入力を求められます。 ソフトウェアが自動的に設定する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つのセクションでは、新しいphpMyAdmin Webコンソールを保護するための手順を実行します。
[[step-2 -—- change-the-default-phpmyadmin-url]] ==ステップ2—デフォルトのphpMyAdminURLを変更します
この時点で、phpMyAdminのインストールは完全に機能するはずです。 ただし、ウェブインターフェースをインストールすることで、MySQLデータベースサーバーを外部に公開しました。 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
これで、構成したばかりの新しいURLでphpMyAdminインターフェースが使用可能になります。
http://server_domain_or_IP/nothingtosee
認証ゲートウェイを設定することにより、phpMyAdminのインストールをさらに強化できます。
[[step-3 -—- set-up-an-nginx-authentication-gateway]] ==ステップ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
という名前を付けますが、別のユーザー名を選択する必要があります。 ファイルは次のようになります。
/etc/nginx/pma_pass
sammy:O5az.RSPzd.HE
完了したら、ファイルを保存して閉じます。
これで、Nginx構成ファイルを変更する準備が整いました。 テキストエディタで開き、開始します。
sudo nano /etc/nginx/sites-available/default
このファイル内に、新しいlocation
セクションを追加する必要があります。 これは、phpMyAdminインターフェイス用に選択したlocation
を対象とします(このガイドでは/nothingtosee
を選択しました)。
このセクションは、server
ブロック内に作成しますが、他のブロックの外に作成します。 この例では、新しいlocation
ブロックを/
ブロックの下に配置します。
/etc/nginx/sites-available/default
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はユーザーに認証の詳細を求め、入力された値が指定されたファイルで見つかったものと一致することを確認します。
完了すると、ファイルは次のようになります。
/etc/nginx/sites-available/default
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コマンドラインを介して利用可能な機能のほとんどを公開します。 データベースとスキーマを参照し、クエリを実行し、新しいデータセットと構造を作成できます。