さくらのクラウドで、プライベートネットワークのデータベースアプライアンスのphpMyAdminにアクセスする
さくらのクラウドのプライベートネットワーク上に作成した「データベースアプライアンス」の phpMyAdmin に、インターネット経由でアクセスする方法について記載します。
はじめに
さくらのクラウドには、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 にアクセスできるでしょうか?
Webサーバーのリバースプロキシ設定
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 設定は記載しなくてもうまくいくようです。
補足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)
補足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サーバー)がインストールされているのに、使用しないのはもったいないような気がします。
補足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
おわりに
さくらのクラウドのプライベートネットワーク上に作成した「データベースアプライアンス」の phpMyAdmin に、インターネット経由でアクセスする方法についてまとめました。
「データベースアプライアンス」は、最近初めて使用しました。
変更可能なパラメータが少なく、innodb_buffer_pool_size がかなり小さく抑えられている(変更可能)点は注意が必要ですが、作成・設定が簡単ですし、(2024年1月時点では)バックアップが8世代無料で保存されるのはよいですね。
冗長化設定も可能です。
また機会があれば、使ってみたいと思います。