点击上方蓝字关注我们
引言互联网数据的爆发式增长使得数据安全越来越为各大数据库厂商及用户所重视。MySQL在数据安全方面也提供了很多支持。通过加密函数,透明数据加密等特性,MySQL可以对用户敏感数据进行加密,从而防止数据泄露等安全问题。本期分享我们将详细介绍一下MySQL在数据加密方面的特性,希望能让大家对其有比较深入的了解并在选择数据安全方案的时候提供一些参考。
本文金句:为了保证数据安全,MySQL支持了透明加密,函数加密等特性,其中尤其是透明加密为所有落盘数据提供了充分的安全保障。
1
数据加密简介
数据加密:指的是通过对敏感数据进行编码处理来保证数据安全,防止数据泄露。
加密方式:主要包含应用系统加密、文件系统加密、函数加密,表空间加密和磁盘加密等。
MySQL也提供了多种方式的加密来保证数据安全,主要包括:
-
函数加密:通过提供若干加密函数的方式来对敏感数据进行编码处理,防止明文数据泄露;下图即为MySQL企业级函数加密的示意图。
-
透明数据加密:在存储引擎中对数据进行加密,用户无感知。所有落盘数据都可加密。这个特性是MySQL在安全方面非常重要的一个特性,后面的分享我们将会对这一特性的原理和实现方法进行详细的介绍。
在Klustron分布式数据库的存储节点1.2版本,采用的是MySQL8.0.26版本,而且使用的是InnoDB存储引擎,所以,Klustron的存储节点不仅有着和MySQL一致的安全特性,还实现了对所有落盘数据的全流程加密,包括数据文件,日志文件,备份文件等。下方是Klustron分布式数据库的整体架构图:
2
数据加密详解
透明数据加密原理(总体设计):
- MySQL5.7.11开始支持单表数据透明加密,8.0版本支持所有数据(redo,binlog,relay log等所有落盘数据)加密。
总体架构上来说,MySQL采用了双层秘钥的设计:
- Tablespace key:表空间秘钥,用于加解密每个数据页,加密后存放于每个表空间数据ibd文件的第一个页;
-
Master key:主秘钥,用于加解密各个tablespace key,存储于oracle
key vault或者秘钥文件中。
双层秘钥的最大好处在于秘钥轮转(key rotation)的时候,不需要把所有数据都解密后再重新加密,而只需要重新加密tablespace key即可。
Keyring plugin插件:
秘钥接口插件,用于从Oracle key vault或秘钥文件中获取master key,并提供接口给存储引擎以获取master key。
Klustron完全支持透明加密,并且即将推出符合国五标准的透明加密。
下图展示了透明数据加密的总体设计:
加解密流程:
如下图所示,透明数据加密的主要流程是:
-
读取秘钥:
InnoDB调用keyring插件接口获取master key并用之解密存储于ibd文件第一页的Tablespace key。解密后的tablespace key置于表空间内存对象fil_space_t中;
-
加密:
在写入每一个数据页的时候,使用fil_space_t对象中的表空间秘钥加密数据页的数据部分;
-
解密:
在读取每一个数据页的时候,使用fil_space_t对象中的表空间秘钥解密数据页的数据部分;
其他细节问题:
-
Master
key rotate:由于采用了双层秘钥设计,rotate的时候,只需要使用新的master
key将所有表空间的tablespace key重新加密并写入ibd文件的第一页。 -
加密表的import/export:
在export的时候随机生成一个临时的transfer_key,把现有的 tablespace_key用transfer_key加密,并将两者同时写入.cfp的文件中。Import时会读取transfer_key用来解密tablespace_key,然后执行正常的import 操作即可。
3
透明数据加密的问题
透明数据加密在保证数据安全性的同时,由于加解密过程也会消耗资源,以及由于一些设计的细节部分,所以也会存在一些问题,主要有如下2个问题。
问题1:性能问题:
-
5.7早期版本如果使用yassl性能下降严重,最高>30%。
-
8.0采用openssl后,总体对性能影响不大,但在某些场景下性能影响也比较大,比如:oltp_read_only低并发可能会>10%
如下图所示:(数据来源:阿里云RDS MySQL TDE测试报告)
问题2:数据安全问题
-
Tablespace key放在ibd文件的固定位置,虽然是经过加密,但也有泄漏的可能;
-
import/export生成的临时transfer_key保存在.cfp文件中,也有泄漏的可能。
4
Q&A
q1:key rotate 如何保证原子性?a1:如之前所描述的,key rotate是将各个tablespace
key重新加密并写入ibd文件的第一个页面的,而这个过程是会记录redo log的。InnoDB除了写入相关的redo log外,还会将当前表的加密信息也写入redo log,比如说master key的版本号等。所以,在发生crash时,可以在recovery的过程中,通过redo log中记录的相关信息来保证key rotate的一致性状态。
q2:Klustron在加密这块做了哪些工作?
a2:Klustron除了支持MySQL已经提供的加密特性外,还实现了落盘数据(包括数据,日志,备份等等)的全流程加密。另外,KunlunBase正在实现对国五加密标准的支持。
END产品文档
Klustron 快速入门:
https://doc.kunlunbase.com/zh/Klustron_Instruction_Manual.html
Klustron 快速体验指南:
https://doc.kunlunbase.com/zh/Klustron_Quickly_Guide.html
Klustron 功能体验范例:
https://doc.kunlunbase.com/zh/Klustron-function-experience-example.html
Klustron 产品使用和测评指南:
https://doc.kunlunbase.com/zh/product-usage-and-evaluation-guidelines.html
同时欢迎大家扫码👇添加小助手(备注:加入Klustron技术交流群)欢迎大家在交流群共同探讨更多问题及主题。
点击👆上方,关注获取源代码及技术信息~