『坚如磐石的 PieCloudDB』:透明加密模块的设计与实现

语言: CN / TW / HK
导读:2月17日,由中国开源软件推进联盟PostgreSQL分会&中科院软件所&CSDN联合举办的“中国 PostgreSQL 数据库生态大会”盛大召开。拓数派(OpenPie)作为冉冉升起的新一代云原生分布式数据库厂商,受邀参加本届大会。 

本文为演讲的文字版摘要,主要内容包括: 

  • 透明加密的设计思路 
  • 透明加密模块的架构 
  • 三级密钥的实现 
  • 密钥管理的实现 

分享嘉宾:PieCloudDB 资深技术专家 王淏舟 

回访视频: https://www.bilibili.com/video/BV1X54y1w76L/ 

PPT链接: https://openpie.com/download/PostgresConf_PieCloudDB_Database_Unbreakable.pdf 

 

一、数据安全的重要性 

今年来,关于数据安全的政策和热点新闻层出不穷。无论是政府、企业或是各个厂商都对数据安全给予了很高的重视。过往的案例表明,如果出现敏感数据的泄露或丢失,将给企业和用户带来巨大的损失。 对于云上用户来说,云上数据的安全更是其最关注的需求之一。 

作为一款存算分离的云原生数据库产品,PieCloudDB 做到了三大区域的安全特性设计,全链路地保证用户数据安全,包括: 

  • 云原生安全 
  • 存储安全 
  • 计算安全 

其中,针对云原生安全,PieCloudDB 实现了传输层加密和缓存数据加密。作为一款云原生的 eMPP(弹性大规模并行计算)数据库,数据会在不同节点间进行传输,因此对于传输过程的数据加密至关重要。在执行用户查询时,PieCloudDB 会生成相应的缓存数据,用以加速查询结果的生成。缓存数据中会包含一部分的用户数据,对缓存数据的加密将更好的保证用户的数据安全。 

针对存储安全,元数据作为数据库的「心脏」,一旦出现丢失或损坏,将导致数据库的不可用。为此,PieCloudDB 实现了对于元数据的持久化存储。PieCloudDB 的用户数据被多副本加密存储,以保证用户数据的彻底安全。 

针对计算安全,PieCloudDB 采用 eMPP 存算分离架构,并支持ACID,在集群单一节点或更多节点失效的情况下,不会造成用户数据的丢失或损坏。 

本文将着重介绍 PieCloudDB 是如何通过透明加密模块实现云原生安全层的缓存数据加密,和存储安全层的用户数据加密存储的。 

二、PieCloudDB 透明加密设计思路 

PieCloudDB 打造的透明加密模块让数据从传统的明文存储转为加密存储,可以有效地防止数据被系统运维人员直接读出,保证存储在数据文件中的数据安全。透明加密是指密钥生成、密钥管理和加解密过程由数据库管理系统自动完成,用户无感知。也就是说,透明加密的加密和解密过程对用户来说就是透明的,用户读写数据非常方便,数据写入自动加密,读取自动解密。此外,PieCloudDB 的透明加密模块不依赖于公有云/私有云/系统自带的加密,真正实现了自主可控,同时满足数据安全审计和业务安全审计等用户合规需求。 

PieCloudDB 透明加密模块的设计和实现过程中,研发团队充分考虑和总结了用户需求与技术挑战,让透明加密模块实现了以下几个特性: 

  • 用户侧,PieCloudDB 透明加密模块符合审计流程,做到用户无感知,能够与用户业务拟合,无需对业务进行改变。 
  • 研发侧, PieCloudDB 透明加密模块作为一个独立模块,与数据库存储模块结合,不影响内核迭代,方便后续扩展,无历史包袱。 

三、PieCloudDB 透明加密的实现细节 

PieCloudDB 透明加密模块采用目前主流的多级密钥机制和有效的密钥管理机制防范了数据泄露风险,确保了用户的数据安全。每个租户数据完全隔离,拥有独立的密钥体系。 

密钥管理的实现 

在 PieCloudDB 中,主密钥是由用户自主生成、保存与控制的,保存于用户的信任域中,PieCloudDB 的透明加密模块不会尝试访问主密钥,确保主密钥的安全。 

此外,PieCloudDB 的最小加密单位为数据页,每个数据页都由单个密钥进行加密。加密密钥支持轮换,可以按一段时间、或某些条件进行新的密钥的轮换,来最大化保证数据安全。同时,在轮换时,需要避免中断服务,无需停机。 

PieCloudDB 采用三级密钥机制,轮换上级密钥无需重新加解密数据,只需加解密密钥。同时,PieCloudDB 透明加密模块支持按页/按表轮换密钥,避免整个用户集群停机轮换密钥,最大限度的减少对用户业务的影响。 

密钥保存是透明加密模块中非常重要的部分,一旦密钥丢失,数据将无法解密,从而彻底无法访问。PieCloudDB 透明加密模块的所有次级密钥均进行了持久化存储,保证密钥的安全,底层页级密钥与数据共存,数据多副本备份,防止页级密钥的丢失造成无法挽救的损失。此外,由于页级密钥可能会很大,页级密钥与数据的共存,也能避免在访问密钥时频繁访问持久化存储,减少查询的延迟。 

PieCloudDB 多级密钥

