MySQL 整表加密解决方案 keyring_file详解

作者:coderstory 时间:2024-01-18 07:50:31 

说明

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_fileAES
     DSA
     RSA
无限制
     无限制
     无限制
keyring_fileAES
     DSA
     RSA
无限制
     无限制
     无限制
keyring_okvAES16, 24, 32
keyring_awsAES16, 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

来源:https://blog.coderstory.cn/mysql-keyring_file/

标签:mysql,整表,加密,keyring,file
0
投稿

猜你喜欢

  • MATLAB中text函数使用的语法与示例代码

    2022-09-29 00:21:38
  • python 实现控制鼠标键盘

    2023-08-04 09:37:56
  • PHP中isset()和unset()函数的用法小结

    2023-11-19 14:19:24
  • Python机器学习NLP自然语言处理基本操作词向量模型

    2022-01-16 10:33:42
  • SQL Server和Oracle并行处理方法对比

    2009-01-20 15:48:00
  • php引用传值实例详解学习

    2023-11-15 06:11:30
  • sqlserver 2000中创建用户的图文方法

    2012-03-26 18:26:39
  • 探讨Mysql中OPTIMIZE TABLE的作用详解

    2024-01-24 21:43:41
  • Flask实现图片的上传、下载及展示示例代码

    2023-07-14 20:46:17
  • 解决python调用matlab时的一些常见问题

    2022-10-13 16:11:01
  • python多线程分块读取文件

    2023-10-29 18:48:51
  • Matplotlib 绘制饼图解决文字重叠的方法

    2023-06-12 22:23:06
  • SQL语句练习实例之七 剔除不需要的记录行

    2011-11-03 16:50:51
  • python中if的基础用法(if else和if not)

    2021-02-01 01:56:18
  • 利用Python将多张图片合成视频的实现

    2022-09-16 07:10:26
  • 关于pytest结合csv模块实现csv格式的数据驱动问题

    2023-01-11 20:40:03
  • Python实现寻找回文数字过程解析

    2022-06-21 10:48:04
  • 关于python通过新建环境安装tfx的问题

    2022-06-28 19:47:21
  • Python基础教程之输入输出和运算符

    2021-10-20 13:41:42
  • 详解Go语言变量作用域

    2023-08-05 03:25:43
  • asp之家 网络编程 m.aspxhome.com