点击上方蓝字关注我们

1
数据加密简介

MySQL也提供了多种方式的加密来保证数据安全,主要包括:
函数加密:通过提供若干加密函数的方式来对敏感数据进行编码处理,防止明文数据泄露;下图即为MySQL企业级函数加密的示意图。
透明数据加密:在存储引擎中对数据进行加密,用户无感知。所有落盘数据都可加密。这个特性是MySQL在安全方面非常重要的一个特性,后面的分享我们将会对这一特性的原理和实现方法进行详细的介绍。
在Klustron分布式数据库的存储节点1.2版本,采用的是MySQL8.0.26版本,而且使用的是InnoDB存储引擎,所以,Klustron的存储节点不仅有着和MySQL一致的安全特性,还实现了对所有落盘数据的全流程加密,包括数据文件,日志文件,备份文件等。下方是Klustron分布式数据库的整体架构图:

2
数据加密详解
MySQL5.7.11开始支持单表数据透明加密,8.0版本支持所有数据(redo,binlog,relay log等所有落盘数据)加密。
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





