はじめに
2022 年 4 月 26 日に MySQL 8.0.29 がリリースされてしばらく経ちました。
Changes in MySQL 8.0.29 (2022-04-26, General Availability)
今回はこのアップデートの中から、永続化(PERSIST)されたシステム変数のセキュリティに関する新機能について説明させていただきます。
永続化されたシステム変数について
機能について説明する前に、まずは永続化されたシステム変数の仕様について確認します。
MySQL 8.0 からは新しく、SET PERSIST コマンドを利用してグローバルシステム変数を変更することができるようになっています。詳細については、公式のリファレンスや過去のブログ記事でも公開しているのでご参照ください。
このコマンドを使用してグローバルシステム変数を変更した場合、SET GLOBAL コマンドと同様に、実行中のプロセスにおける値が変更されます。
また、データディレクトリ内の mysqld-auto.cnf ファイルに JSON 形式で格納され、次回以降のプロセス起動時、最後に読み取られるようになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
# cat /var/lib/mysql/mysqld-auto.cnf | jq { "Version": 2, "mysql_dynamic_parse_early_variables": { "max_connections": { "Value": "1000", "Metadata": { "Host": "localhost", "User": "root", "Timestamp": 1653005478719174 } } } } |
MySQL 8.0.29 で追加された新機能について
MySQL 8.0.29 では、機密性の高いシステム変数の表示を制限できるようにするため、以下のような機能が追加されています。
persist_sensitive_variables_in_plaintext
このシステム変数によって、機密性の高いシステム変数の値を、暗号化されていない形式で mysqld-auto.cnf に保存できるかどうかを制御します。
デフォルト値の ON のとき、キーリングコンポーネントが利用可能な場合は値を暗号化して、利用できない場合は暗号化せずに保存します。そして、永続化されたシステム変数が設定されたときにキーリングコンポーネントが有効になっていれば、既に保存されていてまだ暗号化されていない機密性の高いシステム変数も暗号化されます。
なお、キーリングコンポーネントについては以下のブログ記事でも利用方法などを説明しているので、こちらをご参照ください。
また、暗号化されたシステム変数を復号化できない場合でもサーバーを起動することができますが、復号化できないシステム変数についてはデフォルト値が適用され、それらの値は復号化できるようになるまで変更することができません。
この値を OFF にすると、キーリングコンポーネントが利用できないとき、機密性の高いシステム変数を永続化させることができず、ER_WARN_CANNOT_PERSIST_SENSITIVE_VARIABLES が返るようになります。
また、暗号化されたシステム変数を復号化できない場合、サーバーを起動することができなくなります。
SENSITIVE_VARIABLES_OBSERVER 権限
新しい動的権限として SENSITIVE_VARIABLES_OBSERVER が追加されました。
機密性の高いシステム変数については、この権限を持っていない場合に SHOW VARIABLES やパフォーマンススキーマの以下のテーブルを参照しても、表示されなくなります。
- global_variables
- session_variables
- variables_by_thread
- persisted_variables
機密性の高いシステム変数
残念ながら MySQL 8.0.29 現在、機密性の高いシステム変数として設定されているものは存在していないようですので、上記の内容について検証することができませんでした。そのため、今後のバージョンで追加されていくことに期待したいと思います。
(…) No MySQL Server system variables are currently marked as sensitive, but the new capability allows system variables containing sensitive data to be persisted securely in the future.
引用 : Changes in MySQL 8.0.29 (2022-04-26, General Availability)
mysqld-auto.cnf のフォーマット
これらの機能追加にともない、永続化されたシステム変数を保存する mysqld-auto.cnf のフォーマットが以下のように変更されています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
New format for mysqld-auto.cnf is as below: { "mysql_static_parse_early_variables": { "variable_name_1" : { "Value" : "variable_value", "Metadata" : { "Timestamp" : timestamp_value, "User" : "user_name", "Host" : "host_name" } } (...省略...) }, "mysql_dynamic_parse_early_variables": { "variable_name_1" : { "Value" : "variable_value", "Metadata" : { "Timestamp" : timestamp_value, "User" : "user_name", "Host" : "host_name" } } (...省略...) }, "mysql_static_variables": { "variable_name_1" : { "Value" : "variable_value", "Metadata" : { "Timestamp" : timestamp_value, "User" : "user_name", "Host" : "host_name" } }, (...省略...) }, "mysql_dynamic_variables": { "variable_name_1" : { "Value" : "variable_value", "Metadata" : { "Timestamp" : timestamp_value, "User" : "user_name", "Host" : "host_name" } }, (...省略...) }, "mysql_sensitive_variables" : { "master_key": "<master_key_name>", "mysql_file_key": "<ENCRYPTED_FILE_KEY_IN_HEX>", "mysql_file_key_iv": "<IV_IN_HEX>", "key_encryption_algorithm": "AES_256_CBC", "mysql_sensitive_variables_blob": "<SENSITIVE_VARIABLES_INFO_IN_ENCRYPTED_FORM_IN_HEX>", "mysql_sensitive_variables_iv": "<IV_IN_HEX>", "data_encryption_algorithm": "AES_256_CBC" } } |
MySQL 8.0.29 以降で永続化されたシステム変数を設定あるいは削除した際、古いフォーマットの mysqld-auto.cnf は新しいものに自動でアップグレードされます。
そのため、MySQL 8.0.29 以降の mysqld-auto.cnf をそれ以前のバージョンにコピーしても、読み取ることができない点に注意してください。
まとめ
ここまで、MySQL 8.0.29 で追加された機密性の高いシステム変数に関する新機能について確認してきました。
まだ実際のシステム変数が実装されておらず、動作を確認することはできませんでしたが、利用するためには MySQL 8.0.24 で追加されたキーリングコンポーネントが必要であったりと、新しい機能が前提となっています。
こうした MySQL のアップデート内容についていけるよう、新バージョンの情報については定期的に確認しておくことをお勧めします。