在多级密钥的过程中,用户会在用户信任域中创建主密钥,并保存在信任域中。任何情况下,主密钥都会被保持在用户信任域中。当创建新的租户时,透明加密模块会创建新的租户密钥,将密钥送进信任域中,用主密钥进行加密,并将加密后的密钥存储在 PieCloudDB 的持久化存储区域中。 

当用户创建表时,PieCloudDB 的透明加密模块会自动生成表密钥,由租户密钥进行加密,并存储在 PieCloudDB 的持久化存储区域中。 当有数据写入、需要创建一个新的数据页时,透明加密模块会创建一个新的页密钥,由表密钥进行加密,并将加密后的页密钥存储和数据一起存储在数据存储区域中。选择存储到数据存储区域而非持久化存储区域中,是为了减少持久化存储区域的访问密度,减少持久化存储区域的负载,降低用户查询延迟,提升性能。当对页进行删除时,会将对应的密钥一并删除。 

透明加密的模块化实现 

PieCloudDB 透明加密采用模块化的实现。优化器、执行器将不会感知到透明加密模块的存在。在持续并行开发优化器、执行器等数据内核模块时,无需考虑对透明加密模块的适配。当进行升级时,双方也不耦合,符合云原生解耦的特性。 

此外,透明加密模块完美支持 PieCloudDB 的存储引擎「简墨」,最大化利用存储性能,减少加密导致的性能损失。根据实测数据,透明加密导致的性能损失对用户查询造成的性能影响微乎其微,可忽略不计。 

根据用户需求,PieCloudDB 实现了可插拔加密算法库,针对不同的硬件,能够支持不同的加密算法,充分利用硬件加速。PieCloudDB 提供了多种类型的高强度加密算法,包括DES、AES、RC4等。同时,针对国内用户,增加了对国密标准的支持,符合审计流程和合规要求。此外,为了做到真正的自主可控,加密算法做到了可选。 

PieCloudDB 透明加密模块与用户原有业务完全拟合。在透明加密后,不会对原有用户的查询\业务造成影响,用户无需对原有业务进行更改,做到开箱即用。外围组件也无需针对透明加密模块进行适配,例如使用ETL工具对数据进行导入时,数据会自动加密;导出接入ETL时,数据已经自动完成解密。不会发生 ETL 读到加密的数据导致任务的失败的情况,ETL 也不会感知到透明加密模块的存在。 

透明加密的实现 

  • 透明加密组件架构 

首先,我们来了解一下 PieCloudDB 透明加密组件的架构,当用户发起一个查询请求时, PieCloudDB 优化器会生成执行计划树,执行器将根据此计划树进行执行。当需要访问数据时,执行器将访问 PieCloudDB 存储引擎「简墨」提供的存储接口,通过存储接口访问数据,并对数据进行查询、插入等操作。PieCloudDB 在存储接口与数据访问中间添加了一层透明加密组件。组件位于存储接口的下面,从而做到了优化器和执行器对模块的无感知。 

PieCloudDB 的透明加密组件包括三个模块:加密模块、密钥管理模块、和函数接口。为了实现加密算法库的可插拔,加密模块独立于密钥管理模块,使 PieCloudDB 能够针对不同的透明加密算法库提供不同的接口,并保证内部的加密流程的统一性。这样的设计也可以减少 bug 的产生、让整个开发流程更顺滑,使用户的行为也更加的统一。 

透明加密组件架构 

  • 租户密钥的生成和读取 

租户密钥的生成主要分为以下几个步骤。当租户创建请求,PieCloudDB  透明加密模块将使用强随机算法生成新的主密钥,存储在用户信任域中。主密钥会对其进行加密,生成租户密钥。整个加密过程是在用户的信任域中完成的。PieCloudDB 不会尝试访问主密钥。用户信任域返回加密的租户密钥后,会被存储在持久化存储区域中。 

 

租户密钥的生成 

当需要使用租户密钥时,PieCloudDB 透明加密模块会将加密后的密钥从持久化存储区域读出,送入用户信任域中,使用主密钥将加密后的密钥进行解密,并将解密后的密钥存储在密钥存储区中。此外,PieCloudDB 透明加密模块还在这里设置了定时器,在经过一定时间后,密钥会被自动销毁,避免对解密密钥的持有,减少密钥泄露风险。 

租户密钥的读取 

  • 次级密钥的生成与读取 

包括表密钥和页密钥在内的次级密钥的生成方式与租户密钥类似。当用户发起查询请求时,PieCloudDB 透明加密模块将使用强加密算法随机生成密钥,并用上级密钥进行加密,并存储到相对应的存储区域。 

次级密钥的生成 

当需要进行次级密钥的读取时,与租户密钥的读取过程类似,PieCloudDB 透明加密模块会将数据从对应的存储区域将加密后的密钥读取出,用上级密钥进行解密。 

页级密钥的处理会有所不同,解密后的页级密钥会被存储在内存,而非存储区域中,避免对存储区域造成负担。定时器的存在,会让密钥在一段时间后彻底从内存中销毁。在此过程中,透明加密模块也会为密钥添加随机值,避免密钥从内存中被读取,减少泄露风险。任何密钥都不会被存储在磁盘或缓冲区域,避免密钥因为某种不可控因素而泄露。 

次级密钥的读取 

通过透明加密等安全模块,PieCloudDB 实现了文件级别的安全性保护,有效避免了数据的泄露,为用户打造了更加可靠的数据安全堡垒。