联 系 我 们
售前咨询
售后咨询
微信关注:星环科技服务号
更多联系方式 >
6.6.1 透明存储加密(TDE)
更新时间:3/14/2025, 6:29:56 AM

随着数字化和互联网技术的快速发展,企业面临着越来越复杂的网络安全威胁,数据泄露事件频发。为了保护敏感信息,维护客户信任,确保业务连续性,数据加密已成为必不可少的安全措施。ArgoDB 6.0 通过对接 KMS 服务管理加密密钥,实现透明存储加密(TDE)功能,主要包含以下内容:

  • Linac 引擎暂不支持 KMS 数据加密和解密功能。

  • 本章节只介绍 Holodesk 加密功能,但 KMS 仍支持通过 HDFS 加密空间实现对非 Holodesk 表数据文件加密,请参考 《Inceptor 使用手册》的数据加密章节

功能介绍

加密、解密方式

ArgoDB 中 Holodesk 表依赖于 KMS 服务管理加密密钥,实现对 Meta Block 元信息进行数据的加密、解密操作。加密和解密的性能消耗取决于 Block 元信息的大小,其大小远远小于表数据,极大的提高了数据加密的性能,减小读写加密数据时导致的性能消耗。

由于 Holodesk 表依赖于 TDDMS 进行统一存储管理,TDDMS 的存储单元为 Tablet 难以实现对不同分区或分桶采用不同密钥加密,因此目前 Holodesk 加密密钥的粒度为表级

目前对 Holodesk 表仅支持 国密 SM4 加密算法(GCM 模式),且暂不支持指定加密位数,默认为 128 位

kms encryption process
图 20. 读写加密、解密流程

更换密钥版本管理

当密钥被更新后,KMS 服务需要管理不同版本的密钥信息,保证在读写加密数据时,根据不同版本的密钥进行加密和解密

  • 在对加密表执行 INSERT、UPDATE 数据写入操作时,数据落盘前先使用最新密钥进行加密,保证在没有密码串的时候无法正常读取数据文件。

  • 在对加密表执行 SELECT 读取操作时,数据文件会将密钥版本号记录在文件的 footer 中,在读取改文件时,KMS 根据各文件元信息中记录的版本找到对应的密钥,读取前先使用对应版本密码串进行解密后才能正常读取数据,如果密钥不对会报错 decrpted data failed

对接 KMS

通过将 Quark 与 KMS 进行对接,可以实现 Quark 从 KMS 获取加密密钥,实现读写加密数据功能,具体方法步骤:

为保障加密功能正常使用,请使用最新版本的 KMS 服务并安装最新补丁。

  1. 登录 Transwarp Manager 平台,安装 KMS 服务,并确定以下参数配置:

    hadoop.kms.blacklist.GET 为空
    default.key.acl.READ = hive
    复制
    kms kms parameters
    • KMS 服务需要依赖于 Zookeeper

    • KMS 安装包的下载获取请登录 TPOMS 产品运营管理平台(星环技术工程师可登录)。

  2. 登录 Guardian 平台,进入租户管理界面,检查是否已创建 keyadmin 用户,若无,则新建用户:

    kms guardian keyadmin
  3. 在 Manager 平台配置 Quark 和 Compact Service 服务参数,修改以下参数指定 KMS 服务路径,并重启服务。

    hadoop.security.key.provider.path = kms://http@<hostname>:16000/kms
    复制
    • <hostname>:KMS Server 对应节点主机名或 IP 地址。如果 KMS 服务有多个用英文分号 ; 分隔。

  4. 通过 TDH-Client 手动创建对应的 key,保证加密表在 KMS 中能够匹配上对应的密钥

    1. 进入 TDH-Client 安装节点,进入路径 ~/TDH-Client/conf/hadoop/core-site.xml,手动添加的配置参数指定 KMS 访问路径。例如:

      <property>
          <name>hadoop.security.key.provider.path</name>
          <value>kms://http@localhost:16000/kms</value>
      </property>
      复制
    2. 使用管理员用户 keyadmin (需进行安全认证)创建加密密钥:

      export HADOOP_USER_NAME=keyadmin # keyadmin 默认是管理员用户
      hadoop key create <key_name>
      复制
      • <key_name>:自定义的密钥名称,目前支持数字、大小写字母和特殊字符 * % _ : - = ? + # @ ^ [ ] { } . / ~,暂不支持 ! ( ) ` | $ ,< > ; & \

  5. (可选)修改密码,我们提供以下命令修改数据加密的密钥,同时提供密钥版本管理功能

    hadoop key roll <new_key_name>
    复制
