MySQLでクライアント証明書認証

GoogleAppScriptでセッション維持やデータ保持等高度なことをするには、やはりデータベースがないと開発が難しい。
パブリックのサーバレス環境からの接続をセキュアに行うには
①サーバレス環境からのネットワークアドレスのみ接続許可
②強固なユーザ認証方式(十分な強度のパスワードを定期的かつ機械的に変更するか、証明書認証にするかくらい?)
といった対応は必要。

そのため、まずはデータベース側でクライアント証明書を利用した証明書認証を行うべくその設定を行う。
今回、データベースはメジャーなMySQL(正確にはMariaDB)を利用し
準備するサーバ・クライアント証明書共に自己署名証明書とする。

なお、今回MySQLの設定にはこちらのページを参考にした。

TLS証明書作成

Server Key / Cert

秘密鍵(serverkey.pem)および証明書()を作成する。

openssl genrsa -out serverkey.pem 4096
openssl req -new -days 3653 -subj "/CN=server.mydomain" -key serverkey.pem -out servercsr.pem
openssl x509 -days 3653 -req -in servercsr.pem -signkey serverkey.pem -out servercert.pem

Client Key / Cert

openssl genrsa -out clientkey.pem 4096
openssl req -new -days 3653 -subj "/CN=client.mydomain" -key clientkey.pem -out clientcsr.pem
openssl x509 -days 3653 -req -in clientcsr.pem -signkey clientkey.pem -out clientcert.pem

MySQLの設定

my.cnf

以下の設定をmysqldに追加する。

ssl-key=/path/to/serverkey.pem
ssl-cert=/path/to/severcert.pem
ssl-ca=/path/to/clientcert.pem

ssl-caは本来、クライアント証明書を発行しているCAの証明書を指定する。
今回自己署名証明書を利用するので、CA局=自分となり、クライアント証明書を指定することになる。
設定したらMySQL(MariDB)をリロード。

# RHEL 7系の場合
systemctl reload mariadb.service

# 反映確認
mysql -uroot -hlocalhost -e "SHOW VARIABLES LIKE '%SSL%';"

こんな感じの出力になるはず。

+---------------+-------------------------+
| Variable_name | Value                   |
+---------------+-------------------------+
| have_openssl  | YES                     |
| have_ssl      | YES                     |
| ssl_ca        | /path/to/clientcert.pem |
| ssl_capath    |                         |
| ssl_cert      | /path/to/servercert.pem |
| ssl_cipher    |                         |
| ssl_key       | /path/to/serverkey.pem  |
+---------------+-------------------------+

クライアント証明書認証を必須とするユーザ設定

# serverless_db.* に対する全ての権限をserveless_userに与える場合
GRANT ALL ON serverless_db.* TO serverless_user@'%' REQUIRE X509;

接続確認

mysqlクライアントで証明書を利用した接続ができるか確認。

mysql -u${serverless_user} -p${serverless_user_password} --ssl --ssl-key=clientkey.pem --ssl-cert=clientcert.pem ${serverless_db}

–ssl-keyおよび–ssl-certオプションを除いてTLS接続だにしたり、–sslオプションを除いて平文の通信を試みたりし、TLS有効+クライアント証明書指定時でないと接続できなければ正常。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です