これは インフラ勉強会 Advent Calendar 2018 22 日目の記事です。
昨日(21 日目)は barson_4 さんでした。
MySQL 8.0.13 では、個別のテーブルスペース暗号化(5.7.11 で対応)と REDO ログ/UNDO ログの暗号化(8.0.4 RC で対応)に加えて、一般テーブルスペース(General Tablespace)の暗号化がサポートされました。
- 15.6.3.9 Tablespace Encryption / Enabling and Disabling General Tablespace Encryption(MySQL 8.0 Reference Manual)
一般テーブルスペースとは
**「複数のテーブルの割り当て・格納ができる表領域」**です。MySQL 5.7 で対応した機能です。
それ以前の MySQL(InnoDB)では、
- 全てのテーブルを単一の(実際には指定の容量毎に区切った)ファイルに格納(
innodb_file_per_table=0
) - 全てのテーブルを個別のファイルに格納(
innodb_file_per_table=1
)
のいずれかしか選択できませんでしたが、MySQL 5.7 で一般テーブルスペースをサポートしたことにより、ある程度の単位(DB スキーマ単位など)で 1 つのファイルにテーブルを格納することができるようになりました。
そして MySQL 8.0.13 で、一般テーブルスペースの暗号化をサポートしました。
試してみる
基本的な設定は以下の内容と同じです(innodb_file_per_table=1
にしておく必要あり。但しデフォルトでinnodb_file_per_table=1
)。
この状態で MySQL を起動し、暗号化した一般テーブルスペースを作成してみます。
mysql> CREATE TABLESPACE `ts1` ADD DATAFILE 'ts1.ibd' ENCRYPTION = 'Y' Engine=InnoDB;
Query OK, 0 rows affected (0.11 sec)
MySQL のデータディレクトリにファイルが作成されました。
# cd /var/lib/mysql
# ls -l *.ibd
-rw-r-----. 1 mysql mysql 37748736 Dec 21 14:17 mysql.ibd
-rw-r-----. 1 mysql mysql 131072 Dec 21 14:17 ts1.ibd
次に、このテーブルスペースに 2 つのテーブルを作成し、適当にレコードを挿入します。
mysql> CREATE DATABASE ts1;
Query OK, 1 row affected (0.06 sec)
mysql> USE ts1;
Database changed
mysql> CREATE TABLE table1 (id INT PRIMARY KEY AUTO_INCREMENT, str VARCHAR(100)) TABLESPACE=ts1 Engine=InnoDB;
Query OK, 0 rows affected (0.07 sec)
mysql> INSERT INTO table1 SET str='hoge';
Query OK, 1 row affected (0.05 sec)
mysql> INSERT INTO table1 SET str='fuga';
Query OK, 1 row affected (0.08 sec)
mysql> CREATE TABLE table2 (id INT PRIMARY KEY AUTO_INCREMENT, str VARCHAR(100)) TABLESPACE=ts1 Engine=InnoDB;
Query OK, 0 rows affected (0.02 sec)
mysql> INSERT INTO table2 SET str='FUGA';
Query OK, 1 row affected (0.05 sec)
mysql> INSERT INTO table2 SET str='HOGE';
Query OK, 1 row affected (0.02 sec)
# fgrep hoge *.ibd
# fgrep fuga *.ibd
# fgrep HOGE *.ibd
# fgrep FUGA *.ibd
レコード挿入時に入れた文字列が表示されないことを確認しました。
作成した一般テーブルスペースは、個別のテーブルスペースと同様、途中で暗号化の有効/無効を切り替えることができます。
mysql> ALTER TABLESPACE ts1 ENCRYPTION = 'N';
Query OK, 0 rows affected (0.03 sec)
mysql> INSERT INTO table1 SET str='123';
Query OK, 1 row affected (0.07 sec)
mysql> INSERT INTO table2 SET str='456';
Query OK, 1 row affected (0.03 sec)
# fgrep 123 *.ibd
Binary file mysql.ibd matches
Binary file ts1.ibd matches
# fgrep 456 *.ibd
Binary file mysql.ibd matches
Binary file ts1.ibd matches
# fgrep hoge *.ibd
Binary file ts1.ibd matches
# fgrep fuga *.ibd
Binary file ts1.ibd matches
# fgrep HOGE *.ibd
Binary file ts1.ibd matches
# fgrep FUGA *.ibd
Binary file ts1.ibd matches
暗号化が無効になったので、今度は挿入時に入れた文字列が表示されました。
ちょっと地味な機能追加でした。
次のバージョン(8.0.14)では、いよいよバイナリログの暗号化も対応するのでしょうか…?
インフラ勉強会 Advent Calendar 2018、明日 23 日目は nagashi_ma_w さんです。
- Azureの上にActive Directory を構築したらハマった話(ゆとりエンジニアのアレ)