スマートスタイル TECH BLOG

MySQLのバイナリログとリレーログの暗号化

MySQL 8.0.14でバイナリログファイルとリレーログファイルが暗号化できるようになりました。

ファイルデータの暗号化には、AES(CTR) が使用されています。
また、パスワードを暗号化する為のマスターキー(暗号化キー)が生成され、生成したキーデータをMySQLのキーリングの仕組みで管理されています。

詳細については以下の2つのリファレンスを参照されると、理解が深まりますので、興味がある方は一読される事をお勧めします。

早速ですが、実際に暗号化を設定して確認してみたいと思います。

暗号化設定前の動作確認

暗号化の設定は binlog_encryption システム変数に ON または 1 を設定する事で有効化されます。
デフォルトでは暗号化設定は無効となっています。

無効になっている状態で、レコードをテーブルに挿入してバイナリログを確認してみます。
まずは、テーブルにデータを挿入します。

バイナリログに挿入した値が含まれる事を確認します。

SHOW BINARY LOGS; の出力結果の EncryptedNo となっている場合は暗号化されていないバイナリログとなります。

バイナリログは文字通りバイナリ形式であるものの、挿入した値を確認する事ができました。
レプリケーション・スレーブサーバのリレーログに関しても同様に挿入した値を確認する事ができます。

暗号化設定

それでは binlog_encryption を有効にして、同じ様に確認してみます。
MySQL Community Edition では、keyring_file プラグインを使用して、生成したマスターキーデータをローカルファイルに保存する為、keyring_file プラグインをインストールする必要があります。
MySQL Enterprise Edition であれば Oracle Key VaultAmazon Web Services Key Management Service でマスターキーを管理する事も可能です。

・MySQL設定ファイル

上記の設定をしてMySQLサービスを再起動する事で、バイナリログがローテーションされて新しい出力先となるバイナリログが暗号化されます。

あるいは、コマンドで設定する事も可能です。
コマンドで設定した場合は binlog_encryption = ON に設定した時点でバイナリログがローテーションされます。
binlog_encryptionの設定には、SUPERまたは BINLOG_ENCRYPTION_ADMIN 権限が必要です。)

暗号化が有効になっている事を確認します。

ローテーション後の新しく生成されたバイナリログが暗号化されている事を確認します。
SHOW BINARY LOGS; の出力結果の EncryptedYes になっている事から暗号化されたバイナリログにローテーションされていると判断できます。

続けて、暗号化設定前確認時と同様に、レコードをテーブルに挿入して確認してみましょう。

バイナリログを確認します。

今度は、挿入した値が抽出できませんでした。
スレーブのリレーログに関しても同様の結果となります。

マスターキーの変更について

MySQLをインストール後、初めてバイナリログの暗号化を有効にした時点で、マスターキーが生成されてキーリングファイルに保存されます。
一度有効にすると、以降、無効にして再度有効にしたとしても、既に存在するマスターキーが使いまわされます。
但し、binlog_rotate_encryption_master_key_at_startup をONに設定すると、MySQLサーバを再起動する度に新しい暗号化キーを生成する事が可能です。

mysqlbinlog コマンド

暗号化されたバイナリログとリレーログを mysqlbinlog コマンドで確認する場合には、注意が必要となります。

まずは試しに、ユーザ、パスワードのみ指定して実行してみます。

ERROR: Reading encrypted log files directly is not supported. のエラーメッセージが返されました。
mysqlbinlog ではキーリングファイルを使用できない為、MySQLサーバからバイナリログを読み込む必要があります。
その為、–read-from-remote-server オプションを指定する必要があります。
(※--read-from-remote-serverオプションを指定するには、実行ユーザに REPLICATION SLAVE 権限が必要となります。)

今度は正常に抽出する事ができました。
また、リモートサーバから暗号化したバイナリログを抽出する際は、バイナリログが存在するMySQLサーバも指定する必要があります。

