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

前書き

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

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

前提条件

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

  • https + debian-9 [Debian 9の初期サーバーセットアップガイド]。 サーバーをまだセットアップしていない場合は、https://www.digitalocean.com/community/tutorials/how-to-install-linux-nginx-mysql-php-lemp-stack-onのガイドに従ってください。 -debian-9 [Debian 9へのLEMPスタックのインストール]。

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

phpMyAdminはMySQLクレデンシャルを使用して認証を処理するため、SSL / TLS証明書をインストールして、サーバーとクライアント間の暗号化されたトラフィックを有効にすることを強くお勧めします。 有効な証明書で構成された既存のドメインがない場合は、https://www.digitalocean.com/community/tutorials/how-to-secure-nginx-with-let-s-encryptのガイドに従ってください。 -on-debian-9 [Debian 9でLet’s Encryptを使用してNginxを保護する方法]。

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

ステップ1-phpMyAdminのインストール

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

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

sudo apt update

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

sudo apt install phpmyadmin

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

次に、アプリケーションデータベースの設定に「+ dbconfig-common 」を使用するかどうかを尋ねられます。 「+はい」を選択します。 これにより、phpMyAdminの内部データベースと管理ユーザーが設定されます。 * phpmyadmin * MySQLユーザーの新しいパスワードを定義するように求められます。 空白のままにして、phpMyAdminでランダムにパスワードを作成することもできます。

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

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

これで、phpMyAdminインストールが動作可能になりました。 インターフェイスにアクセスするには、ウェブブラウザでサーバーのドメイン名またはパブリックIPアドレスの後に「+ / phpmyadmin +」を入力します:

https:///phpmyadmin

image:https://assets.digitalocean.com/articles/phpmyadmin_lemp_1404/login.png [phpMyAdminログイン画面]

前述のように、phpMyAdminはMySQL資格情報を使用して認証を処理します。つまり、通常はコンソールまたはAPIを介してデータベースに接続するために使用するのと同じユーザー名とパスワードを使用する必要があります。 MySQLユーザーの作成についてサポートが必要な場合は、https://www.digitalocean.com/community/tutorials/how-to-manage-sql-database-cheat-sheet#creating-a-user [管理方法SQLデータベース]。

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

ステップ2-phpMyAdminのデフォルトの場所を変更する

phpMyAdminインストールを保護する最も基本的な方法の1つは、見つけにくくすることです。 ボットは、「+ / phpmyadmin」、「+ / pma」、「+ / admin」、「+ / mysql」などの一般的なパスをスキャンします。 インターフェースの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  -> /usr/share/phpmyadmin

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

エンドポイントの目的をわかりにくくする名前を選択してください。 このガイドでは、エンドポイントに「+ / +」という名前を付けますが、別の名前を選択する必要があります。 これを実現するために、リンクの名前を変更します。

sudo mv phpmyadmin
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  -> /usr/share/phpmyadmin

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

https:///phpmyadmin

image:https://assets.digitalocean.com/articles/phpmyadmin_lemp_1604/nginx_notfound.png [phpMyAdmin 404エラー]

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

https:///

image:https://assets.digitalocean.com/articles/phpmyadmin_lemp_1404/login.png [phpMyAdminログイン画面]

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

手順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

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

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

<?php

# PhpMyAdmin Settings
# This should be set to a random string of at least 32 chars
$cfg['blowfish_secret'] = '';

$i=0;
$i++;

$cfg['Servers'][$i]['auth_type'] = 'cookie';
$cfg['Servers'][$i]['AllowNoPassword'] = false;
$cfg['Servers'][$i]['AllowRoot'] = false;

?>

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

image:https://assets.digitalocean.com/articles/phpmyadmin_nginx_1804/pma_access_denied_root_error.png [アクセス拒否]

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

ステップ4-認証ゲートウェイの作成

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

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

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

これを設定するには、最初に認証資格情報を保存するパスワードファイルを作成する必要があります。 Nginxでは、 `+ crypt()+`関数を使用してパスワードを暗号化する必要があります。 サーバーにインストール済みのOpenSSLスイートには、この機能が含まれています。

暗号化されたパスワードを作成するには、次を入力します。

openssl passwd

使用するパスワードの入力と確認を求められます。 ユーティリティは、次のようなパスワードの暗号化されたバージョンを表示します。

Output

この値をコピーします。作成する認証ファイルに貼り付ける必要があります。

次に、認証ファイルを作成します。 このファイルを「+ pma_pass +」と呼び、Nginx構成ディレクトリに配置します。

sudo nano /etc/nginx/pma_pass

このファイルでは、使用するユーザー名を指定し、その後にコロン( )を続けて、 `+ openssl passwd +`ユーティリティから受け取ったパスワードの暗号化バージョンを指定します。

ユーザーに「+ sammy +」という名前を付けますが、別のユーザー名を選択する必要があります。 ファイルは次のようになります。

/ etc / nginx / pma_pass

:

完了したら、ファイルを保存して閉じます。

これで、Nginx構成ファイルを変更する準備が整いました。 このガイドでは、「+ / etc / nginx / sites-available / +」にある設定ファイルを使用します。 phpMyAdminが現在ホストされているWebロケーションに関連するNginx構成ファイルを使用する必要があります。 テキストエディタでこのファイルを開き、開始します。

sudo nano /etc/nginx/sites-available/

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

/ etc / nginx / sites-available / default

server {
   . . .

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

       location / {
               # Settings for phpMyAdmin will go here
       }

   . . .
}

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

/ etc / nginx / sites-available / default

server {
   . . .

       location / {
               auth_basic "";
               auth_basic_user_file ;
       }


   . . .
}

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

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:///

image:https://assets.digitalocean.com/articles/phpmyadmin_lemp_1404/auth_gate.png [Nginx認証ページ]

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

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

ステップ5-暗号化されたトンネルを介したアクセスのセットアップ(オプション)

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

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

より堅牢で長期的なソリューションとして、IPベースのアクセス制御を使用して、ユーザーが_SSHを介して*許可されたIPアドレス*または* localhostからアクセスする場合にのみphpMyAdminインターフェイスにアクセスできるセットアップを作成できます。 tunneling_ *。 これを設定する方法については、以下のセクションで説明します。

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

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

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

allow ;
deny all;

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

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

curl https://ipinfo.io/ip

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

Output

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

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

sudo nano /etc/nginx/sites-available/

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

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

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

server {
   . . .

   location / {
       satisfy all; #requires both conditions

       allow ; #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;
   }

   . . .
}

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:///

image:https://assets.digitalocean.com/articles/phpmyadmin_nginx_1804/403_error.png [403 error]

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

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

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

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

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

*ローカルマシン*から、phpMyAdminへのアクセスが必要な場合は常にこのコマンドを実行します。

ssh user@ -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 *はポート8443でHTTPSトラフィックをリダイレクトします

  • * -N *:リモートコマンドを実行しません

次に、ブラウザに移動して、「+ PORT」がHTTPの場合は「8000」またはHTTPSの場合は「8443」の場合、「+ localhost:PORT」に置き換えます。

http://localhost:/
http://localhost:/

image:https://assets.digitalocean.com/articles/phpmyadmin_lemp_1404/login.png [phpMyAdminログイン画面]

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

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

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

server {
   . . .

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

   . . .
}

「+ sudo systemctl reload nginx +」でNginxの設定をリロードすると、phpMyAdminのインストールがロックダウンされ、リダイレクトされたリクエストを介してphpMyAdminのインターフェースにアクセスするために、ユーザーはSSHトンネルを使用する必要があります。

結論

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

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