
随着数字化和互联网技术的快速发展,企业面临着越来越复杂的网络安全威胁,数据泄露事件频发。为了保护敏感信息,维护客户信任,确保业务连续性,数据加密已成为必不可少的安全措施。ArgoDB 6.0 通过对接 KMS 服务管理加密密钥,实现透明存储加密(TDE)功能,主要包含以下内容:
|
功能介绍
加密、解密方式
ArgoDB 中 Holodesk 表依赖于 KMS 服务管理加密密钥,实现对 Meta Block 元信息进行数据的加密、解密操作。加密和解密的性能消耗取决于 Block 元信息的大小,其大小远远小于表数据,极大的提高了数据加密的性能,减小读写加密数据时导致的性能消耗。
由于 Holodesk 表依赖于 TDDMS 进行统一存储管理,TDDMS 的存储单元为 Tablet 难以实现对不同分区或分桶采用不同密钥加密,因此目前 Holodesk 加密密钥的粒度为表级。
目前对 Holodesk 表仅支持 国密 SM4 加密算法(GCM 模式),且暂不支持指定加密位数,默认为 128 位。

更换密钥版本管理
当密钥被更新后,KMS 服务需要管理不同版本的密钥信息,保证在读写加密数据时,根据不同版本的密钥进行加密和解密
-
在对加密表执行 INSERT、UPDATE 数据写入操作时,数据落盘前先使用最新密钥进行加密,保证在没有密码串的时候无法正常读取数据文件。
-
在对加密表执行 SELECT 读取操作时,数据文件会将密钥版本号记录在文件的 footer 中,在读取改文件时,KMS 根据各文件元信息中记录的版本找到对应的密钥,读取前先使用对应版本密码串进行解密后才能正常读取数据,如果密钥不对会报错 decrpted data failed
对接 KMS
通过将 Quark 与 KMS 进行对接,可以实现 Quark 从 KMS 获取加密密钥,实现读写加密数据功能,具体方法步骤:
为保障加密功能正常使用,请使用最新版本的 KMS 服务并安装最新补丁。 |
-
登录 Transwarp Manager 平台,安装 KMS 服务,并确定以下参数配置:
hadoop.kms.blacklist.GET 为空 default.key.acl.READ = hive
复制-
KMS 服务需要依赖于 Zookeeper
-
KMS 安装包的下载获取请登录 TPOMS 产品运营管理平台(星环技术工程师可登录)。
-
-
登录 Guardian 平台,进入租户管理界面,检查是否已创建 keyadmin 用户,若无,则新建用户:
-
在 Manager 平台配置 Quark 和 Compact Service 服务参数,修改以下参数指定 KMS 服务路径,并重启服务。
hadoop.security.key.provider.path = kms://http@<hostname>:16000/kms
复制-
<hostname>:KMS Server 对应节点主机名或 IP 地址。如果 KMS 服务有多个用英文分号
;
分隔。
-
-
通过 TDH-Client 手动创建对应的 key,保证加密表在 KMS 中能够匹配上对应的密钥
-
进入 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>
复制 -
使用管理员用户 keyadmin (需进行安全认证)创建加密密钥:
export HADOOP_USER_NAME=keyadmin # keyadmin 默认是管理员用户 hadoop key create <key_name>
复制-
<key_name>:自定义的密钥名称,目前支持数字、大小写字母和特殊字符
* % _ : - = ? + # @ ^ [ ] { } . / ~
,暂不支持! ( ) ` | $ ,< > ; & \
。
-
-
-
(可选)修改密码,我们提供以下命令修改数据加密的密钥,同时提供密钥版本管理功能:
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 进行查看密钥信息。
-
登录 TDDMS Webserver,进入库表页面,使用表名称查询,点击 Name 对应表名进入该表详情页面:
-
点击 Description,搜索 encryption_key_name 属性即可查看指定 Holodesk 表的密钥信息:
-
使用示例
-
Manager 平台安装 KMS 服务,并修改服务配置参数:
-
修改 Quark 和 Compact Service 服务参数:
-
进入 Guardian 平台,创建 keyadmin 角色
-
登录 TDH-Client 节点,修改配置文件
cd /root/TDH-Client/conf/hadoop vim core-site.xml ##编辑完成后保存退出
复制 -
创建加密密钥
## 初始化、安全认证 source /root/TDH-Client/init.sh kinit keyadmin ## 创建 key export HADOOP_USER_NAME=keyadmin hadoop key create key_test
复制 -
通过 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 | +----------------------------------+-------------------------------+
复制 -
向加密表中插入数据
insert into table test_encryption values(1),(2);
复制 -
查看 INFO 日志信息,查看是否从 KMS 拿到了密钥
-
登录 DBA Service,临时修改 Quark 日志级别为 INFO(默认为 WARN)
-
进入节点 Quark Server 日志路径 /var/log/quark1/quark-server.log,若出现字段“Get key name from KMS for encryption table”表明从 KMS 拿取了加密表的密钥。
-