MySQLのTLS接続のMitM耐性

MySQLの認証方式のいくつかは、接続がセキュアな場合にパスワードをクリアテキストの形式で送信します。

  • caching_sha2_password / sha256_password (接続がセキュアでない場合は暗号化やハッシュ化を行う)
  • authentication_openid_connect (接続がセキュアな場合のみ使用可能)

この接続がセキュアというのは、Unixソケットを使用しているかTLSを使用しているかのいずれかを意味します。 しかし、TLS接続を使用しているからといって必ずしも安全とは言えません。デフォルト(--ssl-mode=PREFERRED)では特に接続先を検証しないからです。

MySQLでTLSを使う場合に接続先を確認するためには、おおまかにいって次のような方法があります。

  • --ssl-mode=VERIFY_IDENTITY: 一般的なTLSと同じ方法で接続先を検証する。
  • --ssl-mode=VERIFY_CA and --ssl-ca: 自己署名証明書等を使って接続先を検証する。

--ssl-mode=VERYFY_CA はサーバー証明書を検証するだけでホスト名を検証しないのですが、その証明書を発行したCAが他に証明書を発行しない場合にはMitM攻撃に対する耐性があると言えます。なのでOS標準の証明書ストアや --ssl-capath ではなく --ssl-ca を使って、そのMySQLサーバーの自己署名証明書など、攻撃者に証明書を発行させないと信頼できるCAだけをつかって検証するのが大切です。

DBaaSの場合は自己署名証明書ではなくクラウド事業者がDBの証明書を発行する専用のCAを用意している可能性もあるので、そのクラウド事業者のドキュメントをよく読みましょう。

このブログに乗せているコードは引用を除き CC0 1.0 で提供します。