文章目录
一、权限要求
安装加密插件只需要用户具有 INSERT 权限即可,不需要为 root 用户
卸载加密插件只需要用户具有 DELETE 权限即可
加解密数据表需要用户在安装加密插件之后具有 ALERT 权限即可
二、加载密钥插件
MySQL 自 5.7 版本之后 都提供了一个插件,用于加解密MySQL 的表空间文件。但是这个插件默认是不开启的状态。如果需要使用到 MySQL 的原生加密(TDE),则需要手动开启这个插件。
MySQL 提供的密钥插件在 8.0.34 版本之后发生了变化
在 5.7 到 8.0.34 版本之间,使用的是 keyring_file 这个插件;在 8.0.34 版本之后,这个插件就被弃用了,改为了 keyring_encrypted_file 这个插件,下面是 8.0 官方文档的图示
MySQL 8.0.34 版本还可以继续沿用 keyring_file 插件的安装和使用方式,更高的版本因为没有环境,暂时没有办法验证
在MySQL 的最新版本中还存在 keyring_file 插件 ,官方文档中说将会在未来的某一个版本中删除,并没有确定具体是哪一个版本
2.1 在Linux操作系统下(MySQL版本为8.0.32/8.0.23/5.7.39-log已验证)
首先需要在MySQL的安装目录下找到 my.cnf 文件(Windows中为 my.ini 文件),添加下面两行配置
[mysqld]
early-plugin-load=keyring_file.so
keyring_file_data=<MySQL的插件路径>/keyring_file
可以使用下面的sql语句获取MySQL的插件路径
SHOW GLOBAL VARIABLES LIKE 'plugin_dir';
然后 keyring_file 插件使用下面的命令开启插件
INSTALL PLUGIN keyring_file SONAME 'keyring_file.so';
执行完上面的两个命令之后需要重启 MySQL 服务,让数据库正常加载加密插件。(实际测试中不重启也能正常加载加密插件)
重启之后可以使用下面的命令查看加密插件是否正常运行
SELECT PLUGIN_NAME, PLUGIN_STATUS
FROM INFORMATION_SCHEMA.PLUGINS
WHERE PLUGIN_NAME LIKE 'keyring%';
如上图限制 状态为 ACTIVE 则表示加密插件正常在运行
也可以使用 SHOW PLUGINS 这个SQL 命令查看所有的 plugins ,找到新添加的 keyring_file。
在使用插件创建了主加密密钥之后,需要立即备份该主加密密钥,在主密钥轮换之后也需要再次进行备份。
2.2 在Windows操作系统下(MySQL版本为8.0.34已验证)
只需要将加密插件的后缀改为 .dll 即可,其他操作均与Linux相同
INSTALL PLUGIN keyring_file SONAME 'keyring_file.dll';
三、卸载加密插件
MySQL版本为8.0.32/8.0.34/8.0.23/5.7.39-log已验证
执行下面的SQL语句之后,加密插件将被卸载
其中的 keyring_file 为加载加密插件时使用的名称
UNINSTALL PLUGIN keyring_file;
四、查询主密钥文件的位置
show variables like 'keyring_file_data'
这个 keyring 就是主密钥文件
五、加解密表
5.1 在创建表的时候设置加密
CREATE TABLE t1 (c1 INT) ENCRYPTION='Y';
5.2 给已存在的表设置加密
ALTER TABLE t1 ENCRYPTION='Y';
会将这张表中原有的数据都加密
因为在一张拥有90w条数据(2个字段)的表上设置这个参数,需要耗时3s
5.3 禁用已存在的表的加密
ALTER TABLE t1 ENCRYPTION='N';
会将这张表原有被加密的数据都解密
因为在一张拥有90w条数据(2个字段)的表上设置这个参数,需要耗时4s
5.4 给表设置加密之后表空间文件的变化
5.5 给表设置禁用加密之后表空间文件的变化
5.6 加解密过程中是否能进行其他sql操作
相同连接正在加密的连接不能进行其他操作,当本连接在加解密的过程中执行其他sql,这条sql会等到加解密完成之后再执行。
其他连接可以进行正常的查询操作,增删改操作需要等待加解密完成之后才能进行操作。
六、主密钥轮换
为了确保数据库的安全性,MySQL 的原生加密的主密钥应该定期轮换,或者是当怀疑密钥泄露的时候,也应该立刻轮换主密钥。
如果服务器在主密钥轮换的时候发生了故障,主密钥轮换将会回滚操作,确保数据的一致性。
轮换主加密密钥只会更改主加密密钥并重新加密 表空间密钥。它没有解密或重新加密关联的表空间数据。
原文如下(不确定理解的是否正确)
执行下面的轮换主密钥命令需要 SUPER 权限
ALTER INSTANCE ROTATE INNODB MASTER KEY;
七、加密的限制
(1)仅用户创建的表支持加密,其他MySQL自带的表空间不支持加密
(2)加密仅适用于表空间中的数据
(3)创建的索引表不支持加密
详细请看下方的原文:
八、MySQL的原生加密插件版本支持情况
根据官方文档的说明,keyring_file 插件的支持情况如下:
● MySQL 5.7.12 和之后的版本:该插件是默认安装的,并提供了 keyring_file 插件的功能。
● MySQL 5.6.x:虽然不是默认安装的,但可以手动安装 keyring_file 插件。(网上说的,官方文档没有说明)
实际验证之后,在 MySQL 5.6.30 版本的数据库上,无法执行
INSTALL PLUGIN keyring_file SONAME 'keyring_file.so';
上面的语句进行原生加密的插件安装,需要手动在服务器上安装并配置
● MySQL 5.5.x 及更早版本:keyring_file 插件不可用,因为它们不支持插件机制。