MySQL实验之-表空间加密插件Keyring

本文详细介绍了在MySQL环境中使用Keyring_file插件进行数据加密的操作步骤,包括安装配置、加密解密操作、Redo和Undo日志加密,以及加密秘钥的轮换。此外,还提到了从库配置的不同选项以及如何监控加密进度。
摘要由CSDN通过智能技术生成

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 主从未启用加密,

均同步正常

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

贺浦力特

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值