2021.09.9 8.0.26测试环境实操
安装
mkdir -p /usr/local/mysql/keyring
chown -R mysql.mysql /usr/local/mysql/keyring
修改配置文件,配置文件中增加
early-plugin-load=keyring_file.so
keyring_file_data=/usr/local/mysql/keyring/keyring
重启数据库验证
mysql> select * from information_Schema.plugins where plugin_name like '%keyring_file%'\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
1 row in set (0.00 sec)
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.01 sec)
查看文件已经生成
ls -l /usr/local/mysql/keyring/keyring
准备测试对象
create database test;
use test
create table t7 ( c1 int);
insert into t7 values (1),(2);
create table t2 ( c1 varchar(100));
insert into t2 values('12345');
-- 加密操作
alter table t7 encryption='Y';
alter table t2 encryption='Y';
alter database test DEFAULT ENCRYPTION = 'Y';
alter tablespace mysql ENCRYPTION = 'Y';
-- 取消加密
alter table t2 encryption='N';
alter table t7 encryption='N';
alter database test DEFAULT ENCRYPTION = 'N';
alter tablespace mysql ENCRYPTION = 'N';
-- 查看元数据
SELECT PLUGIN_NAME, PLUGIN_STATUS FROM information_schema.PLUGINS WHERE PLUGIN_NAME LIKE 'keyring%'; -- 查看插件 ACTIVE 状态
SELECT * FROM performance_schema.keyring_keys; -- 查看存在的key INNODB Key-d115aafd-0ccb-11ec-af11-000c29644ab2-1
-- 查看加密对象
SELECT SPACE, NAME, SPACE_TYPE, ENCRYPTION FROM information_schema.INNODB_TABLESPACES WHERE ENCRYPTION='Y'; -- 加密表空间 mysql: general, test/t7, test/t2: single
SELECT TABLE_SCHEMA, TABLE_NAME, CREATE_OPTIONS FROM information_schema.TABLES WHERE CREATE_OPTIONS LIKE '%ENCRYPTION=\'Y\'%'; -- 查看加密表: mysql库 35个, test库2个
SELECT SCHEMA_NAME, DEFAULT_ENCRYPTION FROM information_schema.SCHEMATA WHERE DEFAULT_ENCRYPTION='YES'; -- 查看加密数据库: test 1个
启用 redo/undo 加密
从 MySQL 8.0.23 版本开始,支持对 DoubleWrite 文件页的加密, 这一特性无需单独配置. MySQL 会自动加密属于加密表的双写文件页
支持通过配置 innodb_redo_log_encrypt 选项对 Redo 日志进行加密, 默认禁用. 启用 innodb_redo_log_encrypt 后原 Redo 日志中未加密页面保持未加密状态, 新产生的 Redo 日志页面以加密形式写入; 反之亦然. 加密 Metadata 存放在 ib_logfile0 文件 header 中
支持通过配置 innodb_undo_log_encrypt 选项对 Undo 日志进行加密, 默认禁用. 启用 innodb_undo_log_encrypt 后原 Undo 日志中未加密页面保持未加密状态, 新产生的 undo 日志页面以加密形式写入; 反之亦然. 加密 Metadata 存放在 Undo 日志文件 header 中
set global innodb_redo_log_encrypt = on;
set global innodb_undo_log_encrypt = on;
set PERSIST innodb_redo_log_encrypt = on;
set PERSIST innodb_undo_log_encrypt = on;
加密秘钥轮换
加密秘钥应该定期轮换, 轮换操作是原子的实例级别的操作. 每次轮换主加密密钥时, MySQL 实例中的所有表空间密钥都会重新加密并保存回各自的表空间表头. 如果轮换操作被服务器故障中断, 重启后将会做前滚操作
轮换操作只会更新主秘钥并重新加密表空间秘钥, 并不会重新解密并加密表空间数据
轮换操作需要 Super 权限或 ENCRYPTION_KEY_ADMIN 权限;语句如下:
ALTER INSTANCE ROTATE INNODB MASTER KEY;
成功的 ALTER INSTANCE ROTATE INNODB MASTER KEY 语句将写入二进制日志以在副本上进行复制
请确保对主秘钥进行备份 (在创建和轮换后), 否则可能无法恢复加密表空间中的数据
实验验证
SELECT * FROM performance_schema.keyring_keys; -- 多了一条记录 INNODBKey-d115aafd-0ccb-11ec-af11-000c29644ab2-2
-- 通过 Performance Schema 监控加密进度
USE performance_schema;
UPDATE setup_instruments SET ENABLED = 'YES' WHERE NAME LIKE 'stage/innodb/alter tablespace (encryption)'; -- 打开stage/innodb/alter tablespace (encryption) instrument
UPDATE setup_consumers SET ENABLED = 'YES' WHERE NAME LIKE '%stages%'; -- 启用the stage event consumer tables, 包括events_stages_current, events_stages_history, and events_stages_history_long
ALTER TABLESPACE mysql ENCRYPTION = 'Y'; -- 执行一个加密操作
select * from events_stages_current; -- 查询加密操作的进度 WORK_ESTIMATED 报告表空间中的总页数. WORK_COMPLETED 报告处理的页数. 如果加密操作已完成, events_stages_current 表将返回一个空集
SELECT event_name, work_completed, work_estimated FROM events_stages_history; -- 查看已完成操作的事件数据
从库配置
执行安装步骤, 建立文件夹和启用插件, 从库可以选择启用或不启用 innodb_redo_log_encrypt 和 innodb_undo_log_encrypt
例如 我的测试环境
3307 -> 3307 主从启用了加密,
3308 -> 3308 主从未启用加密,
均同步正常