暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

openGauss透明加密

原创 闫宗帅 2022-12-04
845

openGauss透明加密

openGauss的透明加密功能由2.1.0版本引入,针对数据的读写,在数据写入存储介质时进行加密,从存储介质读取数据时进行解密,防止攻击者绕过数据库认证机制直接读取数据文件中的数据。该功能对应用层几乎透明无感知,用户可以根据需要对表进行加解密。

功能

1) 采用3层密钥结构实现密钥管理机制

根密钥、主密钥和数据加密密钥。主密钥由根密钥加密保护,数据加密密钥由主密钥加密保护。数据加密密钥用于对用户数据进行加解密,每个表对应一个数据加密密钥。

2) 支持表级别的透明加密,针对某个表使用该功能。

用户创建表时指定是否对表进行加密以及使用的加密算法。算法一旦指定就不可更改。加密算法、密钥密文和对应主密钥等参数使用“keyword=value”的格式保存到系统表pg_class的reloption字段中。

3) 加密表可以打开和关闭自身的加密开关

4) 支持加密表的密钥轮转,密钥轮转后使用旧密钥加密的数据仍使用旧密钥解密,新写入的数据使用新密钥加密。密钥轮转不更换加密算法

5) 该功能必须与华为云的KMS服务对接管理密钥

6) 通过GUC参数enable_tde控制是否开启透明加密,该参数需要KMS服务配合生成从而在postgresql.conf中生效,否则不认识(这个限制比较大)

7) 仅对heap行存储表进行加解密。

原理

它的密钥是由华为云的KMS服务来管理的,我们这里不做介绍,仅介绍加密流程。
image.png
首先我们看下使用的相关数据结构。如上图所示,因为透明加密支持表级别,所以需要找到表级别透明加密的标记。上图中RelationData中有rd_options,该指针指向的内容来自pg_class系统表的reloptions,也就是创建加密表:

CREATE TABLE tde_test (a int, b text) with (enable_tde = on, encrypt_algo = ‘AES_128_CTR’);

with子句中的变量值。进行insert、update、delete或select都会通过ReadBufferExtended函数获取buffer描述符以得到需要操作的数据页(若数据页没有在内存,则需要从磁盘上捞取,此时涉及解密):

1)首先需要根据Relation rd_options中的enable_tde选项标记smgr的encrypt值,标记该表操作时需要加密

2)然后在ReadBuffer_common函数中根据smgr的encrypt选项标记buffer描述符的encrypt值,标记该页需要加密。当然,标记时还需要在guc enable_tde变量开启的条件下。

接下来,就需要在刷写时进行加密:

1)调用函数:在checkpoint和后台写流程中调用

FlushBuffer->PageDataEncryptForBuffer

->smgrwrite

2)PageDataEncryptForBuffer函数看下加密条件:

image.png![]

3)解密时,根据pd_flags是否是PD_ENCRYPT_PAGE来判断是否是加密页,从而需要解密

最后修改时间:2022-12-05 09:15:52
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论