前言
MySQL支持对InnoDB单表空间、通用表空间、系统表空间和Redo、Undo文件进行静态加密。从8.0.16开始支持对Schema和通用表空间设置加密默认值,这就允许对在这些Schema和表空间中的表是否加密进行统一控制;静态加密功能依赖于Keyring组件或插件,MySQL社区版提供的Keyringfile插件会将Keyring数据存储在服务器主机的本地文件系统中。
01安装
配置文件中增加[mysqld]early-plugin-load=keyring_file.sokeyring_file_data=/usr/local/mysql/keyring/keyring
重启数据库
02加密操作
03取消加密
04查看元数据
查看插件
查看存在的key
05查看加密对象
加密表空间
查看加密表
查看加密Database
从MySQL8.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中。06加密秘钥轮换
加密秘钥应该定期轮换,轮换操作是原子的实例级别的操作。每次轮换主加密密钥时,MySQL实例中的所有表空间密钥都会重新加密并保存回各自的表空间表头。如果轮换操作被服务器故障中断,重启后将会做前滚操作。
轮换操作只会更新主秘钥并重新加密表空间秘钥,并不会重新解密并加密表空间数据。
轮换操作需要Super权限或ENCRYPTION_KEY_ADMIN权限;语句如下:
ALTERINSTANCEROTATEINNODBMASTERKEY;成功的ALTERINSTANCEROTATEINNODBMASTERKEY语句将写入二进制日志以在副本上进行复制。
请确保对主秘钥进行备份(在创建和轮换后),否则可能无法恢复加密表空间中的数据。
07通过PerformanceSchema监控加密进度
打开stage/innodb/altertablespace(encryption)instrument:
启用thestageeventconsumertables,包括events_stages_current,events_stages_history,andevents_stages_history_long.
执行一个加密操作
通过查询Performance_Schemaevents_stages_current表来检查加密操作的进度。WORK_ESTIMATED报告表空间中的总页数。
WORK_COMPLETED报告处理的页数。
如果加密操作已完成,events_stages_current表将返回一个空集。在这种情况下,您可以检查events_stages_history表以查看已完成操作的事件数据。
关于作者
杨明翰,云和恩墨服务总监。拥有MySQL、TDSQL、TiDB、openGauss等认证。长期从事MySQL、PG、Redis、MongoDB的数据库技术服务。现负责云和恩墨西区开源数据库交付运维工作;热衷于开源数据库产品的研究。