さくらのクラウドで、プライベートネットワークのデータベースアプライアンスのphpMyAdminにアクセスする

さくらのクラウドのプライベートネットワーク上に作成した「データベースアプライアンス」の phpMyAdmin に、インターネット経由でアクセスする方法について記載します。

isdはじめに

さくらのクラウドには、AWS RDSのような、マネージドRDBとして、「データベースアプライアンス」が用意されています。
2024年1月時点では、データベースエンジンは、MariaDB もしくは PostgreSQL が提供されています。

「データベースアプライアンス」の詳細は、以下のドキュメント等を参照してください。

・アプライアンス「データベース」 – Sakura Cloud Docs
https://manual.sakura.ad.jp/cloud/appliance/database/about.html

「データベースアプライアンス」には「Web UI」というRDBMS管理ツール機能が用意されています。
データベースサーバーの新規作成時に「Web UI」を有効とすると、データベースエンジンが MariaDB であれば、phpMyAdmin が使用できます。

※データベースエンジンが PostgreSQL であれば pgAdmin が使用できるとのことですが、ここでは MariaDB/phpMyAdmin についてのみ記載します。

ここで、以下のような、一般的なWeb+DBサーバー構成を考えます。

  • Webサーバーを作成し、グローバルIPアドレスを付与して https://example.jp/ としてインターネットに公開している。
  • WebサーバーとDBサーバーのプライベートネットワーク接続用に「スイッチ」を作成する。「スイッチ」のネットワークは 192.168.0.0/24 とする。
  • Webサーバーを「スイッチ」に接続する。
  • データベースアプライアンスを作成して、スイッチに接続する。データベースアプライアンスのプライべートIPアドレスは 192.168.0.31 とする。

構成図は以下のとおり。

この phpMyAdmin ですが、「データベースアプライアンス」のサーバー上で稼働しているようで、アクセスURLは
https://192.168.0.31/phpMyAdmin/
となっています。

プライベートIPアドレスでのアクセスとなるので、そのままでは、インターネット経由ではアクセスできません。
どうすれば、phpMyAdmin にアクセスできるでしょうか?

isdWebサーバーのリバースプロキシ設定

Webサーバーでリバースプロキシを設定するのが、手っ取り早いと思います。

今回は、Webサーバーでは、Apache+mod_ssl がインストール済み、SSL証明書が設置済みで、既にHTTPSでWebコンテンツが公開されていることを前提とします。

phpMyAdmin のURLを、https://example.jp/phpMyAdmin/ とし、
Apache のリバースプロキシ設定で、
https://example.jp/phpMyAdmin/ を https://192.168.0.31/phpMyAdmin/ に
転送します。

Apacheのリバースプロキシ設定は以下となります。

SSLProxyEngine On
SSLProxyVerify none
SSLProxyCheckPeerName off
ProxyPass /phpMyAdmin https://192.168.0.31/phpMyAdmin
ProxyPassReverse /phpMyAdmin https://192.168.0.31/phpMyAdmin

 

ProxyPass, ProxyPassReverse は、リバースプロキシの典型的な設定で、URL空間のマッピングとヘッダーの書き替えですね。

そして、此処が重要なポイントですが、
SSLProxyEngine On で、バックエンドHTTPSへのリバースプロキシを有効とします。
SSLProxyVerify none で、バックエンドのSSL証明書の認証を無効とします。
SSLProxyCheckPeerName off で、SSL証明書の CN(CommonName) のチェックを無効とします。

※SSLProxyVerify none, SSLProxyCheckPeerName off がないと、SSL証明書の認証エラーとなります。

さらに、
DBへのログイン画面をインターネットにさらすのは怖いので、BASIC認証ぐらいは設定しておきたいです。

<Location /phpMyAdmin>
    AuthType Basic
    AuthUserFile /etc/httpd/conf/.htpasswd_admin
    AuthName "Server Administrator"
    require valid-user
</Location>

SSLProxyEngine On
SSLProxyVerify none
SSLProxyCheckPeerName off
ProxyPass /phpMyAdmin https://192.168.0.31/phpMyAdmin
ProxyPassReverse /phpMyAdmin https://192.168.0.31/phpMyAdmin

 

さらにさらに、
URLパスから phpMyAdmin を隠してランダム文字列にしてみます。
phpMyAdmin のURL: https://example.jp/admin/ewg1ybv81akv/

<Location /admin>
    AuthType Basic
    AuthUserFile /etc/httpd/conf/.htpasswd_admin
    AuthName "Server Administrator"
    require valid-user
</Location>

SSLProxyEngine On
SSLProxyVerify none
SSLProxyCheckPeerName off
ProxyPass /admin/ewg1ybv81akv https://192.168.0.31/phpMyAdmin
ProxyPassReverse /admin/ewg1ybv81akv https://192.168.0.31/phpMyAdmin
ProxyPassReverseCookieDomain 192.168.0.31 example.jp
ProxyPassReverseCookiePath /phpMyAdmin /admin/ewg1ybv81akv

 