加密表

创建加密表

创建 Holodesk 表时支持使用 with encryption_keyname 明确该表的明文密钥 <key_name>

CREATE TABLE [IF NOT EXISTS] --[1]
[<database_name>.]<table_name> --[2]
(<column_name1> <DATATYPE1> [NOT NULL] [COMMENT "<column_text>"], --[3]
<column_name2> <DATATYPE2> [NOT NULL] [COMMENT "<column_text>"],
<column_name3> <DATATYPE3> [NOT NULL] [COMMENT "<column_text>"],
...) [COMMENT "<table_text>"] --[4]
STORED AS HOLODESK
with encryption_keyname "<key_name>"
[tblproperties("holodesk.storage.format"="row")] --[5]
;
复制
  • <database_name>:将表建在指定的数据库中。

  • <table_name>:表名称。

  • <column_name>:列名称,长度不超过 128,且列的数量最大为 1000。

  • <key_name>:

  • <DATATYPE>:数据类型。

  • <column_text>:列注释信息。

  • <table_text>:表注释信息。

  • <property_name>:表属性名称,包括。

  • <property_value>:表属性值。

  • 可选项 [1],如果 <table_name> 指定的表已经存在,会报错,加上 IF NOT EXISTS 选项在建表前检测是否已存在同名表。

  • 可选项 [2],支持指明表所在的数据库名称。

  • 可选项 [3],支持非空 [NOT NULL] 约束。

  • 可选项 [4],用 [COMMENT] 为表或列加注释,注意注释要放在引号中。

  • 可选项 [5],支持对 Holodesk 行存表进行 KMS 加密

查看表密钥信息

支持通过以下两种方式查看 Holodesk 加密表的密钥信息:

  • 加密表对应的密钥信息,可以通过查看 DESC FORMATTED 结果中 holodesk.encryption.key.name 属性值。

  • 依赖于 TDDMS 存储的加密表,也可以登录 TDDMS Webserver 进行查看密钥信息。

    1. 登录 TDDMS Webserver,进入库表页面,使用表名称查询,点击 Name 对应表名进入该表详情页面:

      kms tddmswebserver table
    2. 点击 Description,搜索 encryption_key_name 属性即可查看指定 Holodesk 表的密钥信息:

      kms tddmswebserver table description
使用示例
  1. Manager 平台安装 KMS 服务,并修改服务配置参数:

    kms kms parameters
  2. 修改 Quark 和 Compact Service 服务参数:

    kms example quark configure
    kms example compactservice configure
  3. 进入 Guardian 平台,创建 keyadmin 角色

    kms guardian keyadmin
  4. 登录 TDH-Client 节点,修改配置文件

    cd /root/TDH-Client/conf/hadoop
    vim core-site.xml  ##编辑完成后保存退出
    复制
    kms core site configure
  5. 创建加密密钥

    ## 初始化、安全认证
    source /root/TDH-Client/init.sh
    kinit keyadmin
    
    ## 创建 key
    export HADOOP_USER_NAME=keyadmin
    hadoop key create key_test
    复制
  6. 通过 Beeline 连接 Quark 服务,创建加密表

    create table test_encryption(id int) stored as holodesk with encryption_keyname "key_test";
    复制
    DESC FORMATTED test_encryption;
    
    -- 查看密钥信息
    +----------------------------------+-------------------------------+
    |               category           |           attribute           |
    +----------------------------------+-------------------------------+
    | # Category                       | Attribute                     |
    | id                               | int                           |
    | # Detailed Table Information     | #                             |
    | Database:                        | kms_test                      |
    | Owner:                           | admin                         |
    | cache                            | RAM                           |
    | holodesk.columns.mapping         | {"id":"id"}                   |
    | holodesk.databasename            | kms_test                      |
    | holodesk.encryption.key.name     | key_test                      |
    | holodesk.storage.format          | performance                   |
    +----------------------------------+-------------------------------+
    复制
  7. 向加密表中插入数据

    insert into table test_encryption values(1),(2);
    复制
  8. 查看 INFO 日志信息,查看是否从 KMS 拿到了密钥

    1. 登录 DBA Service,临时修改 Quark 日志级别为 INFO(默认为 WARN)

      dba quark log level
    2. 进入节点 Quark Server 日志路径 /var/log/quark1/quark-server.log,若出现字段“Get key name from KMS for encryption table”表明从 KMS 拿取了加密表的密钥。

      kms quarkserver info log