スポンサーリンク

WordPressを外部DBアクセスで運用(更にMySQL接続はSSLにする)方法

今回、とある案件で
WebサーバーとDBサーバーは分けなければならないという案件が来たので
その時に行ったことをメモ。

wp-config.phpを編集するのですが、
「DB_HOST」をlocalhostではなく、そのDBサーバーのサーバー名に変える。
当然、「DB_NAME」、「DB_USER」、「DB_PASSWORD」もそのDBサーバー側の設定値にする。

と、これだけで
DBを外部接続で接続することが出来ます。

ただ、コレだけだと通信が平文なので、
次にSSL化で暗号化してしまいます。

define('MYSQL_CLIENT_FLAGS', MYSQL_CLIENT_SSL);

を同じくwp-config.phpの
DB_COLLATEと認証用ユニークキーの間にでも記述。

これを設定することで
wp-includes/wp-db.phpで使用されている
mysqli_real_connect関数もしくはmysql_query関数で$client_flagsが0
ではなくMYSQL_CLIENT_FLAGSが渡されますのでSSL接続となります。

ちゃんと暗号化されているかは
一時的にwp-includes/wp-db.php編集して
mysqli_fetch_assocかmysql_fetch_assocで
値を見ればよい。

・・・具体的に書くと1374行目のmysql_connectの下に

$res = mysql_query("SHOW STATUS LIKE 'Ssl_cipher'");
var_dump(mysql_fetch_assoc($res));

とか書いてDHE-RSA-AES256-SHAとか値が
入ってきていればOK。(失敗しているとNULLのはず。)
※use_mysqliを使用されている場合は1344行目の方に入ってきますので
mysqli_queryとmysqli_fetch_assocで同様に。

一応、テスト的に内部サーバー使用して
tcpdumpで通信のキャプチャ確認まで行い
暗号化されている事まで確認はしております。

・・・と、まぁ、ここまで書いておきながらなのですが
以下、個人的意見です。(=間違っているかも知れません)

WAN経由で外部接続のDBを分けることって
マシンの負荷分散ぐらいしかメリット無く、
セキュリティ的にはどうなの???と疑問です。
本来、WEBサーバーとDBサーバーを分けるならば
LAN側で分けるのが本来の姿ですよね?

ただ、予算的にも技術的にも自前サーバー組むわけにも行かず、
レンタルサーバーのみで分けるとすれば
こういう方法にならざる得ないという結論でこうしました。 (苦笑

他にもっと良い方法知っているよとか
この方法はセキュリティ的にまずいでしょ?
とか色々ご指導ご鞭撻頂けたら嬉しいです。

[`evernote` not found]