Webサーバーとデータベースアプライアンスで、Cookieのドメインとパスが異なるため、ProxyPassReverseCookieDomain と ProxyPassReverseCookiePath で set-cookie ヘッダのドメインとパスを書き換えます。

(参考)
・FAQ – よくある質問 – phpMyAdminドキュメント
https://docs.phpmyadmin.net/ja/latest/faq.html#when-accessing-phpmyadmin-via-an-apache-reverse-proxy-cookie-login-does-not-work

※ProxyPassReverseCookieDomain 設定は記載しなくてもうまくいくようです。

isd補足1: DBユーザーのアクセス元ホスト

phpMyAdmin でログインするときの、MariaDBへのアクセス元ホストは db-xxxxxxxxxxxx のようになるようです。
DBユーザーのホスト制限としては、データベースアプライアンスのIPアドレスか、プライベートネットワークを指定するとよいでしょう。

mysql> CREATE USER '<user>'@'<データベースアプライアンスのIPアドレス>' IDENTIFIED BY '<パスワード>';

mysql> CREATE USER '<user>'@'<プライベートネットワークのアドレス>' IDENTIFIED BY '<パスワード>';

ex.
mysql> CREATE USER 'wp_user'@'192.168.0.31' IDENTIFIED BY '<パスワード>';

mysql> CREATE USER 'wp_user'@'192.168.0.0/255.255.255.0' IDENTIFIED BY '<パスワード>';

 

phpMyAdminのページは表示されるのに、ログインエラーとなる場合は、さくらのクラウドのコントロールパネル・データベースアプライアンスの「mariadbログ」表示で、エラー理由を確認するとよいでしょう。

2024-01-24 18:50:56 96 [Warning] Access denied for user '<user>'@'db-xxxxxxxxxxxx' (using password: YES)

 

isd補足2: リバースプロキシ以外の解決方法

上記の「Webサーバーでリバースプロキシ設定」以外の解決方法としては、次の2つが考えられます。

1. さくらのクラウドの「VPCルータ」を用意して、ポートフォワードを設定する。
2. Webサーバーに phpMyAdmin をインストール、設定する。(データベースアプライアンスの phpMyAdmin はあきらめる)

1. は、「VPCルータ」のポートフォワーディング機能で、
<VPCルータのグローバルIPアドレス>:8443 を、データベースアプライアンスのプライベートIPアドレス 192.168.0.31:443 に転送すればよいでしょう。
(試していませんが。。)

設定方法としては、さくらのナレッジの以下の記事が参考になりそうです。

・さくらのクラウドのデータベースアプライアンスに外部から接続する手順 – さくらのナレッジ
https://knowledge.sakura.ad.jp/31947/

これで、
https://<VPCルータのグローバルIPアドレス>:8443/phpMyAdmin/
として、インターネット経由で phpMyAdmin にアクセスできそうです
ただし、phpMyAdmin のためだけに「VPCルータ」を用意するのは、料金コスト的にちょっともったいないように思います。

2. は、Webサーバーに phpMyAdmin をインストールして、接続先のDBホストとして、データベースアプライアンスのプライベートIPアドレス 192.168.0.31 を指定します。

$cfg['Servers'][$i]['host'] = '192.168.0.31';

 

これでもよいのですが、phpMyAdmin をインストールする手間がかかるのと、せっかくデータベースアプライアンスに phpMyAdmin(とそれをWeb公開するためのApache/Nginx等のWebサーバー)がインストールされているのに、使用しないのはもったいないような気がします。

isd補足3: データベースアプライアンスのSSL証明書

データベースアプライアンス側に設置されているSSL証明書は自己証明書で、CN(CommonName) は、’db-<データベースアプライアンスのリソースID>‘ となっているようです。
興味のある方は、Webサーバー上で openssl s_client コマンドを実行して、SSL証明書情報を確認するとよいでしょう。

 $ openssl s_client -connect <データベースアプライアンスのプライベートIPアドレス>:443 \
   -servername <データベースアプライアンスのプライベートIPアドレス> < /dev/null \
   2> /dev/null | openssl x509 -text

 

isdおわりに

さくらのクラウドのプライベートネットワーク上に作成した「データベースアプライアンス」の phpMyAdmin に、インターネット経由でアクセスする方法についてまとめました。

「データベースアプライアンス」は、最近初めて使用しました。
変更可能なパラメータが少なく、innodb_buffer_pool_size がかなり小さく抑えられている(変更可能)点は注意が必要ですが、作成・設定が簡単ですし、(2024年1月時点では)バックアップが8世代無料で保存されるのはよいですね。
冗長化設定も可能です。

また機会があれば、使ってみたいと思います。
 

Follow me!