MySQL5.7.11开始引入Keyring Plugin插件,支持对独享表空间的InnoDB数据文件加密,其依赖keyring plugin来进行秘钥的管理,增强了MySQL的物理数据文件的安全性,这是一个很不错的功能,这个特性默认是没有启用的,要使用这个功能要安装插件keyring_file。已经加密的数据对数据库使用者或是应用程序都是透明的,自动解密,如果存储介质或是物理数据文件被偷,可以保护数据不被还原,但是在整体性能上降低10%。

安装插件
1:创建保存keyring_file的目录
mkdir -p data/mysql/3306/mysql-keyring/
chown -R mysql.mysql data/mysql/3306/mysql-keyring/
chmod 750 data/mysql/3306/mysql-keyring/
2:在MySQL中执行
INSTALL PLUGIN keyring_file soname 'keyring_file.so';
set global keyring_file_data='/data/mysql/3306/mysql-keyring/keyring';
3:更新配置文件,避免遗忘更新配置文件,避免下次重启出问题
在MySQL配置文件my.cnf的[mysqld]段,加这两行:
early-plugin-load=keyring_file.so
keyring_file_data=/data/mysql/3306/mysql-keyring/keyring
4:查看Keyring Plugin相关信息
使用可以查看keyring_file的存储位置:
show global variables like '%keyring_file_data%';
使用以下可以查看Keyring Plugin是否启用:
SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS where PLUGIN_NAME LIKE 'keyring%';

启用和禁用InnoDB表空间加密
1:对用新建InnoDB表,启用空间加密如下
mysql> CREATE TABLE t1 (c1 INT) ENCRYPTION='Y';
2:对于已存在的InnoDB表,启用空间加密如下
mysql>ALTER TABLE t1 ENCRYPTION='Y';
复制
3:禁用InnoDB表的空间加密
mysql>ALTER TABLE t1 ENCRYPTION='N';
复制
4:查看表是否启用了空间加密
mysql>SELECT TABLE_SCHEMA, TABLE_NAME, CREATE_OPTIONS FROM
INFORMATION_SCHEMA.TABLES
WHERE CREATE_OPTIONS LIKE '%ENCRYPTION="Y"%';
复制
+--------------+------------+----------------+复制
| TABLE_SCHEMA | TABLE_NAME | CREATE_OPTIONS |复制
+--------------+------------+----------------+复制
| test | t1 | ENCRYPTION="Y" |复制
+--------------+------------+----------------+复制
5:启用空间加密的表如何导入到新的实例上
启用InnoDB的表空间加密在备份和恢复上和之前一样,唯一需要做的是需要在导入的实例上启用空间加密,并使用备份实例的keyring file替换掉导入实例的keyring file文件,即可导入,否则会报错,不能导入加密过的表。
6:定期的更换keyring密钥
为了保证安全,密钥文件要定期的更换(类似于换密码),执行以下命令可以更换密钥文件,执行这个操作需要super权限。这是个原子性、实例级别的操作,在每次密钥更换时,在MySQL实例上的所有表的表空间密钥将重新加密并保存到自己的表头中,作为一个原子性的操作,一旦开始更换必须成功,如果操作过程中出现宕机等意外情况,需要执行InnoDB表空间加密的恢复操作。更换密钥完成,keyring文件也会发生改变。
mysql>ALTER INSTANCE ROTATE INNODB MASTER KEY;
复制
这个操作在主从同步中有几种情况:
6.1:当主库执行成功,这个会操作同时会写入binary log,在从库上回放执行;
6.2:当主库执行成功,从库上没有启用 keyring plugin插件,则从库回放执行失败;
6.3:当主库执行成功,从库上启用了keyring plugin插件,但没有keyring file,那么这条语句在从库上回放执行的时候回去创建keyring file;
6.5:当主库执行失败,不会写入binary log。
7:更换keyring密钥失败后的恢复
简单的说就是重启MySQL,Innodb会自己去检测修复,把使用旧密钥的表修改为新密钥。

DBA的思考
对于这个功能,只是对MySQL数据库的物理文件进行加密,也就是说经过加密过的表,data目录下表的物理文件被转移到另外的地方物理挂载启动是看不到数据的,必须要有keyring文件才行,但是逻辑备份如mysqldump出来的备份文件不受这个限制。
参考文档:https://dev.mysql.com/doc/refman/5.7/en/innodb-tablespace-encryption.html
以上内容为IPD原创,如需转载,请注明出处~