mita2 database life

主にMySQLに関するメモです

MySQL table_encryption_privilege_check パラメータの挙動

前回の記事ではdefault_table_encryption パラメータについて触れました。 default_table_encryptionでは、ENCRYPTION句を省略した場合の挙動を制御することができます。

今回は、table_encryption_privilege_check パラメータについて確認してみます。 このパラメータを有効化すると、データベース(スキーマ)のENCRYPTIONと異なるENCYRPTIONをテーブル作成時に指定できなくなります。


mysql> SHOW CREATE DATABASE sbtest;
+----------+----------------------------------------------------------------------------------------------------------------------------------+
| Database | Create Database                                                                                                                  |
+----------+----------------------------------------------------------------------------------------------------------------------------------+
| sbtest   | CREATE DATABASE `sbtest` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci */ /*!80016 DEFAULT ENCRYPTION='Y' */ |
+----------+----------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)


mysql> CREATE TABLE t3 (pk SERIAL PRIMARY KEY) ENCRYPTION='N';
ERROR 3826 (HY000): Table encryption differ from its database default encryption, and user doesn't have enough privilege.



同様に、データベースのENCRYPTIONを無効にした場合、デーブル作成時に「ENCRYPTION=Y」を指定できなくなります。


mysql> SHOW CREATE DATABASE sbtest;
+----------+----------------------------------------------------------------------------------------------------------------------------------+
| Database | Create Database                                                                                                                  |
+----------+----------------------------------------------------------------------------------------------------------------------------------+
| sbtest   | CREATE DATABASE `sbtest` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci */ /*!80016 DEFAULT ENCRYPTION='N' */ |
+----------+----------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> CREATE TABLE t4 (pk SERIAL PRIMARY KEY) ENCRYPTION='N';
Query OK, 0 rows affected (0.01 sec)

mysql> CREATE TABLE t5 (pk SERIAL PRIMARY KEY) ENCRYPTION='Y';
ERROR 3826 (HY000): Table encryption differ from its database default encryption, and user doesn't have enough privilege.


データの暗号化を強制することが以下の運用を行うことで実現できます。

  • table_encryption_privilege_check をONにしておく
  • DBAがENCRYPTION=Yを指定したデータベースを作成する
  • 開発者にはそのデータベースにのみ権限を付与する



暗号化強制機能がこのような仕組みで実現されるとは想像していなかったです。
データベースとユーザを分けることで、暗号化強制の有無を切り替えられますし、なかなか便利な実装だと思いました。