リモートサーバからも暗号化したバイナリログを抽出する事ができました。
また、暗号化したバイナリログのバックアップを取得する場合は、キーリングファイルも必要となりますので、忘れずに合わせてバックアップを取得しておきましょう。

性能検証

バイナリログの暗号化を無効/有効にした場合とで、sysbenchを使って簡易的な性能検証をしました。

・サーバ(Amazon Web Service / EC2)

サーバースペック
インスタンス m5.2xlarge
OS Amazon Linux release 2
CPU 8(vCPU)
RAM 32(GiB)
Storage プロビジョンドIOPS(1000)

・sysbench

書き込み処理 のみ(oltp_write_only)とし、スレッド数は、8, 16, 32, 64, 128, 256, 512, 1024 で検証します。

・MySQLパラメータ

yumインストールしたデフォルトの my.cnf に以下のパラメータを追加しています。

early-plugin-loadbinlog_encryption は非暗号化検証時はコメントにします。
※MySQL8.0では、バイナリログをディスクに同期させる設定 sync_binlog はデフォルトで 1 に設定されています。

・検証結果

スレッド数 暗号化 TPS QPS Latency (avg)
8 Disable 532.48 3195.09 15.02 ms
8 Enable 531.39 3188.56 15.05 ms
16 Disable 850.27 5102.16 18.82 ms
16 Enable 832.83 4997.57 19.21 ms
32 Disable 1291.24 7748.51 24.78 ms
32 Enable 1271.70 7631.38 25.16 ms
64 Disable 1772.00 10634.99 36.11 ms
64 Enable 1747.41 10487.23 36.62 ms
128 Disable 2298.14 13799.99 55.69 ms
128 Enable 2286.04 13727.48 55.99 ms
256 Disable 3310.31 19898.41 77.32 ms
256 Enable 3285.41 19747.73 77.90 ms
512 Disable 4114.85 24794.20 124.38 ms
512 Enable 4095.47 24675.43 124.99 ms
1024 Disable 4070.87 24659.91 251.46 ms
1024 Enable 4061.71 24600.95 252.01 ms

・TPS (グラフ)

・QPS (グラフ)

・Latency (グラフ)

暗号化の有効・無効で大きな性能の相違は見られませんでした。
また、CPU使用率等のサーバリソースにもほぼ変動はなく、有効化に伴うリスクも心配無さそうです。

まとめ

今回、確認した内容を箇条書きでまとめておきます。

  • バイナリログとリレーログのデータをAES(CTR) で暗号化する。
  • binlog_encryption システム変数で暗号化の有効・無効を切り替える。
    (デフォルト無効)
  • SETコマンドでの切り替えも可能。
    binlog_encryption の設定には、SUPER または BINLOG_ENCRYPTION_ADMIN 権限が必要)
  • SETコマンドで切り替えた際は、実行時点でバイナリログがローテーションする。
  • バイナリログが暗号化されているかどうかは SHOW BINARY LOGS の出力結果項目 Encrypted で確認できる。
  • MySQL Community Edition ではマスターキーデータはローカルファイルに保存する。
  • MySQL Enterprise Edition では Oracle Key VaultAmazon Web Services Key Management Service 等でマスターキーを管理できる。
  • binlog_rotate_encryption_master_key_at_startup を有効にする事で、MySQLサーバを再起動する度にマスターキーをローテーションさせる事ができる。
    (デフォルト無効)
  • 暗号化されたバイナリログ、リレーログを対象に mysqlbinlog 実行時は、--read-from-remote-server オプション指定が必要。
    (実行ユーザに REPLICATION SLAVE 権限が必要)
  • 暗号化されたバイナリログもしくは、リレーログをバックアップする際はキーリングファイルのバックアップも忘れずに。
  • 暗号化を有効にする事による、性能劣化やリソースの上昇は、ほぼ見られなかった。

最近のMySQLでは、メジャーバージョン内でのバージョンアップにおいても、注目されそうな機能リリースが入っていたりするので、見落とさずに確認していきましょう。


MySQL

 

Return Top