MySQL 表空間加密插件 Keyring
本文轉(zhuǎn)載自微信公眾號「數(shù)據(jù)和云」,作者楊明翰 。轉(zhuǎn)載本文請聯(lián)系數(shù)據(jù)和云公眾號。
前言
MySQL支持對InnoDB單表空間、通用表空間、系統(tǒng)表空間和Redo、Undo文件進行靜態(tài)加密。從8.0.16開始支持對Schema和通用表空間設(shè)置加密默認(rèn)值,這就允許對在這些Schema和表空間中的表是否加密進行統(tǒng)一控制;靜態(tài)加密功能依賴于Keyring組件或插件,MySQL社區(qū)版提供的Keyring file插件會將Keyring數(shù)據(jù)存儲在服務(wù)器主機的本地文件系統(tǒng)中。
01 安裝
- mkdir /usr/local/mysql/keyring
- chown -R mysql.mysql keyring
- 配置文件中增加
- [mysqld]early-plugin-load=keyring_file.sokeyring_file_data=/usr/local/mysql/keyring/keyring
- 重啟數(shù)據(jù)庫
- mysql> select * from information_Schema.plugins where plugin_name like '%keyring%'\G
- *************************** 1. row ***************************
- PLUGIN_NAME: keyring_file
- PLUGIN_VERSION: 1.0
- PLUGIN_STATUS: ACTIVE
- PLUGIN_TYPE: KEYRING
- PLUGIN_TYPE_VERSION: 1.1
- PLUGIN_LIBRARY: keyring_file.so
- PLUGIN_LIBRARY_VERSION: 1.10
- PLUGIN_AUTHOR: Oracle Corporation
- PLUGIN_DESCRIPTION: store/fetch authentication data to/from a flat file
- PLUGIN_LICENSE: GPL
- LOAD_OPTION: ON
- mysql> show global variables like '%keyring%';
- +--------------------+----------------------------------+
- | Variable_name | Value |
- +--------------------+----------------------------------+
- | keyring_file_data | /usr/local/mysql/keyring/keyring |
- | keyring_operations | ON |
- +--------------------+----------------------------------+
- 2 rows in set (0.02 sec)
02 加密操作
- mysql> alter table t7 encryption='Y'; Query OK, 2 rows affected (0.10 sec)
- Records: 2 Duplicates: 0 Warnings: 0
- mysql> alter table t2 encryption='Y';
- Query OK, 1 row affected (0.11 sec)
- Records: 1 Duplicates: 0 Warnings: 0
- mysql> alter database test DEFAULT ENCRYPTION = 'Y';
- Query OK, 1 row affected (0.03 sec)
- mysql> ALTER TABLESPACE mysql ENCRYPTION = 'Y';
- Query OK, 0 rows affected (2.80 sec)
03 取消加密
- mysql> alter table t2 encryption='N';
- Query OK, 1 row affected (0.11 sec)
- Records: 1 Duplicates: 0 Warnings: 0
- mysql> alter table t7 encryption='N';
- Query OK, 2 rows affected (0.08 sec)
- Records: 2 Duplicates: 0 Warnings: 0
- mysql> alter database test DEFAULT ENCRYPTION = 'N';
- Query OK, 1 row affected (0.03 sec)
- mysql> ALTER TABLESPACE mysql ENCRYPTION = 'N';
- Query OK, 0 rows affected (2.37 sec)
04 查看元數(shù)據(jù)
- 查看插件
- mysql> SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME LIKE 'keyring%';
- +--------------+---------------+
- | PLUGIN_NAME | PLUGIN_STATUS |
- +--------------+---------------+
- | keyring_file | ACTIVE |
- +--------------+---------------+
- 1 row in set (0.01 sec)
- 查看存在的key
- mysql> SELECT * FROM performance_schema.keyring_keys;
- +--------------------------------------------------+-----------+----------------+
- | KEY_ID | KEY_OWNER | BACKEND_KEY_ID |
- +--------------------------------------------------+-----------+----------------+
- | INNODBKey-8c537ce5-4a53-12eb-907d-000c298c47fa-1 | | |
- +--------------------------------------------------+-----------+----------------+
- 1 row in set (0.00 sec)
05 查看加密對象
- 加密表空間
- mysql> SELECT SPACE, NAME, SPACE_TYPE, ENCRYPTION FROM INFORMATION_SCHEMA.INNODB_TABLESPACES WHERE ENCRYPTION='Y';
- +------------+---------+------------+------------+
- | SPACE | NAME | SPACE_TYPE | ENCRYPTION |
- +------------+---------+------------+------------+
- | 4294967294 | mysql | General | Y |
- | 145 | test/t7 | Single | Y |
- +------------+---------+------------+------------+
- 2 rows in set (0.00 sec)
- 查看加密表
- mysql> SELECT TABLE_SCHEMA, TABLE_NAME, CREATE_OPTIONS FROM INFORMATION_SCHEMA.TABLES WHERE CREATE_OPTIONS LIKE '%ENCRYPTION%';
- +--------------+------------+----------------+
- | TABLE_SCHEMA | TABLE_NAME | CREATE_OPTIONS |
- +--------------+------------+----------------+
- | test | t7 | ENCRYPTION='Y' |
- +--------------+------------+----------------+
- 1 row in set (0.04 sec)
- 查看加密Database
- mysql> SELECT SCHEMA_NAME, DEFAULT_ENCRYPTION FROM INFORMATION_SCHEMA.SCHEMATA WHERE DEFAULT_ENCRYPTION='YES';
- +-------------+--------------------+
- | SCHEMA_NAME | DEFAULT_ENCRYPTION |
- +-------------+--------------------+
- | test | YES |
- +-------------+--------------------+
- 1 row in set (0.00 sec)
- 從MySQL8.0.23版本開始,支持對DoubleWrite文件頁的加密,這一特性無需單獨配置。MySQL會自動加密屬于加密表的雙寫文件頁。
- 支持通過配置innodb_redo_log_encrypt選項對Redo日志進行加密,默認(rèn)禁用。啟用innodb_redo_log_encrypt后原Redo日志中未加密頁面保持未加密狀態(tài),新產(chǎn)生的Redo日志頁面以加密形式寫入;反之亦然。加密Metadata存放在ib_logfile0文件header中。
- 支持通過配置innodb_undo_log_encrypt選項對Undo日志進行加密,默認(rèn)禁用。啟用innodb_undo_log_encrypt后原Undo日志中未加密頁面保持未加密狀態(tài),新產(chǎn)生的undo日志頁面以加密形式寫入;反之亦然。加密Metadata存放在Undo日志文件header中。
06 加密秘鑰輪換
加密秘鑰應(yīng)該定期輪換,輪換操作是原子的實例級別的操作。每次輪換主加密密鑰時,MySQL 實例中的所有表空間密鑰都會重新加密并保存回各自的表空間表頭。如果輪換操作被服務(wù)器故障中斷,重啟后將會做前滾操作。
輪換操作只會更新主秘鑰并重新加密表空間秘鑰,并不會重新解密并加密表空間數(shù)據(jù)。
輪換操作需要Super權(quán)限或 ENCRYPTION_KEY_ADMIN權(quán)限;語句如下:
- ALTER INSTANCE ROTATE INNODB MASTER KEY;
成功的 ALTER INSTANCE ROTATE INNODB MASTER KEY 語句將寫入二進制日志以在副本上進行復(fù)制。
請確保對主秘鑰進行備份(在創(chuàng)建和輪換后),否則可能無法恢復(fù)加密表空間中的數(shù)據(jù)。
07 通過Performance Schema監(jiān)控加密進度
- 打開stage/innodb/alter tablespace (encryption) instrument:
- mysql> system clear
- mysql> USE performance_schema;
- Database changed
- mysql> UPDATE setup_instruments SET ENABLED = 'YES' WHERE NAME LIKE 'stage/innodb/alter tablespace (encryption)';
- Query OK, 0 rows affected (0.01 sec)
- Rows matched: 1 Changed: 0 Warnings: 0
- 啟用the stage event consumer tables,包括events_stages_current, events_stages_history, and events_stages_history_long.
- mysql> UPDATE setup_consumers SET ENABLED = 'YES' WHERE NAME LIKE '%stages%';
- Query OK, 3 rows affected (0.01 sec)
- Rows matched: 3 Changed: 3 Warnings: 0
- 執(zhí)行一個加密操作
- mysql> ALTER TABLESPACE mysql ENCRYPTION = 'Y';
- Query OK, 0 rows affected (2.80 sec)
- 通過查詢Performance_Schema events_stages_current 表來檢查加密操作的進度。
WORK_ESTIMATED 報告表空間中的總頁數(shù)。
WORK_COMPLETED 報告處理的頁數(shù)。
- mysql> select * from events_stages_current;
- Empty set (0.00 sec)
- 如果加密操作已完成,events_stages_current 表將返回一個空集。在這種情況下,您可以檢查 events_stages_history 表以查看已完成操作的事件數(shù)據(jù)。
- mysql> SELECT EVENT_NAME, WORK_COMPLETED, WORK_ESTIMATED FROM events_stages_history;
- +--------------------------------------------+----------------+----------------+
- | EVENT_NAME | WORK_COMPLETED | WORK_ESTIMATED |
- +--------------------------------------------+----------------+----------------+
- | stage/innodb/alter tablespace (encryption) | 2559 | 2559 |
- | stage/innodb/alter tablespace (encryption) | 2559 | 2559 |
- | stage/innodb/alter tablespace (encryption) | 2559 | 2559 |
- | stage/innodb/alter tablespace (encryption) | 2559 | 2559 |
- | stage/innodb/alter tablespace (encryption) | 2559 | 2559 |
- | stage/innodb/alter tablespace (encryption) | 2559 | 2559 |
- | stage/innodb/alter tablespace (encryption) | 2559 | 2559 |
- +--------------------------------------------+----------------+----------------+
- 7 rows in set (0.00 sec)
關(guān)于作者
楊明翰,云和恩墨服務(wù)總監(jiān)。擁有MySQL、TDSQL、TiDB、openGauss等認(rèn)證。長期從事MySQL、PG、Redis、MongoDB的數(shù)據(jù)庫技術(shù)服務(wù)?,F(xiàn)負(fù)責(zé)云和恩墨西區(qū)開源數(shù)據(jù)庫交付運維工作;熱衷于開源數(shù)據(jù)庫產(chǎn)品的研究。