MySQL 8.0.23 では、ダブルライトファイルの暗号化がサポートされました。
- 15.13 InnoDB Data-at-Rest Encryption - Doublewrite File Encryption(MySQL 8.0 Reference Manual)
以前、こちらの記事で確認したのですが、
「あれ?ダブルライトバッファ(ダブルライトファイル含む)の暗号化ってもうサポートされていたんじゃなかったっけ?」
となったので、あらためて調べてみました。
確認内容
基本的には前回と同じです。8.0.22 と 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
# fgrep -r 'enc_test' /var/lib/mysq
8.0.22 の結果
# fgrep -r 'ENCRYPTED' /var/lib/mysql
Binary file /var/lib/mysql/#ib_16384_0.dblwr matches
# fgrep -r 'enc_test' /var/lib/mysql
Binary file /var/lib/mysql/#ib_16384_0.dblwr matches
以前試したときには見付からなかった(はずの)ENCRYPTED
の文字が検出されたので、vi
でファイルを開いて(バイナリモード):%!xxd
で 16 進数表示にしてみました。
# vi -b /var/lib/mysql/#ib_16384_0.dblwr
:%!xxd
(略)
00000110: 015b 4e00 0003 0000 0000 061c c100 0001 .[N.............
00000120: 1501 5c0f 656e 6372 7970 7469 6f6e 5f74 ..\.encryption_t
00000130: 6573 7408 656e 635f 7465 7374 001d 000f est.enc_test....
00000140: 656e 6372 7970 7469 6f6e 5f74 6573 7401 encryption_test.
00000150: 0865 6e63 5f74 6573 7401 1001 b74d 0001 .enc_test....M..
00000160: 0320 0000 0006 23c2 0000 0116 0110 0f65 . ....#........e
00000170: 6e63 7279 7074 696f 6e5f 7465 7374 0865 ncryption_test.e
00000180: 6e63 5f74 6573 7402 0404 6016 97e0 0508 nc_test...`.....
00000190: 0000 0000 0000 0002 001d 000f 656e 6372 ............encr
000001a0: 7970 7469 6f6e 5f74 6573 7401 0865 6e63 yption_test..enc
000001b0: 5f74 6573 7401 5b00 0000 0000 0000 0000 _test.[.........
000001c0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
(略)
DB 名・テーブル名は平文で見つかりましたが、行データのENCRYPTED
は見つからず。
ファイルを閉じて、あらためて検索してみます。
# fgrep -r 'ENCRYPTED' /var/lib/mysql
# fgrep -r 'enc_test' /var/lib/mysql
Binary file /var/lib/mysql/#ib_16384_0.dblwr matches
今度は行データのENCRYPTED
は検出されませんでした。
行データについては即時には暗号化されていない可能性が出てきました(8.0.21 以前も同様だった可能性があります)。
DB 名・テーブル名は以前確認したときと同様、平文で見つかりました。
8.0.23 の結果
今度は 8.0.23 で試してみます。
# fgrep -r 'ENCRYPTED' /var/lib/mysql
# fgrep -r 'enc_test' /var/lib/mysql
今度は行データのENCRYPTED
、テーブル名のenc_test
とも見つからず。
vi
でファイルを開き、:%!xxd
で 16 進数表示にしてみます。
# vi -b /var/lib/mysql/#ib_16384_0.dblwr
:%!xxd
00000000: dc63 6afc 0000 010c 0000 0000 0000 0000 .cj.............
00000010: 0000 0000 011b 6115 000f 0000 0002 0000 ......a.........
00000020: 0000 ffff ffef e5ef f58d b0ea 52e0 d00c ............R...
00000030: f372 3eec 88ae d4b8 4834 f28e 9094 b3aa .r>.....H4......
00000040: c8a5 28f3 69a9 ea41 782a c3e7 fdf6 b626 ..(.i..Ax*.....&
00000050: 784d 4060 5042 58ea 040a a878 35e0 8ed6 xM@`PBX....x5...
00000060: 1c12 681f 34ca d53c 9d57 14fb 26f7 0407 ..h.4..<.W..&...
00000070: 5c70 918d 5d10 484a 9c75 e7d2 cc7d d47e \p..].HJ.u...}.~
00000080: 1f66 7297 2448 5de6 f648 948b cbca b20d .fr.$H]..H......
00000090: b50d 76f9 f74d c767 d97f 2d07 c991 2d01 ..v..M.g..-...-.
000000a0: 30b5 c429 4491 0c52 05f8 c6c9 bfe7 d588 0..)D..R........
000000b0: 1e84 4cdb 54d6 dde0 3ce9 8856 bcac 8013 ..L.T...<..V....
000000c0: 5d65 4701 c0f9 fb9a e4c5 bb60 b571 b356 ]eG........`.q.V
000000d0: b70d f37c 104a 4298 fbfe f005 ecba 54c8 ...|.JB.......T.
000000e0: 8d50 3091 0de6 9402 a553 99e8 3e87 d9a5 .P0......S..>...
000000f0: 07fe 2d05 e651 945a 51f4 a2ed 346e 71ef ..-..Q.ZQ...4nq.
00000100: c85e 8935 5284 2c65 ad24 e005 bfce 9e98 .^.5R.,e.$......
00000110: de58 e939 9bac cbce 26d3 e3b9 a9c7 4c6a .X.9....&.....Lj
00000120: db06 9d1a b289 d405 810f 9a32 046e 1b3e ...........2.n.>
00000130: 90ff 1888 aef9 a12a 95c3 d3df 327f 0381 .......*....2...
00000140: 393e 28fc 1274 5661 68b6 fa66 13be 3335 9>(..tVah..f..35
00000150: 67a7 83e8 2d25 bf7c cc5f 3da7 1e85 4f89 g...-%.|._=...O.
00000160: ef88 c634 b1b5 85e8 e5f1 b65c 7566 1744 ...4.......\uf.D
00000170: a6bb 57e5 5013 a935 41e1 b21e 6e7a 2ebe ..W.P..5A...nz..
00000180: 6dc1 f488 3c7a 1c3f 875c 52af 3287 0f6f m...<z.?.\R.2..o
00000190: 794f 54f9 65ea eb43 3387 06d3 dced a255 yOT.e..C3......U
000001a0: 697c 1e17 ae97 9a03 9f9d ef58 726b 5234 i|.........XrkR4
000001b0: 4e2d ec62 e044 c55a 13b7 a4c4 d82e 141a N-.b.D.Z........
000001c0: 4e73 f8ba 9f88 2369 76d3 3fdd e1be 78f8 Ns....#iv.?...x.
000001d0: 1d42 aab7 eb2c 3fec 0a34 8152 fddb 9839 .B...,?..4.R...9
000001e0: 817f da4d 655b bbdd 8025 d39e e2e6 965a ...Me[...%.....Z
000001f0: 0cfe ecdb e760 3a8d 7015 cfbf d407 49cc .....`:.p.....I.
(略)
DB 名・テーブル名含め全体的に暗号化されているようです。
※念のためもう 1 個のダブルライトファイルも確認してみます。
# vi -b /var/lib/mysql/#ib_16384_1.dblwr
---
:%!xxd
00000000: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000010: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000020: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000030: 0000 0000 0000 0000 0000 0000 0000 0000 ................
(略)
こちらはまだ何も記録されていないようでした。
まとめ
実際のところ 8.0.21 以前がどうだったのか疑問は残りますが、8.0.23 ではリリースノートに記されたとおりダブルライトファイル(ダブルライトバッファ用のファイル)も暗号化されるようになっていました。
- Qiitaに投稿したMySQL 8.0関連記事
- MySQL 8.0 の薄い本(無料で配布中!)