1、什么是TDE?


TDE,全称是Transparent data encryption, 数据透明加密。是数据库用于加密数据文件的一种技术。TDE提供了文件级别的加密。文件在硬盘上是密文,在内存中是明文。TDE解决了保护静止数据的问题,也称为静态数据加密。所谓透明是指加密对用户来说是透明的,用户无需更改原有的操作习惯,用户和应用程序都不需要关心密钥管理或者加密/解密。


企业通常使用TDE来应对PCI DSS等安全监管标准。

(注:PCI DSS:是第三方支付行业数据安全标准)



2PG中的数据加密?


关于服务端的数据加密,你可能用到过pgpgcrypto模块。使用pgcrypto中的加密函数,可以加密表中比较重要的字段,提高数据的安全性。

可以参考:https://tonydong.blog.csdn.net/article/details/109073000




3TDE in PG?


首先一点是tde的特性并没有被内置到到PG核心版本中。但是社区从2016年开始就在讨论这个话题。


PG社区在2016年引入了一个TDE的补丁,实现了使用单个密钥的集群范围加密。

见:https://www.postgresql.org/message-id/CA%2BCSw_tb3bk5i7if6inZFc3yyf%2B9HEVNTy51QFBoeUk7UE_V%3Dw%40mail.gmail.com


2018年提出了表级别透明数据加密以及集成KMS(密钥管理系统)的方法。2019年的补丁使用两层密钥体系实现了表级别加密,并使用通用密钥管理API与外部密钥管理系统通信。


见:https://www.postgresql.org/message-id/031401d3f41d%245c70ed90%241552c8b0%24%40lab.ntt.co.jp




4、TDE in other engines?


市场上很多数据库引擎已经实现了TDE,比如MySQL、Oracle、SQL Server等。


Oracle:支持列级和表空间级TDE,这两种方法都使用基于密钥的两层体系结构。主加密密钥存储在外部密钥存储中。主加密密钥用于保护列级和表空间级的key。列级TDE每个表使用一个key,表空间级TDE每个表空间使用一个key。Oracle TDE 支持Triple-DES (3DES168) and AES (128, 192, 256 bit)。


MySQL: mysql 支持表空间级加密。8.0.16版本后开始支持redo log和undo log加密和系统表加密。支持两层体系结构。主密钥通过一个插件从外部系统获取,每个表空间都在其表空间文件头中存储key。


SQL Server:支持数据库级TDE,采用三层架构,使用对称和非对称加密。SMK(Service Master Key)是在安装过程中自动生成的(例如PostgreSQL的initdb)。数据库主密钥(DMK)是在“主”数据库(例如PG的postgres默认数据库)中创建的,并由SMK加密。然后使用DMK生成用于保护数据库加密密钥(DEK)的证书。DEK用来加密数据和日志文件。




5、什么是基于密钥的两层体系结构和三层体系结构。


两者都是TDE的密钥管理方法。我们使用加密算法对数据进行加密,而加密算法要利用到密钥,比如AES算法的密钥如何来管理的问题。为了减少密钥更换带来的重复加解密的开销,业界都采用多层密钥管理的结构。


两层密钥结构:两层密钥结构中包含主密钥(MK)和数据加密密钥(data encryption key, DEK)。MK用来机密DEK,而且是保存在数据库之外。DEK用来加密数据库数据,可以使用MK加密后保存在数据库本地。


三层密钥结构:三层密钥结构一般包括主密钥加密密钥(KEK)、主数据加密密钥(MDEK)和表数据库加密密钥(TDEK)和wal数据加密密钥(WDEK)





6、实现TDE涉及到的问题?


加密的粒度、加密的时机、加密的方法、如何管理密钥等等。

加密的粒度:从pg本身的存储物理结构,集群—>表空间-->数据库—>表,大致可以可以看出加密的粒度一般限定于集群级别加密、表空间级加密、数据库级加密、表级加密。

加密的方法:加密算法的选择。

如何管理密钥:上面提到的两层、三层或者其他密钥管理方式的选择的问题。



7TDE的好处?

TDE保护突破了文件系统访问控制的安全威胁。



8、后话。

加密这块涉及到很多密码学的知识,如果想要深入地了解,需要有一定的这方面的知识贮备。我对于这块儿了解不深,之后有时间的话,再深入的学习一下,有所得的话,再展开来讲。


对这块认识不深,加上这周特别忙,所以这篇就一直拖着。发之前还在犹豫要不要发出来,但是想一想还是发了,也许以后我回头看这篇,也会感叹一下,原来这是那个时候的我的水平,原来一直都有在进步。



其实这也是我发博客或者写公众号的原因——记录有它本身的意义。即使我对于pg、对于数据库的认知只是皮毛,即使文章中可能漏洞百出,我也想把我现在想要记录的东西,记录下来。记录现在我的对于这些真实的认知是什么,记录这个东西本来的样子,不完美的、幼稚的、但也是客观的、坦诚的。生活多是浮光掠影,快节奏的生活甚至让人感受不到曾经真实存活过的证据。但我想文字是客观的、图片是客观的。我记录的一起也许不会每天想起,但当某一天我回过头看,它们一定会让我感动。


https://mp.weixin.qq.com/s/-XO_nsQFpXenXTOfUdufmQ