Ubuntu20.04サーバーにNginxを使用してphpMyAdminをインストールして保護する方法
序章
WebサイトまたはWebアプリケーションを開発する場合、多くのユーザーはMySQLのようなデータベースシステムの機能を必要とします。 ただし、MySQLコマンドラインクライアントからのみシステムを操作するには、構造化クエリ言語(より一般的には SQL と呼ばれます)に精通している必要があります。これは、一部のユーザーにとって大きな障害となる可能性があります。
phpMyAdmin は、ユーザーがPHP開発環境と並行して実行される直感的なWebインターフェイスを介してMySQLと対話できるようにするために作成されました。 このガイドでは、NginxサーバーにphpMyAdminをインストールする方法について説明します。
注: phpMyAdminはデータベースサーバー上で実行され、データベースクレデンシャルを処理し、ユーザーがデータベースでSQLステートメントを実行できるようにします。 これは、広く展開されているPHPアプリケーションであるという事実と相まって、phpMyAdminが頻繁に攻撃の標的になることを意味します。 悪意のある攻撃者から保護するための適切な手順を実行せずにphpMyAdminをインストールして構成すると、データが失われたり盗まれたりするリスクがあります。
このチュートリアルでは、アプリケーションのインストールに加えて、phpMyAdminインストールのセキュリティを強化するために実行できるいくつかの対策について説明します。 また、十分な情報に基づいて決定を下し、システムを保護できるように、各対策について詳しく説明します。
前提条件
このガイドを完了するには、次のものが必要です。
- Ubuntu20.04を実行しているサーバー。 このサーバーには、管理者権限を持つroot以外のユーザーと、
ufw
で構成されたファイアウォールが必要です。 これを設定するには、Ubuntu20.04の初期サーバー設定ガイドに従ってください。 - Ubuntu 20.04サーバーにインストールされたLEMPスタック(Linux、Nginx、MySQL、およびPHP)。 これらのコンポーネントをインストールして構成するには、 Ubuntu 20.04 にLinux、Nginx、MySQL、PHP(LEMPスタック)をインストールする方法に関するガイドに従ってください。
さらに、phpMyAdminはMySQLクレデンシャルを使用して認証を処理するため、サーバーとクライアント間の暗号化されたトラフィックを有効にするためにSSL/TLS証明書をインストールすることを強くお勧めします。 有効な証明書で構成された既存のドメインがない場合は、 Ubuntu 20.04でLet’sEncryptを使用してNginxを保護するに関するこのガイドに従って、これを設定してください。
警告:サーバーにSSL / TLS証明書がインストールされておらず、続行する場合は、このステップ5 で説明されているように、SSHトンネルを介したアクセスの強制を検討してください。ガイド。
これらの前提条件を整えたら、このガイドのステップ1の手順を開始できます。
ステップ1—phpMyAdminをインストールする
APTを使用してphpMyAdminをインストールし、デフォルトのUbuntuリポジトリからphpmyadmin
パッケージをダウンロードできます。
サーバーのパッケージインデックスを更新することから始めます。
- sudo apt update
これで、次のコマンドを実行してphpMyAdminをインストールできます。
- sudo apt install phpmyadmin
インストールプロセス中に、構成するWebサーバー(ApacheまたはLighttpd)を選択するように求められます。 phpMyAdminは、インストール時にこれらのWebサーバーのいずれかで正しく機能するように、いくつかの構成変更を自動的に行うことができます。 ただし、NginxをWebサーバーとして使用しているため、これらのオプションのいずれかを選択しないでください。 代わりに、TAB
を強調するENTER
インストールプロセスを続行します。
次に、アプリケーションデータベースの構成にdbconfig-common
を使用するかどうかを確認するメッセージが表示されます。 選択する
注:前提条件のLEMPスタックチュートリアルのステップ2に従ってMySQLをインストールしたとすると、パスワードの検証プラグインを有効にすることを決定した可能性があります。 この記事の執筆時点では、phpMyAdminインストールプロセスが phpmyadmin ユーザーのパスワードを設定しようとすると、このコンポーネントを有効にするとエラーが発生します。
これを解決するには、 abort オプションを選択して、インストールプロセスを停止します。 次に、MySQLプロンプトを開きます。
- sudo mysql
または、 root MySQLユーザーのパスワード認証を有効にした場合は、次のコマンドを実行し、プロンプトが表示されたらパスワードを入力します。
- mysql -u root -p
MySQLプロンプトから、次のコマンドを実行して、パスワードの検証コンポーネントを無効にします。 これは実際にはアンインストールされないことに注意してください。ただし、コンポーネントがMySQLサーバーにロードされないようにするだけです。
- UNINSTALL COMPONENT "file://component_validate_password";
その後、MySQLクライアントを閉じることができます。
- exit
次に、phpmyadmin
パッケージを再度インストールしてみてください。これで、期待どおりに機能します。
- sudo apt install phpmyadmin
phpMyAdminをインストールしたら、sudo mysql
またはmysql -u root -p
を使用してMySQLプロンプトをもう一度開き、次のコマンドを実行して[パスワードの検証]コンポーネントを再度有効にします。
- INSTALL COMPONENT "file://component_validate_password";
apt install
コマンドが完了すると、phpMyAdminが完全にインストールされます。 ただし、Nginx WebサーバーがphpMyAdminファイルを正しく検索して提供するには、インストールファイルからNginxのドキュメントルートディレクトリへのシンボリックリンクを作成する必要があります。 前提条件のLEMPスタックチュートリアルに従った場合、Nginxインストールのドキュメントルートは/var/www/your_domain/
です。
- sudo ln -s /usr/share/phpmyadmin /var/www/your_domain/phpmyadmin
これで、phpMyAdminのインストールが機能します。 インターフェイスにアクセスするには、サーバーのドメイン名またはパブリックIPアドレスに移動し、続いてWebブラウザーで/phpmyadmin
に移動します。
https://server_domain_or_IP/phpmyadmin
前述のように、phpMyAdminはMySQLクレデンシャルを使用して認証を処理します。 つまり、phpMyAdminにログインするには、コマンドラインまたはAPIを使用してデータベースに接続するために通常使用するのと同じユーザー名とパスワードを使用します。 MySQLユーザーの作成についてサポートが必要な場合は、SQLデータベースの管理方法に関するこのガイドを確認してください。
注: root MySQLユーザーとしてphpMyAdminにログインすることは、重大なセキュリティリスクを伴うためお勧めできません。 このガイドでは、このガイドのステップ3で、 rootMySQLユーザーとしてのログインを無効にする方法の概要を説明します。
この時点で、phpMyAdminのインストールは完全に機能しています。 ただし、Webインターフェイスをインストールすることにより、MySQLデータベースサーバーを外部に公開することになります。 phpMyAdminは人気があり、大量の機密データへのアクセスを提供する可能性があるため、このようなインストールは攻撃の一般的なターゲットです。 このガイドの次のセクションでは、phpMyAdminのインストールをより安全にするためのいくつかの異なる方法について説明します。
ステップ2—phpMyAdminのデフォルトの場所を変更する
phpMyAdminのインストールを保護する1つの方法は、見つけにくくすることです。 ボットは、/phpmyadmin
、/pma
、/admin
、/mysql
、およびその他の同様の名前などの一般的なパスをスキャンします。 インターフェイスのURLを/phpmyadmin
から非標準のものに変更すると、自動スクリプトがphpMyAdminのインストールを見つけてブルートフォース攻撃を試みることがはるかに困難になります。
前の手順では、実際のphpMyAdminアプリケーションファイルが配置されている/usr/share/phpmyadmin
を指すシンボリックリンクをNginxWebドキュメントルートに作成しました。 このシンボリックリンクの名前を変更して、phpMyAdminのインターフェイスURLを変更できます。
これを行うには、Nginxドキュメントのルートディレクトリに移動します。
- cd /var/www/your_domain/
次に、次のls
コマンドを実行して、ドキュメントルートディレクトリ内のファイルを一覧表示し、行う変更をよりよく理解します。 このコマンドには、-l
オプションが含まれています。このオプションは、「ロングリスト」形式を使用するようにコマンドに指示します。 これにより、ls
は、そうでない場合よりも多くの情報を返すように指示されます。
- ls -l
出力には、次のような行が含まれます。
Output. . .
lrwxrwxrwx 1 root root 22 Jan 15 21:09 phpmyadmin -> /usr/share/phpmyadmin/
. . .
この行は、このディレクトリにphpmyadmin
という名前のシンボリックリンクがあることを示しています。 このリンク名は任意の名前に変更できます。変更すると、phpMyAdminにアクセスできるURLが変更されます。 これは、一般的なエンドポイント名の自動検索を実行するボットからエンドポイントを隠すのに役立ちます。
エンドポイントの目的を隠す名前を選択してください。 このガイドでは、エンドポイントに/hiddenlink
という名前を付け、例全体でこの名前を使用しますが、別の名前を選択する必要があります。
mv
コマンドを使用して、シンボリックリンクの名前を変更します。
- sudo mv phpmyadmin hiddenlink
このコマンドを実行した後、ls -l
コマンドを再度実行して、シンボリックリンクの名前が正しく変更されたことを確認します。
- ls -l
今回の出力は、シンボリックリンクのリストが新しい名前で更新されたことを示します。
Outputtotal 8
. . .
lrwxrwxrwx 1 root root 22 Jan 15 21:09 hiddenlink -> /usr/share/phpmyadmin/
. . .
これで、以前にphpMyAdminにアクセスするために使用したURLにアクセスすると、404エラーが発生します。
https://server_domain_or_IP/phpmyadmin
代わりに、設定したばかりの新しいURLでphpMyAdminインターフェイスにアクセスできます。
https://server_domain_or_IP/hiddenlink
サーバー上のphpMyAdminの実際の場所を隠すことで、自動スキャンや手動のブルートフォース攻撃からインターフェースを保護します。
手順3—ルートログインを無効にする
MySQLの場合、および通常のLinuxシステム内では、 root アカウントは、システムへの無制限のアクセス権を持つ特別な管理アカウントです。 特権アカウントであることに加えて、それは既知のログイン名であり、ブルートフォース攻撃の明らかな標的になります。 これらのリスクを最小限に抑えるために、この手順では、 rootMySQLユーザーからのログイン試行を拒否するようにphpMyAdminを構成する方法の概要を説明します。 このように、ユーザー root に有効な資格情報を提供しても、アクセスが拒否されました!エラーが発生し、ログインが許可されません。
dbconfig-common
を選択してphpMyAdmin設定を構成および保存したため、アプリケーションのデフォルト構成は現在MySQLデータベースに保存されています。 カスタム設定を定義するには、phpMyAdminの構成ディレクトリに新しい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
次に、次のコンテンツを新しいファイルに追加します。
<?php
# PhpMyAdmin Settings
# This should be set to a random string of at least 32 chars
$cfg['blowfish_secret'] = 'CHANGE_THIS_TO_A_STRING_OF_32_RANDOM_CHARACTERS';
$i=0;
$i++;
$cfg['Servers'][$i]['auth_type'] = 'cookie';
$cfg['Servers'][$i]['AllowNoPassword'] = false;
$cfg['Servers'][$i]['AllowRoot'] = false;
?>
AllowNoPassword
およびAllowRoot
ディレクティブを含め、両方をfalse
に設定することにより、この構成ファイルはパスワードなしのログインと rootMySQLユーザーによるログインを無効にします。それぞれ。
auth_type
設定は、cookie
認証方式を使用するようにphpMyAdminを構成することに注意してください。 phpMyAdminはデフォルトでcookie
認証方式を使用します。これにより、Cookiesを使用して有効なMySQLユーザーとしてphpMyAdminにログインできます。 この方法では、MySQLユーザーパスワードは一時的なCookieに Advanced Encryption Standard(AES)アルゴリズムで保存および暗号化されます。
歴史的に、phpMyAdminは代わりにBlowfishアルゴリズムをこの目的で使用していました。 ただし、blowfish_secret
という名前のディレクティブを探します。これは、AESアルゴリズムによって内部的に使用されるパスフレーズを指します。 これは覚えておく必要のあるパスフレーズではないため、32個のランダムな文字を含む任意の文字列がここで機能します。
'CHANGE_THIS_TO_A_STRING_OF_32_RANDOM_CHARACTERS'
を読み取る行を、少なくとも32文字を含むランダムな文字列に更新します。
注:ここに入力するパスフレーズの長さが32文字より短い場合、暗号化されたCookieの安全性が低下します。 ただし、32文字より長い文字列を入力しても、害はありません。
真にランダムな文字列を生成するには、pwgen
プログラムをAPTとともにインストールして使用できます。
- sudo apt install pwgen
デフォルトでは、pwgen
は、安全性は劣りますが、簡単に発音できるパスワードを作成します。 ただし、次のコマンドのように-s
フラグを含めることで、完全にランダムで覚えにくいパスワードを作成できます。 このコマンドの最後の2つの引数に注意してください。32
。これは、パスワード文字列pwgen
が生成する長さを示します。 1
は、pwgen
に生成する文字列の数を通知します。
- pwgen -s 32 1
このコマンドの結果の出力をコピーして、pma_secure.php
ファイルに追加し、'CHANGE_THIS_TO_A_STRING_OF_32_RANDOM_CHARACTERS'
を置き換えます。
編集が完了したら、ファイルを保存して閉じます。 nano
を使用した場合は、CTRL + X
、Y
を押して変更を確認し、ENTER
を押してbashプロンプトに戻ります。
変更は自動的に適用されます。 ここでログインページをリロードしてrootとしてログインしようとすると、アクセスが拒否されました!エラーが発生します。
root MySQLユーザーによるログインは、phpMyAdminのインストールで禁止されるようになりました。 このセキュリティ対策は、ブルートフォーススクリプトがサーバー上のrootデータベースユーザーのパスワードを推測しようとするのをブロックします。 さらに、phpMyAdminのWebインターフェイスにアクセスするための特権の低いMySQLアカウントの使用を強制します。これは、それ自体が重要なセキュリティ慣行です。
##ステップ4—認証ゲートウェイの作成
phpMyAdminのインストールを通常とは異なる場所に隠すと、自動化されたボットがネットワークをスキャンするのを回避できる可能性がありますが、標的型攻撃に対しては役に立ちません。 アクセスが制限されたWebアプリケーションをより適切に保護するには、攻撃者がアプリケーションに到達する前に攻撃者を阻止する方が一般的に効果的です。 このようにすると、一般的なエクスプロイトやブルートフォース攻撃を使用してアクセス資格情報を推測することができなくなります。
phpMyAdminの特定のケースでは、ログインインターフェイスをロックしておくことがさらに重要です。 それを世界に公開し続けることで、攻撃者がデータベースのクレデンシャルを推測するためのブルートフォースプラットフォームを提供します。
この手順では、MySQLデータベースのセキュリティを強化するために、phpMyAdminインストールに認証レイヤーを追加する方法の概要を説明します。 Nginxを含むほとんどのWebサーバーは、この機能をネイティブに提供します。 この手順を完了すると、phpMyAdminインストールのログイン画面にアクセスしようとする人は、最初に有効なユーザー名とパスワードを入力してHTTP認証プロンプトを通過する必要があります。
これを設定するには、最初に認証資格情報を保存するためのパスワードファイルを作成する必要があります。 Nginxでは、crypt()
関数を使用してパスワードを暗号化する必要があります。 デフォルトでUbuntuサーバーにインストールされるOpenSSLスイートには、この機能が含まれています。
暗号化されたパスワードを作成するには、次のように入力します。
- openssl passwd
使用するパスワードを入力して確認するように求められます。 ユーティリティは、次のような暗号化されたバージョンのパスワードを表示します。
Output9YHV.p60.Cg6I
作成しようとしている認証ファイルにこの値を含める必要があるため、この値をコピーします。
次に、認証ファイルを作成します。 このガイドでは、このファイルをpma_pass
と呼び、Nginx構成ディレクトリに配置します。
- sudo nano /etc/nginx/pma_pass
このファイルでは、使用するユーザー名、コロン(:
)、openssl passwd
ユーティリティから受け取ったパスワードの暗号化バージョンを指定します。
この例では、ユーザーの名前はsammy
ですが、任意のユーザー名を選択できます。 これは、Ubuntuサーバー上の既存のユーザープロファイルの名前またはMySQLユーザーの名前である必要はありません。
選択したユーザー名と前にコピーした暗号化されたパスワードを追加すると、ファイルは次のようになります。
sammy:9YHV.p60.Cg6I
終了したら、ファイルを保存して閉じます。
次に、Nginx構成ファイルを変更する必要があります。 繰り返しになりますが、このガイドは前提条件のLEMPチュートリアルで確立された規則に従っているため、次の例で使用される構成ファイルは/etc/nginx/sites-available/your_domain
です。 phpMyAdminインストールが現在ホストされているWebの場所に関連するNginx構成ファイルを使用していることを確認してください。
開始するには、お好みのテキストエディタでNginx構成ファイルを開きます。
- sudo nano /etc/nginx/sites-available/your_domain
server
ブロックと、その中のlocation /
セクションを見つけます。 サーバー上のphpMyAdminの現在のパスと一致させるには、このlocation /
ブロックの下にnew location
セクションを作成する必要があります。
このガイドのステップ2で、シンボリックリンク(この例ではhiddenlink
)の名前を変更して、phpMyAdminの場所の名前を変更したことを思い出してください。 ここでは、このシンボリックリンクに使用した名前を入力する必要があります。 フルファイルパスを含める必要はありません。Nginxドキュメントのルートディレクトリに関連するシンボリックリンクの名前だけを含める必要があります。
server {
. . .
location / {
try_files $uri $uri/ =404;
}
location ^~ /hiddenlink {
}
. . .
}
このブロック内で、認証プロンプトに表示されるメッセージを定義するauth_basic
と、作成した認証ファイルを指すauth_basic_user_file
の2つのディレクティブを設定します。 これらのディレクティブの両方を新しいlocation
セクションに追加します。
server {
. . .
location / {
try_files $uri $uri/ =404;
}
location ^~ /hiddenlink {
auth_basic "Admin Login";
auth_basic_user_file /etc/nginx/pma_pass;
}
. . .
}
最後に、このブロックには、新しい場所の定義の前に^~
セレクターがあることに注意してください。 これは、すべての.php
ファイルをキャッチするために正規表現として通常定義されるPHPファイルのルールと一致する場合に、Nginxがアクセスルールをバイパスしないようにするためです。 Nginx構成ファイルでは、正規表現の定義が標準の場所の定義よりも優先されます。 つまり、場所の先頭で^~
セレクターを使用しない場合でも、ユーザーはブラウザーでhttp://server_domain_or_ip/hiddenlink/index.php
に移動することにより、認証プロンプトをバイパスできます。
ロケーション定義の先頭にある^~
セレクターは、このロケーションに一致するものが見つかったときに他の一致を無視するようにNginxに指示します。 これは、/hiddenlink/
内のすべてのサブディレクトリまたはファイルがこのルールと一致することを意味します。 ただし、^~
セレクターを使用すると、PHPファイルを解析するための定義がスキップされるため、/hiddenlink
定義内に新しいPHPロケーションブロックを含める必要があります。 これにより、この場所にあるPHPファイルが適切に解析されるようになります。 それ以外の場合は、ダウンロードコンテンツとしてブラウザに送信されます。
追加したlocation
ブロック内に次の強調表示された行を追加します。
server {
. . .
location / {
try_files $uri $uri/ =404;
}
location ^~ /hiddenlink/ {
auth_basic "Admin Login";
auth_basic_user_file /etc/nginx/pma_pass;
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
}
}
. . .
}
hiddenlinkをphpMyAdminが見つかる実際のパスに置き換えることを忘れないでください。 また、PHP-FPMソケットファイルの場所を再確認する必要があります。これは、現在インストールしているPHPのバージョンによって異なります。 この例では、PHP7.4に有効なphp7.4-fpm.sock
を使用します。これは、デフォルトのAPTリポジトリを介してUbuntu20.04にインストールされるバージョンです。
完了したら、ファイルを保存して閉じます。 構成ファイルが有効かどうかを確認するには、次のコマンドを実行します。
- sudo nginx -t
次の出力は、構成ファイルの構文が有効であることを示しています。
Outputnginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
新しい認証ゲートをアクティブにするには、Nginxをリロードします。
- sudo systemctl reload nginx
これで、WebブラウザでphpMyAdmin URLにアクセスすると、pma_pass
ファイルに追加したユーザー名とパスワードの入力を求められます。
https://server_domain_or_IP/hiddenlink
クレデンシャルを入力すると、標準のphpMyAdminログインページが表示されます。
注:最近phpMyAdminにアクセスした場合、認証プロンプトが表示されない場合があります。 プロンプトを強制的に表示するには、ページを更新するか、キャッシュをクリアするか、別のブラウザセッションを開く必要がある場合があります。
このゲートウェイは、セキュリティの追加レイヤーを提供するだけでなく、MySQLログからスパム認証の試行を排除するのに役立ちます。
##ステップ5—暗号化されたトンネルを介したアクセスの設定
セキュリティを強化するために、phpMyAdminのインストールを許可されたホストのみにロックダウンすることができます。 Nginx構成ファイルで個々の許可されたホストを指定することにより、phpMyAdminへのアクセスを制限できます。 このようにして、リストにないIPアドレスからの要求はすべて拒否されます。
一部のユースケースではこの機能だけで十分な場合もありますが、主にほとんどの人が静的IPアドレスからインターネットにアクセスしないため、これが常に最良の長期的な解決策であるとは限りません。 インターネットプロバイダーから新しいIPアドレスを取得するとすぐに、Nginx構成ファイルを新しいIPアドレスで更新するまで、phpMyAdminインターフェイスにアクセスできなくなります。
より堅牢で長期的なソリューションとして、IPベースのアクセス制御を使用して、ユーザーが承認済みIPアドレスまたはSSHトンネリング経由のローカルホスト。 以下のセクションでは、これらのアクセス制御の両方を設定する方法について説明します。
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 を開くか、ローカルマシンから次のコマンドを実行できます。
- curl https://ipinfo.io/ip
このコマンドは、次のようなIPアドレスを返します。
Output203.0.113.0
このコマンドによって返される値は、ローカルマシンの現在のパブリックIPアドレスです。 phpMyAdminのlocation
ブロックを構成して、そのIPから、またはサーバー自体からローカルに送信されるリクエストのみを許可します。
これを行うには、お好みのテキストエディタを使用してサイトのNginx構成ファイルをもう一度開きます。
- sudo nano /etc/nginx/sites-available/your_domain
現在の構成にはすでにアクセスルールがあるため、ディレクティブsatisfy all
を使用してIPベースのアクセス制御と組み合わせる必要があります。 このようにして、セキュリティを強化するために現在のHTTP認証プロンプトを保持できます。
次の強調表示された行をphpMyAdmin構成のlocation
ブロックに追加します。
server {
. . .
location ^~ /hiddenlink/ {
satisfy all; #requires both conditions
allow 203.0.113.0; #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;
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
}
}
. . .
}
これは、これらの新しいディレクティブを追加した後のファイルの外観です。 hiddenlink
を、phpMyAdminが見つかる実際のパスに置き換え、強調表示されたIPアドレスをローカルマシンの現在のパブリックIPアドレスに置き換えることを忘れないでください。
server {
. . .
location ^~ /hiddenlink/ {
satisfy all; #requires both conditions
allow 203.0.113.0; #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;
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
}
}
. . .
}
完了したら、ファイルを保存して閉じます。 構成ファイルが有効かどうかを確認するには、次のコマンドを実行します。
- 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 Forbidden
エラーが発生します。
https://server_domain_or_IP/hiddenlink
このガイドの次のサブセクションでは、SSHトンネリングを使用してローカルリクエストを介してWebサーバーにアクセスする方法について詳しく説明します。 このようにして、IPアドレスが変更された場合でも、phpMyAdminのインターフェイスにアクセスできます。
暗号化されたトンネルを介したphpMyAdminへのアクセス
SSHトンネリングは、暗号化されたチャネルを介してネットワークトラフィックをリダイレクトする方法として機能します。 サーバーへのログインに使用するのと同様のssh
コマンドを実行することにより、ローカルマシンとそのサーバーの間に安全な「トンネル」を作成できます。 トンネルを確立した後、特定のローカルポートに着信するすべてのトラフィックは、インターネットに接続する前に、リモートサーバーをプロキシとして使用して、暗号化されたトンネルを介してリダイレクトできます。 これは、仮想プライベートネットワーク(VPN)を使用する場合に発生することと似ていますが、SSHトンネルは通常、セットアップに必要な構成が少なくて済みます。
SSHトンネリングを使用して、phpMyAdminを実行しているリモートWebサーバーにリクエストをプロキシできます。 ローカルマシンとphpMyAdminがインストールされているサーバーの間にトンネルを作成することで、ローカルリクエストをリモートWebサーバーにリダイレクトできます。 さらに重要なことに、トラフィックは暗号化され、リクエストはlocalhostから送信されているかのようにNginxに到達します。 このように、接続元のIPアドレスに関係なく、phpMyAdminのインターフェイスに安全にアクセスできます。
ローカルマシンとリモートWebサーバー間のトラフィックは暗号化されるため、これは、phpMyAdminを実行しているWebサーバーにSSL/TLS証明書をインストールできない状況での安全な代替手段です。
ローカルマシンから、phpMyAdminにアクセスする必要があるときはいつでも次のコマンドを実行します。
- ssh user@server_domain_or_IP -L 8000:localhost:80 -L 8443:localhost:443 -N
コマンドの各部分を調べてみましょう。
- user :phpMyAdminが実行されているサーバーで接続するUbuntuユーザープロファイル
- server_domain_or_IP :phpMyAdminが実行されているSSHホスト
- -L 8000:localhost:80はポート
8000
でHTTPトラフィックをリダイレクトします - -L 8443:localhost:443はポート
8443
でHTTPSトラフィックをリダイレクトします - -N :リモートコマンドの実行を防止します
注:このコマンドは、CTRL+C
を押して中断するまで端末をブロックします。中断すると、SSH接続が終了し、パケットのリダイレクトが停止します。 このコマンドをバックグラウンドモードで実行する場合は、SSHオプション-f
を含めることができます。
次に、ブラウザに移動して、 server_domain_or_IPをlocalhost:PORT
に置き換えます。ここで、PORT
はHTTPの場合は8000
、HTTPSの場合は8443
です。
http://localhost:8000/hiddenlink
https://localhost:8443/hiddenlink
注: HTTPS経由でphpMyAdminにアクセスしている場合、SSL証明書のセキュリティを質問するアラートメッセージが表示される場合があります。 これは、使用しているドメイン名(localhost)が、証明書に登録されているアドレス(つまり、phpMyAdminが実際に提供されているドメイン)と一致しないために発生します。 続行しても安全ですのでご安心ください。
また、Nginx構成ファイルでリダイレクトを設定している場合は、ブラウザセッションを更新するか、URLを再確認する必要がある場合があることに注意してください。
localhost:8000
(HTTP)およびlocalhost:8443
(HTTPS)のすべてのリクエストは、安全なトンネルを介してリモートphpMyAdminアプリケーションにリダイレクトされます。 phpMyAdminへのパブリックアクセスを無効にすることでセキュリティを強化しただけでなく、暗号化されたトンネルを使用してデータを送受信することにより、ローカルコンピューターとリモートサーバー間のすべてのトラフィックを保護しました。
phpMyAdminインターフェイス(あなたを含む)にアクセスしたい人にSSHトンネリングの使用を強制したい場合は、127.0.0.1
をそのままにして、Nginx構成ファイルから他の許可されたIPを削除することでそれを行うことができます。その場所へのアクセスを許可された唯一のホスト。 誰もphpMyAdminに直接リクエストを送信できないことを考えると、セットアップを簡素化するためにHTTP認証を削除しても安全です。 このようなシナリオでは、構成ファイルは次のようになります。
server {
. . .
location ^~ /hiddenlink/ {
allow 127.0.0.1; #allow localhost via SSH tunnels
deny all; #deny all other sources
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
}
}
. . .
}
Nginxの構成をsudo systemctl reload nginx
でリロードすると、phpMyAdminのインストールがロックダウンされ、ユーザーはリダイレクトされたリクエストを介してphpMyAdminのインターフェイスにアクセスするためにSSHトンネルを使用する必要があります
結論
このチュートリアルに従うことで、WebサーバーとしてNginxを実行しているUbuntu20.04にphpMyAdminをインストールしました。 また、 root ログインを無効にする、認証の追加レイヤーを作成する、SSHトンネリングを使用してローカルリクエストのみを介してphpMyAdminインストールにアクセスするなど、UbuntuでphpMyAdminインストールを保護するためのいくつかの高度な方法についても学びました。
このチュートリアルを完了すると、適度に安全なWebインターフェイスからMySQLデータベースを管理できます。 このユーザーインターフェイスは、MySQLコマンドラインを介して利用可能な機能のほとんどを公開します。 データベースとスキーマを参照し、クエリを実行し、新しいデータセットと構造を作成できます。
MySQLの操作について詳しく知りたい場合は、このMySQLのクエリの概要を確認することをお勧めします。 クエリだけでなくSQLをより深く理解するには、SQLの使用方法チュートリアルシリーズにも興味があるかもしれません。