MySQL サーバに SSL 接続

分散配置した MySQL サーバに SSL 接続したい、という需要は当然ある。というわけで、プライベートな認証局と証明書 (自己署名でも可) を使ってMySQL へセキュアに接続する手軽な方法について。

1) 認証局と証明書の作成

see http://www.tc.umn.edu/~brams006/selfsign.html

revoke とかしないんなら、CA.sh を動かしてテンポラリファイルをゴリゴリ作る必要はない。
これは apache の証明書を作る場合も同じなんで、覚えておいて損はない。
サーバ証明書秘密鍵生成時に -des3 を外さないと毎回パスワードを... ってのはお約束。
自己署名証明書なら CA とサーバ証明書秘密鍵を同じにするとよい。

2) mysqld の起動

mysqld の側で必要なファイルはサーバ証明書と、その秘密鍵。my.cnf に以下のように設定すればいい。

[mysqld]
...
ssl_cert=/usr/local/mysql51/etc/server.crt
ssl_key=/usr/local/mysql51/etc/server.key

3) クライアント側

必要なファイルはCAの証明書だけ。こんな感じで接続。

$ mysql -u root --host db.example.com --ssl --ssl-ca=ca.crt --ssl-verify-server-crt

ホスト名のチェックが不要なら、--ssl-verify-server-crt オプションは不要。省略した場合、ca.crt で署名されたサーバ証明書をすべて許可するようになる。


以上が最低限。応用編としては、

  • GRANT ... REQUIRE SSL として、クライアントに SSL 接続を強制
  • クライアント証明の使用

といったあたりがある。詳しくは http://dev.mysql.com/doc/refman/5.1/en/secure-using-ssl.html 参照。