MySQL 整表加密解决方案 keyring_file详解
说明
MySql社区版从5.7.11开始支持基于表的数据加密方案,模块名为keyring_file,支持加密整张表。这种是加密方式其实是基于文件加密的,一旦mysqld读取key启动后,将会解密整张表的数据,在mysql服务内,读取的数据都是解密后的,也就是说对客户端而言是无感知的。而这个key是本地存放的,mysql服务拥有读写这个key的权限。
总体看这种方案不太安全,原因是数据库文件是加密的,但只要能有mysql服务的账户,那么访问数据都是解密后的,加密不攻自破。而且解密key也是本地存放的,入侵者完全可以一并带走。这种方案只能保证入侵者只拖走了数据库文件后无法读取内容。
企业版MySQL额外的三种模块
如果是企业版的mysql,那么还有另外三种加密方案。
1.keyring_encrypted_file
和我之前说的社区版差不多的,只是多了一个key。这个key用于加密解密数据库用的key。安全性方面都差不多。
2.keyring_okv
相比本地存放key,本模块使用KMIP存取key,相对更加安全。
3.keyring_aws
整合aws的密匙管理服务来管理加解密的key。进一步提高key的管理安全性。
四个加密模块支持的加密类型
模块名 | 可用加密算法 | 密钥长度限制 |
---|---|---|
keyring_encrypted_file | AES DSA RSA |
无限制 无限制 无限制 |
keyring_file | AES DSA RSA |
无限制 无限制 无限制 |
keyring_okv | AES | 16, 24, 32 |
keyring_aws | AES | 16, 24, 32 |
总结一下,四种方案都是文件加密,内存解密方案,区别在于加解密的key存放方案。推荐使用keyring_okv和keyring_aws,并确保mysql账户的安全性和严格区分账户权限。
另外2种安全性不大。
实施步骤
OK,现在简单讲一下最简单的keyring_file部署方案,提前说明下windows貌似无法使用这种方案,因为不知道为什么加密用的key总是无法生成。
1.使用最新版的mysql 5.7.21
使用yum apt 之类的工具安装最新版的mysql 或者 下载源码自行编译安装
sudo apt install mysql-5.7
2.启用加密模块
INSTALL PLUGIN keyring_file soname ‘keyring_file.so';
mysql> INSTALL PLUGIN keyring_file soname 'keyring_file.so'; Query OK, 0 rows affected (0.10 sec)
3.设置加密key存放路径
set global keyring_file_data='/root/mysql-keyring/keyring';
mysql> set global keyring_file_data='/var/lib/mysql-keyring/keyring'; Query OK, 0 rows affected (0.00 sec)
4.永久启用设置
上诉两个步骤都是临时的,重启服务都会失效,我们把配置写到配置文件里,确保重启服务后也能生效
[mysqld] early-plugin-load=keyring_file.so keyring_file_data=/root/mysql-keyring/keyring
5.查看key的存放路径
show global variables like ‘%keyring_file_data%';
mysql> show global variables like '%keyring_file_data%'; +-------------------+--------------------------------+ | Variable_name | Value | +-------------------+--------------------------------+ | keyring_file_data | /var/lib/mysql-keyring/keyring | +-------------------+--------------------------------+ 1 row in set (0.00 sec)
6.查看启用的模块
查看下keyring_file模块是否已经被载入。
show plugins;
mysql> show plugins; +----------------------------+----------+--------------------+-----------------+---------+ | Name | Status | Type | Library | License | +----------------------------+----------+--------------------+-----------------+---------+ | binlog | ACTIVE | STORAGE ENGINE | NULL | GPL | | mysql_native_password | ACTIVE | AUTHENTICATION | NULL | GPL | | sha256_password | ACTIVE | AUTHENTICATION | NULL | GPL | | PERFORMANCE_SCHEMA | ACTIVE | STORAGE ENGINE | NULL | GPL | | CSV | ACTIVE | STORAGE ENGINE | NULL | GPL | | MRG_MYISAM | ACTIVE | STORAGE ENGINE | NULL | GPL | | MyISAM | ACTIVE | STORAGE ENGINE | NULL | GPL | | InnoDB | ACTIVE | STORAGE ENGINE | NULL | GPL | | INNODB_TRX | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_LOCKS | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_LOCK_WAITS | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_CMP | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_CMP_RESET | ACTIVE | INFORMATION SCHEMA | NULL | GPL | 。。。。。。(省略N条) | keyring_file | ACTIVE | KEYRING | keyring_file.so | GPL | +----------------------------+----------+--------------------+-----------------+---------+ 45 rows in set (0.00 sec)
7.加密现有的表
alter table table encryption='Y';
mysql> create table cc (id int); Query OK, 0 rows affected (0.01 sec) mysql> alter table cc encryption='Y'; Query OK, 0 rows affected (0.06 sec) Records: 0 Duplicates: 0 Warnings: 0
8.取消加密
alter table table encryption='N';
mysql> alter table cc encryption='N'; Query OK, 0 rows affected (0.01 sec) Records: 0 Duplicates: 0 Warnings: 0
官方文档:
https://dev.mysql.com/doc/refman/5.7/en/keyring-installation.html
以上就是本文的全部内容,希望对大家的学习有所帮助
您可能感兴趣的文章:
- MySQL加密和解密实例详解
- MySql主从配置文件问题详解(数据不同步解决方案)
- 详解MySQL用户与授权、MySQL日志管理、数据乱码解决方案。
- MySQL详解各种乱码错误,java调用mysql中文参数查不到结果等解决方案(大章集合)
- mysql8.0 caching_sha2_password加密方式和5.0之前的区别和解决方案
- 在macOS中出现_mysql.c:44:10: fatal error: 'my_config.h' file not found报错的解决方案&成功安装的方法介绍
- 详解利用Dockerfile构建mysql镜像并实现数据的初始化及权限设置
- mac下mysql解决导出csv文件secure_file_priv报错的解决方案
- 【杂谈\数据库】MySQL 报错 mysql Failed to open file 'sqlname.sql', error: 2 解决方案
- Ubuntu Server 14.04 --secure-file-priv error in MySql 解决方案
- MySQL 报错 mysql Failed to open file 'sqlname.sql', error: 2 解决方案
- mysql-5.7 innodb_file_per_table 详解
- Mysql注入中的outfile、dumpfile、load_file函数详解
- ERROR! MySQL server PID file could not be found!解决方案
- 详解MySQL恢复psc文件记录数为0的解决方案
- 详解MySQL双活同步复制四种解决方案
- MySQL 加密解密 详解
- Warning: mysql_connect(): No such file or directory 解决方案总结(操作系统: Mac)
- [解决方案]MySql提示:The server quit without updating PID file(…)失败
- MySQL错误Incorrect file format解决方案