2026年7月2日
2026年7月2日
WordPressのデータベース通信を暗号化する(in transit)設定と確認方法
「通信の暗号化(in transit)」と言うとき、WordPress には性質の違う2つの経路があります。
| 経路 | 暗号化の方法 | 設定する場所 |
|---|---|---|
| 閲覧者のブラウザ ↔ Web サーバー | HTTPS(SSL/TLS 証明書) | Apache / Nginx、サーバー会社の管理画面 |
| Web サーバー(PHP) ↔ DB サーバー | MySQL / MariaDB の TLS 接続 | DB サーバーの設定と wp-config.php |
この記事で扱うのは2つ目の、PHP と DB の間の通信です。Apache の SSLEngine や SSLCertificateFile は1つ目の HTTPS の設定で、DB の通信には関係しません。また、SSLEngine などは .htaccess には書けない(サーバー設定またはバーチャルホストでのみ有効な)ディレクティブです。
暗号化が必要な構成か確認する
wp-config.php の DB_HOST を確認します。
localhostの場合: 多くの環境では PHP は Unix ソケットで同じサーバー内の DB に接続しており、通信はネットワークに出ません。TLS を設定しても得られるものはほとんどありません。- 別のホスト名や IP アドレスの場合: Web サーバーと DB サーバーが分かれていて、通信がネットワークを通ります(VPS の2台構成、Amazon RDS などのマネージド DB)。この構成が暗号化の対象です。
通信がネットワークを通る場合、DB のユーザー名・パスワードを含む認証のやり取りや、会員情報などのクエリ結果が経路上を流れます。決済や個人情報を扱うサイトでは、取引先の監査や業界基準(クレジットカード情報を扱う場合の PCI DSS など)で、内部通信の暗号化を求められることもあります。
手順1: DB サーバー側で TLS が使えるか確認する
DB サーバーに管理ユーザーで接続し、次を実行します。
SHOW GLOBAL VARIABLES LIKE 'tls_version';
SHOW GLOBAL VARIABLES LIKE 'ssl_%';
ssl_cert や ssl_key にファイルのパスが入っていれば、TLS は使える状態です。MySQL 8.0 以降は、証明書が無い場合に起動時に自己署名の証明書を自動生成するのが既定の動作です。MariaDB はバージョンや配布パッケージによって既定が異なるため、上の結果で判断してください(2026年10月時点)。
自前の CA で発行した証明書を使う場合は、my.cnf(MariaDB では server.cnf など)の [mysqld] に指定し、DB を再起動します。
[mysqld]
ssl_ca = /etc/mysql/certs/ca.pem
ssl_cert = /etc/mysql/certs/server-cert.pem
ssl_key = /etc/mysql/certs/server-key.pem
秘密鍵は DB のプロセスだけが読める権限にします。Amazon RDS などのマネージド DB では、サーバー証明書はサービス側が用意しており、クライアントが検証に使う CA 証明書をサービスのドキュメントから入手します。
手順2: mysql コマンドで TLS 接続を試す
WordPress を変える前に、Web サーバーから mysql コマンドで TLS 接続できるかを確かめます。
# MySQL 8.0 以降のクライアント: CA で証明書を検証して接続する
mysql -h db.example.internal -u wp_user -p \
--ssl-mode=VERIFY_CA --ssl-ca=/etc/mysql/certs/ca.pem wordpress
接続後、次のクエリで使われている暗号スイートを確認します。
SHOW SESSION STATUS LIKE 'Ssl_cipher';
値(例: TLS_AES_256_GCM_SHA384)が入っていれば TLS で接続しています。空なら平文です。MariaDB のクライアントでは --ssl-mode の代わりに --ssl と --ssl-ca、--ssl-verify-server-cert などを使います。オプション名はクライアントの種類とバージョンで異なるので、mysql --help で確認してください。
手順3: WordPress 側で TLS 接続を有効にする
WordPress の DB クラス wpdb は、wp-config.php に MYSQL_CLIENT_FLAGS 定数があれば、その値を mysqli の接続フラグとして使います。wp-config.php のバックアップを取ってから、require_once ABSPATH . 'wp-settings.php'; より前に次の1行を追加します。
define( 'MYSQL_CLIENT_FLAGS', MYSQLI_CLIENT_SSL );
指定できるのは PHP の mysqli に実在するフラグだけです。MYSQLI_CLIENT_SSLVERIFYPEER のような定数は存在せず、書くと未定義定数のエラーでサイトが止まります。
サーバー証明書の検証をどこまで行うかは、PHP(mysqlnd)のバージョンや OpenSSL の設定に依存します。WordPress コアには CA 証明書のパスを渡す専用の定数がないため、厳密に検証したい場合の方法や注意点は、次の記事で詳しく説明しています。
手順4: WordPress の接続が暗号化されているか確かめる
wp db query は内部で mysql コマンドを使うため、WordPress(PHP)の接続とは別物です。WordPress の接続そのものを確かめるには、wp eval-file で $wpdb を通してクエリを実行します。
次の内容を check-db-tls.php として WordPress のディレクトリに保存します。
<?php
// check-db-tls.php(確認が終わったら削除する)
global $wpdb;
$row = $wpdb->get_row( "SHOW SESSION STATUS LIKE 'Ssl_cipher'" );
echo ( $row && '' !== $row->Value ) ? 'TLS: ' . $row->Value : 'plain';
echo PHP_EOL;
wp eval-file check-db-tls.php
TLS: に続いて暗号スイート名が表示されれば暗号化されています。WP-CLI が使う PHP(CLI 版)と Web で動く PHP-FPM では php.ini が別のことがあるので、サイトの表示も確認し、「データベース接続確立エラー」が出ていないことを確かめます。
手順5: 平文の接続を拒否する
TLS を「使える」状態にしただけでは、平文の接続も受け付けたままです。WordPress が TLS で接続できることを確認してから、平文を拒否します。
-- WordPress 用のユーザーにだけ TLS を要求する
ALTER USER 'wp_user'@'10.0.0.%' REQUIRE SSL;
MySQL 8.0 以降では、REQUIRE SSL のようなアカウントの属性は GRANT ではなく ALTER USER(または CREATE USER)で設定します。ホスト部分('10.0.0.%')は、実際に Web サーバーから接続してくるアドレスに合わせます。
サーバー全体でネットワーク越しの平文接続を拒否するなら、[mysqld] に require_secure_transport = ON を設定します。この場合はバックアップスクリプトや監視ツールなど、他のクライアントも TLS に対応している必要があります。Unix ソケット経由の接続は安全な経路として扱われ、引き続き許可されます。
運用上の注意
- 証明書の期限: DB サーバーの証明書が期限切れになると、検証を行う設定では接続できなくなります(暗号化されないまま接続が続くのではなく、接続に失敗します)。期限を監視し、更新手順を決めておきます。
- 戻し方: 接続できなくなったときは、wp-config.php の
MYSQL_CLIENT_FLAGSの行をコメントアウトすれば元に戻せます。ただし手順5で平文を拒否した後は戻せないため、手順5は最後に行います。 - 負荷: TLS のハンドシェイクは接続のたびに発生します。WordPress はリクエストごとに DB へ接続し直すため、アクセスの多いサイトでは DB サーバーの CPU 使用率を設定前後で比べておきます。
- 他の対策と組み合わせる: DB のポート(通常 3306)を Web サーバーからだけ受け付けるようにファイアウォールで絞る、WordPress 用の DB ユーザーの権限をそのサイトのデータベースに限る、といった対策もあわせて行います。
まとめ
- ブラウザとの HTTPS と、PHP と DB の間の TLS は別の設定で、Apache の SSL 設定は DB 通信に関係しない
DB_HOSTがlocalhostならソケット接続で、暗号化の必要性は低い- DB 側で TLS を有効にし、mysql コマンドで
Ssl_cipherを確かめてから、wp-config.php にdefine( 'MYSQL_CLIENT_FLAGS', MYSQLI_CLIENT_SSL );を追加する - WordPress の接続が暗号化されているかは
$wpdb経由のSsl_cipherで確認する - 平文の拒否(
ALTER USER ... REQUIRE SSL)は、動作を確認した最後に行う