本文为您介绍如何在Hologres中对数据进行加密处理,本文包括数据加密机制、使用限制及操作步骤。
背景信息
Hologres支持通过密钥管理服务KMS(Key Management Service)对数据进行加密存储,提供数据静态保护能力,满足企业监管和安全合规需求。开启加密存储后,由于涉及加密和解密操作,所以会影响查询和写入性能,大约有20%-40%的性能损耗,具体情况根据查询特征有不同程度的影响。
使用限制
- 仅Hologres V1.1及以上版本支持数据加密存储,如果您的实例是V1.1以下版本,请您使用自助升级或加入实时数仓Hologres交流群(钉钉群号:32314975)申请升级实例。
- 使用数据存储加密功能时,如果您的实例版本低于V1.3.31需要添加后台配置。Hologres从V1.3.31版本开始无需添加后台配置,如需使用该功能,建议您升级实例,详情请参见实例升级。
- 您在KMS上对自带密钥(BYOK)的操作(例如禁用或删除),会影响Hologres对数据的加密或解密操作。由于Hologres服务涉及缓存,您在KMS的相关操作会在24小时内生效。
- 存储加密仅会对开启存储加密后的数据表生效,对于开启存储加密前创建的数据表,系统不会对其进行存储加密。
- 开启存储加密功能后,仍然可以在MaxCompute中创建Hologres外部表进行数据读写。
- 开启存储加密功能后,再使用如下SQL关闭数据库的存储加密,关闭前的表数据仍然是被加密的,只有关闭后新创建的表才不会使用存储加密。
ALTER DATABASE <database_name> set hg_experimental_encryption_options='';
- 开启存储加密表使用的KMS密钥被禁用或者失效,会导致该表的数据无法读写。
- Hologres从 V2.0版本开始支持为每张表设置单独的加密规则,即对于不同的表设置不同的KMS密钥进行加密。
数据加密机制
Hologres通过KMS托管密钥,实现数据加密或解密功能,数据加密机制如下。
- Hologres以数据库为单位,通过KMS加密或解密存储在Hologres的数据。在使用数据加密功能前,请确保您所在区域已开通KMS服务。
- KMS生成和管理您的密钥并保障密钥的安全性。
- Hologres支持的加密算法有AES256、AESCTR、RC4和SM4。
- Hologres仅支持自带密钥(BYOK)加密或解密数据,同时支持两类密钥材料,包括创建用户主密钥CMK时由KMS生成的密钥材料以及用户导入的密钥材料。
您可以通过KMS创建自带密钥(BYOK),并在Hologres中针对数据库,选择该密钥作为密钥进行数据加密。在KMS上创建BYOK的详情请参见创建密钥。
- 在数据读写时,Hologres会调用KMS的API获取相关的密钥信息,获取相关的密钥信息系统默认会缓存24小时。因此在使用数据加密功能时会产生相关的KMS费用,KMS相关计费说明请参见KMS计费说明。
操作步骤
- 创建自定义权限策略
- 创建Hologres代理角色并授权
- 创建密钥
- 设置加密规则一个设置加密规则并查询数据的简单使用示例如下。
- 对数据库开启存储加密。
ALTER DATABASE hoxxxx set hg_experimental_encryption_options= 'AES256,623c26ee-xxxx-xxxx-xxxx-91d323cc4855,AliyunHologresEncryptionDefaultRole,187xxxxxxxxxxxxx';
- 创建表并写入数据。
DROP TABLE IF EXISTS a; CREATE TABLE a(id int); INSERT INTO a values(1); SELECT hg_admin_command('flush'); -- 仅对测试使用,为了马上查询到效果使用
- 查询数据。
运行结果如下。SELECT * FROM a;
- 对数据库开启存储加密。
表级别存储加密设置
Hologres从V2.0版本开始支持在对数据库开启存储加密后,再针对单表设置加密规则,即可以针对不同的表使用不同的KMS密钥进行加密。
设置表级别存储加密规则
- 注意事项:
- 若不对表单独设置加密规则,系统会使用
hg_experimental_encryption_options
设置的加密规则作为表的加密规则。 - 设置必须要在建表时设置,不支持在表创建后再设置加密规则。
- 若不对表单独设置加密规则,系统会使用
- 使用语法:
参数说明如下:CALL SET_TABLE_PROPERTY('<table_name>', 'encryption_options', '<encryption_type>,<cmk_id>,<ram_role>,<uid>');
参数 说明 table_name 需要进行加密存储的表名称。 encryption_type 加密类型。仅支持AES256、AESCTR、RC4、SM4四种类型。 cmk_id 密钥ID。登录密钥管理服务控制台,密钥详情页获取。 ram_role 创建的Hologres代理角色名称。 uid 阿里云账号ID。获取详情请参见账号ID。 - 使用示例:创建表lineitem,并使用AES256加密类型、623c26ee-xxxx-xxxx-xxxx-91d323cc4855密钥加密。
BEGIN; CREATE TABLE LINEITEM ( L_ORDERKEY BIGINT NOT NULL, L_PARTKEY INT NOT NULL, L_SUPPKEY INT NOT NULL, L_LINENUMBER INT NOT NULL, L_QUANTITY DECIMAL(15,2) NOT NULL, L_EXTENDEDPRICE DECIMAL(15,2) NOT NULL, L_DISCOUNT DECIMAL(15,2) NOT NULL, L_TAX DECIMAL(15,2) NOT NULL, L_RETURNFLAG TEXT NOT NULL, L_LINESTATUS TEXT NOT NULL, L_SHIPDATE TIMESTAMPTZ NOT NULL, L_COMMITDATE TIMESTAMPTZ NOT NULL, L_RECEIPTDATE TIMESTAMPTZ NOT NULL, L_SHIPINSTRUCT TEXT NOT NULL, L_SHIPMODE TEXT NOT NULL, L_COMMENT TEXT NOT NULL, PRIMARY KEY (L_ORDERKEY,L_LINENUMBER) ); CALL SET_TABLE_PROPERTY('LINEITEM', 'encryption_options', 'AES256,623c26ee-xxxx-xxxx-xxxx-91d323cc4855,AliyunHologresEncryptionDefaultRole,153xxxxxxxxxxxxx'); COMMIT;
查看存储加密规则
Hologres从V2.0版本开始,您可以使用如下SQL查看每张表的加密规则。
SELECT
*
FROM
hologres.hg_table_properties
WHERE
property_key = 'encryption_options';
示例返回结果: