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

前書き

多くのユーザーはMySQLのようなデータベースシステムの機能を必要としますが、MySQLコマンドラインクライアントからのみシステムと対話するには、SQL言語に精通している必要があります。

phpMyAdminは、ユーザーがPHP開発環境と並行して実行される直感的なWebインターフェイスを介してMySQLと対話できるように作成されました。 このガイドでは、Nginxサーバーの上にphpMyAdminをインストールする方法と、セキュリティを強化するためにサーバーを構成する方法について説明します。

[.note]#Note: phpMyAdminなどのソフトウェアを使用する場合、セキュリティに関する重要な考慮事項があります。phpMyAdminはデータベースサーバー上で実行され、データベースの資格情報を処理し、ユーザーがデータベースに対して任意のSQLクエリを簡単に実行できるようにするためです。 phpMyAdminは広く展開されているPHPアプリケーションであるため、攻撃の標的になることがよくあります。 十分な情報に基づいて決定を下せるように、このチュートリアルで実行できるいくつかのセキュリティ対策について説明します。

前提条件

このガイドを開始する前に、次のものが必要です。

  • initial server setup guide for Ubuntu 18.04で説明されているように、ufwで保護されたLEMP(Linux、Nginx、MySQL、およびPHP)スタックを実行しているUbuntu18.04サーバー。 サーバーをまだセットアップしていない場合は、installing a LEMP stack on Ubuntu 18.04のガイドに従うことができます。

  • sudo権限を持つ非rootユーザーとしてこのサーバーにアクセスします。

phpMyAdminはMySQLクレデンシャルを使用して認証を処理するため、SSL / TLS証明書をインストールして、サーバーとクライアント間の暗号化されたトラフィックを有効にすることを強くお勧めします。 有効な証明書で構成された既存のドメインがない場合は、securing Nginx with Let’s Encrypt on Ubuntu 18.04でこのガイドに従うことができます。

[.warning]#Warning:サーバーにSSL / TLS証明書がインストールされておらず、続行する場合は、このガイドのステップ5で説明されているように、SSHトンネルを介したアクセスの強制を検討してください。

これらの前提条件を満たしたら、残りのガイドに進むことができます。

[[step-1 -—- installing-phpmyadmin]] ==ステップ1—phpMyAdminのインストール

最初に行う必要があるのは、phpMyAdminをLEMPサーバーにインストールすることです。 デフォルトのUbuntuリポジトリを使用して、この目標を達成します。

サーバーのパッケージインデックスを更新することから始めましょう:

sudo apt update

これでphpMyAdminをインストールできます:

sudo apt install phpmyadmin

インストールプロセス中に、構成するWebサーバー(ApacheまたはLighthttp)を選択するように求められます。 NginxをWebサーバーとして使用しているため、ここでは選択しないでください。 tabを押してからOKを押して、次のステップに進みます。

次に、アプリケーションデータベースの構成にdbconfig-commonを使用するかどうかを確認するメッセージが表示されます。 Yesを選択します。 これにより、phpMyAdminの内部データベースと管理ユーザーが設定されます。 phpmyadminMySQLユーザーの新しいパスワードを定義するように求められます。 空白のままにして、phpMyAdminでランダムにパスワードを作成することもできます。

これでインストールが完了します。 Nginx WebサーバーがphpMyAdminファイルを正しく検索して提供するには、インストールファイルからNginxのドキュメントルートディレクトリへのシンボリックリンクを作成する必要があります。

sudo ln -s /usr/share/phpmyadmin /var/www/html/phpmyadmin

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

https://server_domain_or_IP/phpmyadmin

phpMyAdmin login screen

前述のように、phpMyAdminはMySQL資格情報を使用して認証を処理します。つまり、通常はコンソールまたはAPIを介してデータベースに接続するために使用するのと同じユーザー名とパスワードを使用する必要があります。 MySQLユーザーの作成についてサポートが必要な場合は、How To Manage an SQL Databaseでこのガイドを確認してください。

Note:root MySQLユーザーとしてphpMyAdminにログインすることは、重大なセキュリティリスクを表すためお勧めできません。 このガイドの次のステップで、root loginを無効にする方法を説明します。

この時点で、phpMyAdminのインストールは完全に機能するはずです。 ただし、ウェブインターフェースをインストールすることで、MySQLデータベースサーバーを外部に公開しました。 phpMyAdminは人気があり、大量のデータがアクセスする可能性があるため、このようなインストールは一般的な攻撃の標的です。 このガイドの以下のセクションでは、phpMyAdminのインストールをより安全にするためのいくつかの方法を紹介します。

[[step-2 -—- changing-phpmyadmin-39-s-default-location]] ==ステップ2—phpMyAdminのデフォルトの場所を変更する

phpMyAdminインストールを保護する最も基本的な方法の1つは、見つけにくくすることです。 ボットは、phpmyadminpmaadminmysqlなどの一般的なパスをスキャンします。 インターフェイスのURLを/phpmyadminから非標準のものに変更すると、自動化されたスクリプトがphpMyAdminインストールを見つけてブルートフォース攻撃を試みることがはるかに困難になります。

phpMyAdminのインストールで、実際のアプリケーションファイルが配置されている/usr/share/phpmyadminを指すシンボリックリンクを作成しました。 phpMyAdminのインターフェースURLを変更するには、このシンボリックリンクの名前を変更します。

まず、Nginxドキュメントのルートディレクトリに移動し、そこに含まれるファイルを一覧表示して、変更の内容を把握します。

cd /var/www/html/
ls -l

次の出力が表示されます。

Outputtotal 8
-rw-r--r-- 1 root root 612 Apr  8 13:30 index.nginx-debian.html
lrwxrwxrwx 1 root root  21 Apr  8 15:36 phpmyadmin -> /usr/share/phpmyadmin

出力は、このディレクトリにphpmyadminというシンボリックリンクがあることを示しています。 このリンク名は自由に変更できます。 これにより、phpMyAdminアクセスURLが変更され、一般的なエンドポイント名を検索するためにハードコードされたボットからエンドポイントを不明瞭にすることができます。

エンドポイントの目的をわかりにくくする名前を選択してください。 このガイドでは、エンドポイントに/nothingtoseeという名前を付けますが、あなたはshould choose an alternate nameに名前を付けます。 これを実現するために、リンクの名前を変更します。

sudo mv phpmyadmin nothingtosee
ls -l

上記のコマンドを実行すると、次の出力が表示されます。

Outputtotal 8
-rw-r--r-- 1 root root 612 Apr  8 13:30 index.nginx-debian.html
lrwxrwxrwx 1 root root  21 Apr  8 15:36 nothingtosee -> /usr/share/phpmyadmin

これで、古いURLにアクセスすると、404エラーが表示されます:

https://server_domain_or_IP/phpmyadmin

phpMyAdmin 404 error

phpMyAdminインターフェースは、設定したばかりの新しいURLで利用可能になります。

https://server_domain_or_IP/nothingtosee

phpMyAdmin login screen

サーバー上のphpMyAdminの実際の場所を難読化することで、自動化されたスキャンや手動の総当たり攻撃からインターフェイスを保護します。

[[step-3 -—- disabling-root-login]] ==ステップ3—ルートログインの無効化

MySQLおよび通常のLinuxシステムでは、rootアカウントは、システムへの無制限のアクセス権を持つ特別な管理アカウントです。 特権アカウントであることに加えて、それは既知のログイン名であるため、ブルートフォース攻撃の明らかな標的になります。 リスクを最小限に抑えるために、ユーザーrootからのログイン試行を拒否するようにphpMyAdminを構成します。 このように、ユーザーrootに有効な資格情報を提供しても、「アクセスが拒否されました」というエラーが表示され、ログインが許可されません。

phpMyAdmin設定の構成と保存にdbconfig-commonを使用することを選択したため、現在、デフォルトの構成がデータベースに保存されています。 カスタム設定を定義するには、新しいconfig.inc.phpファイルを作成する必要があります。

phpMyAdminのPHPファイルは/usr/share/phpmyadmin内にありますが、アプリケーションは/etc/phpmyadminにある構成ファイルを使用します。 /etc/phpmyadmin/conf.d内に新しいカスタム設定ファイルを作成し、pma_secure.phpという名前を付けます。

sudo nano /etc/phpmyadmin/conf.d/pma_secure.php

次の構成ファイルには、パスワードなしのログイン(AllowNoPasswordfalseに設定)およびルートログイン(AllowRootfalseに設定)を無効にするために必要な設定が含まれています。

/etc/phpmyadmin/conf.d/pma_secure.php

編集が完了したら、CTRL +X、次にyを押して変更を確認し、ENTERを押してファイルを保存します。 変更は自動的に適用されます。 ここでログインページをリロードしてrootとしてログインしようとすると、Access Deniedエラーが発生します。

access denied

ルートログインは、phpMyAdminインストールで禁止されています。 このセキュリティ対策は、ブルートフォーススクリプトがサーバー上のrootデータベースパスワードを推測しようとするのをブロックします。 さらに、phpMyAdminのウェブインターフェースにアクセスするために、権限の低いMySQLアカウントの使用を強制します。これは、それ自体が重要なセキュリティ慣行です。

[[step-4 -—- creating-an-authentication-gateway]] ==ステップ4—認証ゲートウェイの作成

phpMyAdminインストールを通常とは異なる場所に非表示にすると、ネットワークをスキャンする一部の自動化されたボットを回避できますが、標的型攻撃に対しては役に立ちません。 アクセスが制限されたWebアプリケーションをより適切に保護するには、攻撃者がアプリケーションに到達する前に攻撃者を阻止する方が一般に効果的です。 この方法では、一般的なエクスプロイトやブルートフォース攻撃を使用してアクセス資格情報を推測できなくなります。

phpMyAdminの特定のケースでは、ログインインターフェイスをロックしておくことがさらに重要です。 世界中に公開することで、攻撃者がデータベース認証情報を推測するためのブルートフォースプラットフォームを提供します。

phpMyAdminインストールに追加の認証レイヤーを追加すると、セキュリティを強化できます。 ユーザーは、phpMyAdminログイン画面が表示される前に、HTTP認証プロンプトを通過する必要があります。 Nginxを含むほとんどのWebサーバーは、この機能をネイティブで提供します。

これを設定するには、最初に認証資格情報を保存するパスワードファイルを作成する必要があります。 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構成ファイルを変更する準備が整いました。 このガイドでは、/etc/nginx/sites-available/example.comにある構成ファイルを使用します。 phpMyAdminが現在ホストされているWebロケーションに関連するNginx構成ファイルを使用する必要があります。 テキストエディタでこのファイルを開き、開始します。

sudo nano /etc/nginx/sites-available/example.com

serverブロックと、その中のlocation /セクションを見つけます。 サーバー上のphpMyAdminの現在のパスと一致するように、このブロック内にnewlocationセクションを作成する必要があります。 このガイドでは、Webルートに対するphpMyAdminの場所は/nothingtoseeです。

/etc/nginx/sites-available/default

server {
    . . .

        location / {
                try_files $uri $uri/ =404;
        }

        location /nothingtosee {
                # Settings for phpMyAdmin will go here
        }

    . . .
}

このブロック内で、2つの異なるディレクティブを設定する必要があります。認証プロンプトに表示されるメッセージを定義するauth_basicと、作成したファイルを指すauth_basic_user_fileです。 終了したら、構成ファイルは次のようになります。

/etc/nginx/sites-available/default

server {
    . . .

        location /nothingtosee {
                auth_basic "Admin Login";
                auth_basic_user_file /etc/nginx/pma_pass;
        }


    . . .
}

完了したら、ファイルを保存して閉じます。 構成ファイルが有効かどうかを確認するには、次を実行できます。

sudo nginx -t

次の出力が期待されます。

Outputnginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

新しい認証ゲートをアクティブにするには、Webサーバーをリロードする必要があります。

sudo systemctl reload nginx

これで、WebブラウザでphpMyAdmin URLにアクセスすると、pma_passファイルに追加したユーザー名とパスワードの入力を求められるはずです。

https://server_domain_or_IP/nothingtosee

Nginx authentication page

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

Note:ページの更新が機能しない場合、すでにphpMyAdminを使用している場合は、キャッシュをクリアするか、別のブラウザセッションを使用する必要があります。

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

[[step-5 -—- setting-up-access-via-encrypted-tunnels-optional]] ==ステップ5—暗号化されたトンネルを介したアクセスの設定(オプション)

セキュリティを強化するために、phpMyAdminインストールを許可されたホストのみにロックダウンすることができます。 Nginx構成ファイルで許可されたホストをwhitelistできるため、リストにないIPアドレスからの要求はすべて拒否されます。

一部のユースケースではこの機能だけで十分な場合もありますが、主にほとんどの人が静的IPアドレスからインターネットにアクセスしないという事実により、常に最良の長期ソリューションとは限りません。 インターネットプロバイダーから新しいIPアドレスを取得すると、Nginx構成ファイルを新しいIPアドレスで更新するまで、phpMyAdminインターフェイスにアクセスできなくなります。

より堅牢な長期ソリューションとして、IPベースのアクセス制御を使用して、ユーザーがauthorized IP addressまたはlocalhost via SSH tunnelingのいずれかからアクセスしている場合にのみphpMyAdminインターフェイスにアクセスできるようにする設定を作成できます。 s。 これを設定する方法については、以下のセクションで説明します。

IPベースのアクセス制御とSSHトンネリングを組み合わせると、暗号化されたトンネルを使用してユーザーとサーバー間に安全なチャネルを提供することに加えて、パブリックインターネット(承認されたIPを除く)からのアクセスを完全にブロックするため、セキュリティが大幅に向上します。

NginxでのIPベースのアクセス制御のセットアップ

Nginxでは、IPベースのアクセス制御は、ディレクティブallowおよびdenyを使用して、特定のサイトの対応するlocationブロックで定義できます。 たとえば、特定のホストからのリクエストのみを許可する場合は、保護するサイトの関連するlocationブロック内に、次の2行をこの順序で含める必要があります。

allow hostname_or_IP;
deny all;

必要な数のホストを許可できます。保護するサイトのそれぞれのlocationブロック内に、承認されたホスト/ IPごとに1つのallow行を含めるだけで済みます。 ディレクティブは、一致が見つかるか、deny allディレクティブが原因で要求が最終的に拒否されるまで、リストされているのと同じ順序で評価されます。

localhostまたは現在のIPアドレスからのリクエストのみを許可するようにNginxを設定します。 まず、ローカルマシンがインターネットへの接続に使用している現在のパブリックIPアドレスを知る必要があります。 この情報を取得するにはさまざまな方法があります。簡単にするために、ipinfo.ioによって提供されるサービスを使用します。 ブラウザでURLhttps://ipinfo.io/ipを開くか、local machineから次のコマンドを実行できます。

curl https://ipinfo.io/ip

次のように、出力として単純なIPアドレスを取得する必要があります。

Output203.0.113.111

これが現在のpublicのIPアドレスです。 localhostに加えて、そのIPからのリクエストのみを許可するようにphpMyAdminのロケーションブロックを設定します。 /etc/nginx/sites-available/example.com内のphpMyAdminの構成ブロックをもう一度編集する必要があります。

選択したコマンドラインエディターを使用してNginx構成ファイルを開きます。

sudo nano /etc/nginx/sites-available/example.com

現在の構成にはすでにアクセスルールがあるため、ディレクティブsatisfy allを使用してIPベースのアクセス制御と組み合わせる必要があります。 これにより、現在のHTTP認証プロンプトを保持してセキュリティを強化できます。

これは、編集が完了した後のphpMyAdmin Nginxの構成の様子です。

/etc/nginx/sites-available/example.com

server {
    . . .

    location /nothingtosee {
        satisfy all; #requires both conditions

        allow 203.0.113.111; #allow your IP
        allow 127.0.0.1; #allow localhost via SSH tunnels
        deny all; #deny all other sources

        auth_basic "Admin Login";
        auth_basic_user_file /etc/nginx/pma_pass;
    }

    . . .
}

nothingtoseeを、phpMyAdminが見つかる実際のパスに置き換え、強調表示されたIPアドレスを現在のパブリックIPアドレスに置き換えることを忘れないでください。

完了したら、ファイルを保存して閉じます。 構成ファイルが有効かどうかを確認するには、次を実行できます。

sudo nginx -t

次の出力が期待されます。

Outputnginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

次に、変更を有効にするためにWebサーバーをリロードします。

sudo systemctl reload nginx

IPアドレスは承認済みホストとして明示的にリストされているため、アクセスを妨げないでください。 phpMyAdminインストールにアクセスしようとすると、403エラー(禁止)が表示されます:

https://server_domain_or_IP/nothingtosee

403 error

次のセクションでは、SSHトンネリングを使用してローカルリクエストを介してWebサーバーにアクセスする方法について説明します。 これにより、IPアドレスが変更された場合でも、phpMyAdminのインターフェースにアクセスできます。

暗号化されたトンネルを介したphpMyAdminへのアクセス

SSHトンネリングは、暗号化されたチャネルを介してネットワークトラフィックをリダイレクトする方法として機能します。 サーバーへのログインに使用するのと同様のsshコマンドを実行することにより、ローカルマシンとそのサーバーの間に安全な「トンネル」を作成できます。 特定のローカルポートに着信するすべてのトラフィックは、暗号化されたトンネルを介してリダイレクトされ、インターネットに到達する前にプロキシとしてリモートサーバーを使用できるようになりました。 VPN(Virtual Private Network)を使用した場合と似ていますが、SSHトンネリングの設定ははるかに簡単です。

SSHトンネリングを使用して、phpMyAdminを実行しているリモートWebサーバーにリクエストをプロキシします。 ローカルマシンとphpMyAdminがインストールされているサーバーの間にトンネルを作成することで、ローカルリクエストをリモートウェブサーバーにリダイレクトできます。さらに重要なのは、トラフィックが暗号化され、リクエストが%(()から送信されたかのようにNginxに到達することです。 t0)s。 これにより、接続元のIPアドレスに関係なく、phpMyAdminのインターフェースに安全にアクセスできます。

ローカルマシンとリモートウェブサーバー間のトラフィックは暗号化されるため、これはphpMyAdminを実行しているウェブサーバーにSSL / TLS証明書をインストールできない場合の安全な代替手段です。

From your local machine、phpMyAdminにアクセスする必要があるときはいつでもこのコマンドを実行します。

ssh user@server_domain_or_IP -L 8000:localhost:80 -L 8443:localhost:443 -N

コマンドの各部分を調べてみましょう。

  • user:phpMyAdminが実行されているサーバーに接続するためのSSHユーザー

  • hostname_or_IP:phpMyAdminが実行されているSSHホスト

  • -L 8000:localhost:80はポート8000​​でHTTPトラフィックをリダイレクトします

  • -L 8443:localhost:443はHTTPSトラフィックをポート8443にリダイレクトします

  • -N:リモートコマンドを実行しない

[.note]#Note:このコマンドは、CTRL+Cで中断されるまで端末をブロックします。中断されると、SSH接続が終了し、パケットのリダイレクトが停止します。 このコマンドをバックグラウンドモードで実行する場合は、SSHオプション-f
#を使用できます。

次に、ブラウザに移動して、server_domain_or_IPlocalhost:PORTに置き換えます。PORTはHTTPの場合は8000、HTTPSの場合は8443です。

http://localhost:8000/nothingtosee
https://localhost:443/nothingtosee

phpMyAdmin login screen

[.note]#Note:https経由でphpMyAdminにアクセスしている場合、SSL証明書のセキュリティを質問するアラートメッセージが表示される場合があります。 これは、使用しているドメイン名(localhost)が、証明書に登録されているアドレス(phpMyAdminが実際に提供されているドメイン)と一致しないために発生します。 続行しても安全です。

localhost:8000(HTTP)およびlocalhost:8443(HTTPS)でのすべてのリクエストは、安全なトンネルを介してリモートphpMyAdminアプリケーションにリダイレクトされるようになりました。 phpMyAdminへのパブリックアクセスを無効にしてセキュリティを強化しただけでなく、暗号化されたトンネルを使用してデータを送受信することにより、ローカルコンピューターとリモートサーバー間のすべてのトラフィックを保護しました。

phpMyAdminインターフェイス(あなたを含む)にアクセスしたい人にSSHトンネリングの使用を強制したい場合は、Nginx構成ファイルから他の許可されたIPを削除し、127.0.0.1をそのままにしておくことでそれを行うことができます。ホストにその場所へのアクセスのみを許可しました。 誰もphpMyAdminに直接リクエストを送信できないことを考慮すると、セットアップを簡素化するためにHTTP認証を削除しても安全です。 このようなシナリオでは、構成ファイルは次のようになります。

/etc/nginx/sites-available/example.com

server {
    . . .

    location /nothingtosee {
        allow 127.0.0.1; #allow localhost only
        deny all; #deny all other sources
    }

    . . .
}

Nginxの構成をsudo systemctl reload nginxでリロードすると、phpMyAdminのインストールがロックダウンされ、ユーザーはrequiredでSSHトンネルを使用して、リダイレクトされたリクエストを介してphpMyAdminのインターフェースにアクセスできるようになります。

結論

このチュートリアルでは、NginxをWebサーバーとして実行しているUbuntu 18.04にphpMyAdminをインストールする方法を見ました。 また、ルートログインの無効化、認証の追加レイヤーの作成、SSHトンネリングを使用したローカルリクエストのみによるphpMyAdminインストールへのアクセスなど、UbuntuでphpMyAdminインストールを保護する高度な方法についても説明しました。

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

Related