Apache Cloudberry™ (Incubating) 是 Apache 软件基金会孵化项目,由 Greenplum 和 PostgreSQL 衍生而来,作为领先的开源 MPP 数据库,可用于建设企业级数据仓库,并适用于大规模分析和 AI/ML 工作负载。
GitHub: https://github.com/apache/cloudberry
文章作者:孔凡深,Apache Cloudberry 贡献者;整理:酷克数据
01 透明数据加密(TDE)技术解析
1.什么是透明数据加密?
TDE(Transparent Data Encryption)是一种针对静态数据的加密技术,在文件系统层自动加密数据文件,内存处理时解密为明文。TDE 的“透明”特性意味着用户无需改变操作习惯,也无需理解复杂的加密和解密过程,从而降低了实施难度,同时提升了数据保护的可靠性。
2.加密算法选型逻辑
加密算法主要分为单钥加密(对称加密)和双钥加密(非对称加密)两大类。
对称加密(单钥):高性能首选,分两类:
流加密(如 RC4):逐字节处理,密钥长度需匹配明文,不适用数据库场景。
块加密(如 AES):按固定块(如 128 位)处理,适合结构化数据存储。
非对称加密(双钥):如 RSA,虽然安全性较高,但性能较低,通常仅用于密钥分发而非数据加密。主流加密算法对比如下:算法性能安全性适用场景AES高高通用数据加密SM4中高国密合规场景3DES低中传统系统兼容
3. 密钥管理:安全与性能的平衡
密钥管理是加密体系中的关键环节。单一固定密钥的使用虽然直观,但一旦泄露,数据将面临巨大的安全风险。因此,为降低泄露风险,必须建立完善的密钥管理机制,包括定期更换密钥。
名词描述DEK (Data Encryption Key)存在于数据仓库计算节点内存的数据加密密钥。通过数据库内部随机数函数生成,作为实际加密数据的密码。DEK明文跟DEK同义,只能保存在内存中Master Key主密钥,用于加密下层密钥单层密钥单层密钥管理结构中,密钥更新流程如下:
单层密钥更新流程单层密钥管理存在局限性,特别是当需要更换直接加密数据的 DEK(Data Encryption Key)时,需全量解密再加密,这将消耗大量 I/O 与 CPU 资源。
例如,加密 10TB 数据,密钥轮换可能需要数小时,期间业务可能会中断。双层密钥为了减轻密钥变更对数据库的影响,我们引入了双层密钥管理策略,即使用两把密钥:DEK 和 MK(Master Key)。
双层密钥更新流程DEK:动态生成,直接加密数据(高频操作)。MK(Master Key):加密 DEK,存储在外部 KMS(低频操作)。通过定期轮换 MK,系统在不影响业务运行的情况下提高了安全性,同时保持了 DEK 的稳定性,确保系统性能和稳定性。
02 Cloudberry 与 HashData 的 TDE 实现
1.Cloudberry 密钥管理
Cloudberry 的密钥管理主要针对集群加密,其密钥生命周期管理如下:
Cloudberry 密钥更新流程集群安装时动态生成 DEK,明文仅存内存,密文经 MK 加密后存储。查询执行时,DEK 由 MK 解密后加载至内存。集群关闭后 DEK 明文自动清除,MK 由 KMS 托管确保安全。
2.HashData 密钥管理
HashData 的密钥管理策略与 Cloudberry 类似,但密钥存放位置有所不同:主密钥(MK)保存在云管平台的密钥管理服务中;数据加密密钥(DEK)保存在内存中,密文保存在对象存储中。密钥管理体系采用分层加密设计,结合双层密钥结构与多层管理模型,在保证数据安全的同时,兼顾系统灵活性和性能。双层密钥管理流程
HashData 双层密钥更新流程
HashData 的双层密钥管理流程包括密钥生成与存储、密钥使用与分发等环节。密钥生成与存储DEK 明文生成:由仓库(Warehouse)的 Master 节点通过随机数函数动态生成。明文仅保留在内存中,确保无磁盘泄露风险。DEK 密文存储:使用 DB Key(上层密钥)加密 DEK 明文,生成 DEK 密文。DEK 密文持久化存储至共享存储(如对象存储)。密钥使用与分发Segment 节点获取 DEK:启动时从 Master 节点获取 DEK 明文(通过安全通道传输)。主密钥(MK)管理:MK 由云管平台的 EncryptionKeyService 统一管理,与数据库节点隔离。通过 KMS(密钥管理服务)动态获取,避免静态存储风险。
多层密钥管理
HashData 双层密钥更新流程为满足企业级安全需求,HashData 采用多层密钥体系,形成自上而下的权限管控链。这里我们需要明确几个核心概念:
名词描述enveloped key信封密钥,用来加密密钥数据的密钥,
Master Key就是一种信封密钥DEK密文使用上层的MK加密DEK明文生成,持久到统一存储中。
Root key根密钥,最上层的master key,用来加密下层密钥(Tenant key)
Tenant key租户密钥,第二层master key,用来加密下层密钥(Db key)
DB key数据库密钥,第三层master key,用来加密下层密钥(DEK)在这个结构中,租户密钥是最高级别的密钥,用于管理所有的 DEK。
由于一个数据库集群可细分为多个 DEK,每个 DEK 专门负责加密特定部分的数据,从而确保每位租户都能拥有专属密钥来保障其数据安全。
重要的是要理解密钥的层级管理概念:上层密钥负责管理其下层的密钥。
3.存储层加密策略
在 Cloudberry 中,TDE 功能主要支持 heap 表。在数据存储于内存的 buffer 中时,数据是以明文形式存在的;当数据被写入磁盘时,系统会对其进行加密。反之,从磁盘读取数据时,系统会自动解密。这样可以确保在数据处理过程中,数据始终以明文格式存在,而磁盘上的数据则以密文存储。heap 表中的数据存储单元 page 会作为加密解密的基本单元。
Cloudberry 存储层加密策略在 HashData 中,表的存储格式采用的是 PAX(行列混存) 格式。
HashData 存储层加密策略
PAX 文件:是存储在文件系统上的普通二进制文件,每个 PAX 文件由多个 stripe 组成。每个 stripe 存储多条记录,这些记录按照列进行独立存储,类似于 Parquet 中的 row group 概念。
文件级元数据:包括文件描述信息、文件 meta 信息(如统计数据)、所有 stripe 的信息以及文件的 schema 信息。
Group/Stripe:一个 stripe 由若干行组成,数据读取时是按行组为单位的。每一列数据被独立存储。
Data Stream:每列数据存储为独立的 Data Stream,包含多行数据。
为什么加密数据块基于 DataStream 而非文件级或 Group/Stripe 级别?在 PAX 格式下,查询只涉及特定列的数据。例如,如果我们执行如下查询:
CREATE TABLE test1(a INT, b INT, c INT);
INSERT INTO test1 SELECT generate_series(1, 10000000);
SELECT a FROM test1;
仅查询表的某一列时,PAX 格式支持 跳块读取(skip-block reading),即仅加载查询涉及的列,而不会读取整个文件或 group 数据。这意味着,如果按文件或 group 作为加密单元,系统会被迫读取整个文件,进而解密,导致性能大幅下降。因此,我们选择将加密数据块限定为 DataStream,只加密实际需要的列数据,从而提升性能。
4.加密实现策略
Cloudberry 与 HashData 均采用了开源加密库 OpenSSL 来对 DataStream 数据块进行加密。OpenSSL EVP(高级加密函数)提供了丰富的密码学算法支持,包括对称加密、摘要算法及签名/验签算法。通过 EVP 函数的封装,我们可以使用相同的代码、不同的加密算法进行数据加密和解密。对于 AES 加密,三个关键组成部分是:算法模式(例如 CBC、ECB)密钥(Key):使用 DEK(数据加密密钥)明文存储于内存中。初始化向量(IV):为了确保加密结果的随机性,每次加密必须使用不同的 IV。为了优化性能,我们使用数据库 OID 作为 IV,这样既能保证其唯一性,又避免了每次生成随机数的开销。
5.数据加密和压缩
在进行数据加密和压缩时,操作顺序至关重要。推荐先进行压缩,再进行加密,因为加密会消除数据中的冗余信息,使得数据变得难以压缩。如果先进行加密,再尝试压缩,效果会大打折扣,因为加密后的数据通常包含更多的随机性,难以进行有效的压缩。因此,正确的操作顺序是:写数据时:先压缩后加密。读数据时:先解密后解压。
6. Cloudberry 中 TDE 的使用方法
Apache Cloudberry 提供透明数据加密功能,直接部署开启 TDE 功能即可,此后的数据加密操作对于用户来说是透明,不需要额外关注。想要在部署 开启 TDE,使用 gpinitsystem 进行初始化数据库时候,用户需要指定 -T 参数。支持 AES 和 SM4 两种加密算法,开启的方法如下:
开启 TDE 特性,并指定加密算法为 AES:
gpinitsystem -c gpinitsystem_config -T AES256
复制开启 TDE 特性,并指定加密算法为 SM4:
gpinitsystem -c gpinitsystem_config -T SM4
7.性能测评
开启 TDE 后,尽管可以显著提高静态数据的安全性,但也会对数据库的读写性能造成一定影响。在实际使用中,建议根据业务需求综合考虑是否启用 TDE。在 TPCH 性能测试中,使用 AES256 算法时,性能损失在 5% 以内。测试环境:华为云 ECS 主机,计算节点配置:16 核 CPU / 32GB 内存 / 200GB SSD,部署 3 个 segment 节点。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。