序章

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をインストールし、 phpmyadmin デフォルトのUbuntuリポジトリからのパッケージ。

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

  1. sudo apt update

これで、次のコマンドを実行してphpMyAdminをインストールできます。

  1. sudo apt install phpmyadmin

インストールプロセス中に、構成するWebサーバー(ApacheまたはLighttpd)を選択するように求められます。 phpMyAdminは、インストール時にこれらのWebサーバーのいずれかで正しく機能するように、いくつかの構成変更を自動的に行うことができます。 ただし、NginxをWebサーバーとして使用しているため、これらのオプションのいずれかを選択しないでください。 代わりに、 TAB を強調する次にを押します ENTER インストールプロセスを続行します。

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

:前提条件のLEMPスタックチュートリアルステップ2に従ってMySQLをインストールしたとすると、パスワードの検証プラグインを有効にすることを決定した可能性があります。 この記事の執筆時点では、phpMyAdminインストールプロセスが phpmyadmin ユーザーのパスワードを設定しようとすると、このコンポーネントを有効にするとエラーが発生します。

これを解決するには、abortオプションを選択してインストールプロセスを停止します。 次に、MySQLプロンプトを開きます。

  1. sudo mysql

または、 root MySQLユーザーのパスワード認証を有効にした場合は、次のコマンドを実行し、プロンプトが表示されたらパスワードを入力します。

  1. mysql -u root -p

MySQLプロンプトから、次のコマンドを実行して、パスワードの検証コンポーネントを無効にします。 これは実際にはアンインストールされないことに注意してください。ただし、コンポーネントがMySQLサーバーにロードされないようにするだけです。

  1. UNINSTALL COMPONENT "file://component_validate_password";

その後、MySQLクライアントを閉じることができます。

  1. exit

次に、をインストールしてみてください phpmyadmin 再度パッケージ化すると、期待どおりに機能します。

  1. sudo apt install phpmyadmin

phpMyAdminがインストールされると、MySQLプロンプトをもう一度開くことができます。 sudo mysql また mysql -u root -p 次に、次のコマンドを実行して、パスワードの検証コンポーネントを再度有効にします。

  1. INSTALL COMPONENT "file://component_validate_password";

一度 apt install コマンドが完了すると、phpMyAdminが完全にインストールされます。 ただし、Nginx WebサーバーがphpMyAdminファイルを正しく検索して提供するには、インストールファイルからNginxのドキュメントルートディレクトリへのシンボリックリンクを作成する必要があります。 前提条件のLEMPスタックチュートリアルに従った場合、Nginxインストールのドキュメントルートは次のようになります。 /var/www/your_domain/

  1. sudo ln -s /usr/share/phpmyadmin /var/www/your_domain/phpmyadmin

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

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のインストールを見つけて、ブルートフォース攻撃を試みるのがはるかに難しくなります。

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

これを行うには、Nginxドキュメントのルートディレクトリに移動します。

  1. cd /var/www/your_domain/

次に、以下を実行します ls 行う変更をよりよく理解するために、ドキュメントルートディレクトリ内のファイルを一覧表示するコマンド。 このコマンドには、 -l オプション。「ロングリスト」形式を使用するようにコマンドに指示します。 これは指示します ls それ以外の場合よりも多くの情報を返すには:

  1. ls -l

出力には、次のような行が含まれます。

Output
. . . lrwxrwxrwx 1 root root 22 Jan 15 21:09 phpmyadmin -> /usr/share/phpmyadmin/ . . .

この行は、という名前のシンボリックリンクがあることを示しています phpmyadmin このディレクトリにあります。 このリンク名は任意の名前に変更できます。変更すると、phpMyAdminにアクセスできるURLが変更されます。 これは、一般的なエンドポイント名の自動検索を実行するボットからエンドポイントを隠すのに役立ちます。

エンドポイントの目的を隠す名前を選択してください。 このガイドでは、エンドポイントに名前を付けます /hiddenlink 例全体でこの名前を使用しますが、別の名前を選択する必要があります。

