暂无图片
暂无图片
7
暂无图片
暂无图片
暂无图片

内核探究|Apache Cloudberry 透明数据加密(TDE)技术解析

HashData 1天前
46

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 节点。

        推荐阅读

        👇🏻️扫码加入 Apache Cloudberry 交流群👇🏻️

        文章转载自HashData,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

        评论