前言
MySQL支持静态数据加密。静态数据加密的目的是为了防止保存在磁盘上的文件被非法盗用,使用该功能可以确保数据库的表空间,日志等文件即使是被盗用,也无法读取里面的敏感数据。
InnoDB通过两层密钥架构实现静态数据加密功能。当表空间文件进行加密时,会产生一个加密的表空间密钥,该密钥保存在表空间文件的文件头。当应用程序或者合法用户对表进行访问时,InnoDB会使用一个主密钥将加密的表空间密钥解密。主密钥可以进行轮换,表空间密钥无法更改,除非对表空间重新进行加密。
静态数据加密功能依靠MySQL的keyring plugin(暂且叫做钥匙环插件吧,密钥全部保存在钥匙环里,挺形象的)实现。目前,MySQL提供如下插件:
keyring_file:社区版提供,将钥匙环数据保存在本地的文件。
keyring_encrypted_file:企业版提供,将钥匙环数据保存在本地的加密文件。
keyring_okv:企业版提供,包含一个KMIP客户端,提供一个兼容KMIP协议的集中管理解决方案,例如,Oracle Key Vault, Gemalto KeySecure等。
keyring_aws:企业版提供,与Amazon WebServices Key Management Service 通信,用于后端存储。
keyring_hashicorp:企业版提供,与HashiCorpVault通信,用于后端存储。
一个安全可靠的加密密钥管理解决方案对于安全性和合规要求都是至关重要的。需要注意的是,使用keyring_file 和 keyring_encrypted file 插件时,无法满足某些规范要求的密钥集中管理,因此,当静态加密功能使用集中式密钥管理解决方案时,该特性被称为“MySQL企业透明数据加密(TDE)”。
第一数据库配置
Percona Server for MySQL 5.7.20-18
支持企业版本 HASHICORP VAULT
配置如下
my.cnf
[mysqld]
early-plugin-load="keyring_vault=keyring_vault.so"##这里使用keyring_vault代替 MYSQL keyring_hashicorp
loose-keyring_vault_config="/var/lib/mysql-keyring/keyring_vault.conf"
encrypt_binlog=ON
innodb_encrypt_online_alter_logs=ON
innodb_encrypt_tables=ON
innodb_temp_tablespace_encrypt=ON
master_verify_checksum=ON
binlog_checksum=CRC32
log_bin=mysqld-bin
binlog_format=ROW
server-id=1
log-slave-updates
mysql> create database books;
Query OK, 1 row affected (0.01 sec)
第二为什么要加密
我们创建表
createtable tde(id int unsignedauto_increment primarykey,username varchar(50),textvarchar(100));
insertinto tde(id,username,text) values(3,'yitao.xu','There is apassword for mysql server');
##使用XXD命令和LESS 配合查看使用翻页键差不多在0010090位置
xxd /DB/release/Percona8025/DATA/books/tde.ibd|less
0010090: 10796974 616f 2e78 7554686572652069 .yitao.xuThere i
00100a0: 7320612070617373 776f 72642066 6f72 s a password for
00100b0: 206d 7973 716c 20736572766572000000 mysql server...
第一列是地址:
第二列到第九列是内容,每列2个字节2*8=16字节
第十列是以ASCII码翻译内容.
用LINUX 命令CAT 查看,在最低下 出现了我们的行内容.说明我们的MYSQL是以文本格式存储字符串的. 如今MYSQL开源,哪怕是二进制流也可以翻译出来.
altertable books.tde encryption ='y';
mysql> selectname,encryptionfrominformation_schema.innodb_tablespaces wherenamelike'%tde%';
+-----------+------------+
| name | encryption |
+-----------+------------+
| books/tde | Y |
+-----------+------------+
1rowinset (0.00 sec)
加密后的文件内容
0010190: 3ea8 205b 3e0c5253 0c75 bb70 84c8 0484 >.[>.RS.u.p....
00101a0: 3a2a281f 92919020 12d5 5f05 24da3e07 :*(.... .._.$.>.
00101b0: 417cabaf 5865 d8c6 44953076 fca1 0c50 A|..Xe..D.0v...P
00101c0: 2274 c691 bd7f 9fc1939a fccb cf2e 284e "t............(N
加密后就无法从LINUX系统使用各种命令简单查看了,这就不再演示.
前面说MYSQL 使用加密插件来加密,密钥存在表空间头部,我们这里都是每个表一个表空间方式.通俗来讲就是密码锁锁定了表.你需要一把钥匙来打开它.
我们的钥匙存放在VAULT 服务器集中保管!
第三配置 keyring_vault.conf
vault_url =https://192.168.0.114:8200
secret_mount_point= secret/db/table
secret_mount_point_version= AUTO
token = be515093-b1a8-c799-b237-8e04ea90ad7a
vault_ca = etc/vault_ca/vault.crt
第一个是VAULT服务器的链接地址和端口;
第二个是密钥存放在VAULT的路径;
第三个默认;
第四个是令牌(TOKEN);
第五个是CA证书;
令牌和CA证书怎么搞? 怎么搞前我们要把VAULT服务器搞起来