シンボリックリンクの名前を mv 指図:

  1. sudo mv phpmyadmin hiddenlink

このコマンドを実行した後、 ls -l シンボリックリンクの名前が正しく変更されたことを確認するために、もう一度コマンドを実行します。

  1. ls -l

今回の出力は、シンボリックリンクのリストが新しい名前で更新されたことを示します。

Output
total 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データベース内に保存されています。 新しいを作成する必要があります config.inc.php phpMyAdminの構成ディレクトリにあるファイルを使用して、カスタム設定を定義します。 phpMyAdminのPHPスクリプトは、 /usr/share/phpmyadmin ディレクトリ、アプリケーションの構成ファイルはにあります /etc/phpmyadmin.

内に新しいカスタム設定ファイルを作成します /etc/phpmyadmin/conf.d ディレクトリと名前を付けます pma_secure.php:

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

次に、次のコンテンツを新しいファイルに追加します。

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

?>

を含めることによって AllowNoPasswordAllowRoot ディレクティブとそれらの両方をに設定する false、この構成ファイルは、パスワードなしのログインと rootMySQLユーザーによるログインをそれぞれ無効にします。

に注意してください auth_type 設定すると、phpMyAdminが使用するように設定されます cookie 認証方法。 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を使用したプログラム:

  1. sudo apt install pwgen

デフォルトでは、 pwgen 安全性は劣りますが、簡単に発音できるパスワードを作成します。 ただし、 -s 次のコマンドのように、フラグを立てると、完全にランダムで覚えにくいパスワードを作成できます。 このコマンドの最後の2つの引数に注意してください。 32、パスワード文字列の長さを指定します pwgen 生成する必要があります。 と 1 これは pwgen 生成する文字列の数:

  1. 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スイートには、この機能が含まれています。

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

  1. openssl passwd

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

Output
9YHV.p60.Cg6I

作成しようとしている認証ファイルにこの値を含める必要があるため、この値をコピーします。

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

  1. sudo nano /etc/nginx/pma_pass

このファイルで、使用するユーザー名を指定し、その後にコロン(:)次に、から受け取ったパスワードの暗号化されたバージョン openssl passwd 効用。

この例では、ユーザーの名前は sammy、ただし、任意のユーザー名を選択できます。 これは、Ubuntuサーバー上の既存のユーザープロファイルの名前またはMySQLユーザーの名前である必要はありません。

選択したユーザー名と以前にコピーした暗号化されたパスワードを追加すると、ファイルは次のようになります。

/ etc / nginx / pma_pass
sammy:9YHV.p60.Cg6I

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

次に、Nginx構成ファイルを変更する必要があります。 繰り返しになりますが、このガイドは前提条件のLEMPチュートリアルで確立された規則に従っているため、次の例で使用される構成ファイルは次のとおりです。 /etc/nginx/sites-available/your_domain. phpMyAdminインストールが現在ホストされているWebの場所に関連するNginx構成ファイルを使用していることを確認してください。

開始するには、お好みのテキストエディタでNginx構成ファイルを開きます。

  1. sudo nano /etc/nginx/sites-available/your_domain

を見つけます server ブロック、および location / その中のセクション。 newを作成する必要があります location この下のセクション location / サーバー上のphpMyAdminの現在のパスに一致するようにブロックします。

このガイドのステップ2で、シンボリックリンクの名前を変更してphpMyAdminの場所の名前を変更したことを思い出してください(hiddenlink この例では)。 ここでは、このシンボリックリンクに使用した名前を入力する必要があります。 フルファイルパスを含める必要はありません。Nginxドキュメントのルートディレクトリに関連するシンボリックリンクの名前だけを含める必要があります。

/ etc / nginx / sites-available / your_domain
server {
        . . .

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

        location ^~ /hiddenlink {

        }

        . . .
}

このブロック内で、2つのディレクティブを設定します。 auth_basic、認証プロンプトに表示されるメッセージを定義し、および auth_basic_user_file、作成したばかりの認証ファイルを指します。 これらのディレクティブの両方を新しいものに追加します location セクション:

