以前、MySQL 8.0 ではテーブルスペースや REDO ログ/UNDO ログ・システムテーブルを暗号化しても、ダブルライトバッファには対象データが平文で書き出されていました。
先日、MySQL 関連のオンラインイベントの Q&A で、
あれ、ダブルライトバッファってGA後に実験したときに平文で書かれちゃってたけど、それはもう直ったのか…あらためて試さないと(Q&Aに質問入れたのわたしじゃないけど)。#mysql_jp
— hmatsu47(まつ) (@hmatsu47) August 27, 2020
という話を聞いたので、8.0.17 から順番に確認していきました。
2021/01/31 追記:
MySQL 8.0.23 でダブルライトファイル暗号化がサポートされたとのことだったので、あらためて確認しました。
確認内容
- CentOS 8.2 64 ビット環境で実行
- MySQL 8.0 Community Server の対象バージョンを dnf インストール
- /etc/my.cnf に以下の内容を追記して起動
early-plugin-load=keyring_file.so
keyring_file_data=/var/lib/mysql-keyring/keyring
innodb_redo_log_encrypt=1
innodb_undo_log_encrypt=1
server-id=1
binlog_format=MIXED
binlog_encryption=ON
binlog_rotate_encryption_master_key_at_startup=ON
-
mysql_secure_installation
を実行 - MySQL に暗号化有効でデータを入れる
mysql> ALTER TABLESPACE mysql ENCRYPTION = 'Y';
Query OK, 0 rows affected (2.12 sec)
mysql> CREATE DATABASE encryption_test;
Query OK, 1 row affected (0.01 sec)
mysql> USE encryption_test;
Database changed
mysql> CREATE TABLE enc_test (id INT PRIMARY KEY AUTO_INCREMENT, value VARCHAR(100)) ENGINE=innodb ENCRYPTION='Y';
Query OK, 0 rows affected (0.02 sec)
mysql> INSERT INTO enc_test SET value='234567890ABCDEFGHIJKLMNOPQRSTabcdefghijklmnopqrst1234567890ABCDEFGHIJKLMNOPQRSTabcdefghijklmnopqrst';
Query OK, 1 row affected (0.00 sec)
(計 5 行挿入)
mysql> SET AUTOCOMMIT=0;
Query OK, 0 rows affected (0.00 sec)
mysql> UPDATE enc_test SET value='ENCRYPTED' WHERE id=1;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> COMMIT;
Query OK, 0 rows affected (0.00 sec)
- ファイル検索で確認
# fgrep -r 'ENCRYPTED' /var/lib/mysql
結果
MySQL 8.0.17
# fgrep -r 'ENCRYPTED' /var/lib/mysql
Binary file /var/lib/mysql/ibdata1 matches
8.0.16 の時と同様に見つかりました。
※バイナリエディタで開いてみたところ、対象のデータが(更新前の行に上書きされる形で)見つかりました(ここでは省略)。
MySQL 8.0.18
# fgrep -r 'ENCRYPTED' /var/lib/mysql
今度は見つかりませんでした。
MySQL 8.0.19 以降も同じ結果でした。
MySQL 8.0.18 から暗号化されるようになったことがわかりました。
余談
テストに使ったテーブル名を、
# fgrep -r 'enc_test' /var/lib/mysql
で検索してみたところ、どのバージョンでもテーブル名が見つかりました。
# fgrep -r 'enc_test' /var/lib/mysql
Binary file /var/lib/mysql/ibdata1 matches
# fgrep -r 'enc_test' /var/lib/mysql
Binary file /var/lib/mysql/#ib_16384_0.dblwr matches
バイナリエディタで開いてみたところ、いずれも SQL 文やテーブル定義ではありませんでしたが、いくつかデータベース名やテーブル名が平文で保管されている様子でした。
- Qiitaに投稿したMySQL 8.0関連記事
- MySQL 8.0 の薄い本(無料で配布中!)