MySQL 8.0.23 でダブルライトファイル暗号化がサポートされたと聞いて「？」となったのであらためて確認してみた

MySQL 8.0.23 では、ダブルライトファイルの暗号化がサポートされました。

 - **[15.13 InnoDB Data-at-Rest Encryption - Doublewrite File Encryption](https://dev.mysql.com/doc/refman/8.0/en/innodb-data-encryption.html#innodb-doublewrite-file-encryption)（MySQL 8.0 Reference Manual）**

以前、こちらの記事で確認したのですが、

 - **[小ネタ／MySQL 8.0 のダブルライトバッファがどのバージョンで暗号化されるようになったのか調べた](https://qiita.com/hmatsu47/items/3ee2e3c695733124e498)**

**「あれ？ダブルライトバッファ**（ダブルライトファイル含む）**の暗号化ってもうサポートされていたんじゃなかったっけ？」**

となったので、あらためて調べてみました。

# 確認内容

基本的には[前回](https://qiita.com/hmatsu47/items/3ee2e3c695733124e498)と同じです。8.0.22 と 8.0.23 で比較してみました。

 - CentOS 8.2 64 ビット環境で実行
 - MySQL 8.0 Community Server の対象バージョンを dnf インストール
 - /etc/my.cnf に以下の内容を追記して起動

```text: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 に暗号化有効でデータを入れる

```sql: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)
```

 - ファイル検索で確認

```bash:ファイル検索
# fgrep -r 'ENCRYPTED' /var/lib/mysql
# fgrep -r 'enc_test' /var/lib/mysq
```

## 8.0.22 の結果

```bash:8.0.22の結果(1)
# 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 進数表示にしてみました。

```bash:8.0.22ダブルライトファイルを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`は見つからず。

ファイルを閉じて、あらためて検索してみます。

```bash:8.0.22の結果(2)
# 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 で試してみます。

```bash:8.0.23の結果(1)
# fgrep -r 'ENCRYPTED' /var/lib/mysql
# fgrep -r 'enc_test' /var/lib/mysql
```

今度は行データの`ENCRYPTED`、テーブル名の`enc_test`とも見つからず。

`vi`でファイルを開き、`:%!xxd`で 16 進数表示にしてみます。

```bash:8.0.23ダブルライトファイルを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 個のダブルライトファイルも確認してみます。

```bash:2個目のダブルライトファイルを開く
# 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関連記事](https://hmatsu47.hatenablog.com/qiita_mysql80)**
 - **[MySQL 8.0 の薄い本](https://github.com/hmatsu47/mysql80_no_usui_hon)（無料で配布中！）**