/ etc / nginx / sites-available / your_domain
server {
        . . .
        location / {
                try_files $uri $uri/ =404;
        }

        location ^~ /hiddenlink {
                auth_basic "Admin Login";
                auth_basic_user_file /etc/nginx/pma_pass;
        }
        . . .
}

最後に、このブロックには ^~ 新しい場所の定義の前のセレクター。 これは、すべてをキャッチするために正規表現として通常定義されるPHPファイルのルールと一致する場合に、Nginxがアクセスルールをバイパスしないようにするためです。 .php ファイル。 Nginx構成ファイルでは、正規表現の定義が標準の場所の定義よりも優先されます。 これは、私たちが使用しない場合、 ^~ 場所の先頭にあるセレクターの場合でも、ユーザーは次の場所に移動して認証プロンプトをバイパスできます。 http://server_domain_or_ip/hiddenlink/index.php 彼らのブラウザで。

The ^~ 場所定義の先頭にあるセレクターは、この場所に一致するものが見つかったときに他の一致を無視するようにNginxに指示します。 これは、内のサブディレクトリまたはファイルが /hiddenlink/ このルールと一致します。 ただし、PHPファイルを解析するための定義は、 ^~ セレクターの使用法では、新しいPHPロケーションブロックを内部に含める必要があります /hiddenlink 意味。 これにより、この場所にあるPHPファイルが適切に解析されるようになります。 それ以外の場合は、ダウンロードコンテンツとしてブラウザに送信されます。

内に次の強調表示された行を追加します location 追加したブロック:

/ etc / nginx / sites-available / your_domain
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-fpm.sock これは、デフォルトのAPTリポジトリを介してUbuntu20.04にインストールされるバージョンであるPHP7.4で有効です。

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

  1. sudo nginx -t

次の出力は、構成ファイルの構文が有効であることを示しています。

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

新しい認証ゲートをアクティブにするには、Nginxをリロードします。

  1. 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ベースのアクセス制御を対応するで定義できます location ディレクティブを使用した、特定のサイトのブロック allowdeny. たとえば、特定のホストからのリクエストのみを許可する場合は、関連する内部に次の2行をこの順序で含めます。 location 保護したいサイトをブロックします。

allow hostname_or_IP;
deny all;

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

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

  1. curl https://ipinfo.io/ip

このコマンドは、次のようなIPアドレスを返します。

Output
203.0.113.0

このコマンドによって返される値は、ローカルマシンの現在のパブリックIPアドレスです。 phpMyAdminを設定します location そのIPから、またはサーバー自体からローカルに送信される要求のみを許可するようにブロックします。

これを行うには、お好みのテキストエディタを使用してサイトのNginx構成ファイルをもう一度開きます。

  1. sudo nano /etc/nginx/sites-available/your_domain

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

次の強調表示された行をphpMyAdmin構成に追加します location ブロック:

/ etc / nginx / sites-available / your_domain
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アドレスを使用します。

/ etc / nginx / sites-available / your_domain
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;
                }
        }

        . . .
}

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

  1. sudo nginx -t

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

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

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

  1. 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にアクセスする必要があるときはいつでも次のコマンドを実行します。

  1. 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はポートでHTTPトラフィックをリダイレクトします 8000
  • -L 8443:localhost:443はポートでHTTPSトラフィックをリダイレクトします 8443
  • -N :リモートコマンドの実行を防止します

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

次に、ブラウザに移動して、server_domain_or_IPを次のように置き換えます localhost:PORT、 どこ PORT どちらかです 8000 HTTPまたは 8443 HTTPSの場合:

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トンネリングの使用を強制したい場合は、Nginx構成ファイルから他の許可されたIPを削除して、そのままにしておくことができます。 127.0.0.1 その場所へのアクセスを許可された唯一のホストとして。 誰もphpMyAdminに直接リクエストを送信できないことを考えると、セットアップを簡素化するためにHTTP認証を削除しても安全です。 このようなシナリオでは、構成ファイルは次のようになります。

/ etc / nginx / sites-available / your_domain
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の使用方法チュートリアルシリーズにも興味があるかもしれません。