Ubuntu 16.04でNginxを使用してphpMyAdminをインストールして保護する方法

前書き

多くのユーザーは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が依存するmcryptPHPモジュールを有効にする必要があります。 これはphpMyAdminとともにインストールされたため、オンにしてPHPプロセッサを再起動します。

sudo phpenmod mcrypt
sudo systemctl restart php7.0-fpm

これで、phpMyAdminインストールが動作可能になりました。 インターフェースにアクセスするには、サーバーのドメイン名またはパブリックIPアドレスに移動し、続いてWebブラウザーで/phpmyadminに移動します。

http://server_domain_or_IP/phpmyadmin

phpMyAdmin login screen

サインインするには、有効なMySQLユーザーの資格情報のセットを使用します。 たとえば、rootユーザーとMySQL管理パスワードは開始するのに適しています。 その後、管理インターフェースにアクセスできるようになります。

phpMyAdmin admin interface

クリックして、インターフェースに慣れます。

次の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

phpMyAdmin 404 error

これで、構成したばかりの新しいURLでphpMyAdminインターフェースが使用可能になります。

http://server_domain_or_IP/nothingtosee

phpMyAdmin login screen

認証ゲートウェイを設定することにより、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

Nginx authentication page

資格情報を入力すると、標準のphpMyAdminログインページが表示されます。

セキュリティの追加レイヤーを提供することに加えて、このゲートウェイは、MySQLログをスパム認証の試行から保護します。

結論

このチュートリアルを完了すると、合理的に安全なWebインターフェースからMySQLデータベースを管理できるようになりました。 このユーザーインターフェイスは、MySQLコマンドラインを介して利用可能な機能のほとんどを公開します。 データベースとスキーマを参照し、クエリを実行し、新しいデータセットと構造を作成できます。

Related