本文为您介绍如何在Hologres中对数据进行加密处理,本文包括数据加密机制、使用限制及操作步骤。
背景信息
Hologres支持通过密钥管理服务KMS(Key Management Service)对数据进行加密存储,提供数据静态保护能力,满足企业监管和安全合规需求。开启加密存储后,由于涉及加密和解密操作,所以会影响查询和写入性能,大约有20%-40%的性能损耗,具体情况根据查询特征有不同程度的影响。
使用限制
仅Hologres V1.1及以上版本支持数据加密存储,如果您的实例是V1.1以下版本,请您使用自助升级或加入Hologres钉钉交流群反馈,详情请参见如何获取更多的在线支持?。
使用数据存储加密功能时,如果您的实例版本低于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密钥进行加密。
仅支持对列存表以及行列共存模式中的列存表开启数据存储加密,其余表类型不支持。开启存储加密功能后,您仍然可以在MaxCompute中创建Hologres外部表以进行数据读写,且仅列存表、及行列共存中的列存表为加密模式,其余表类型不进行加密。
数据加密机制
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计费说明。
操作步骤
创建自定义权限策略
登录RAM控制台,单击左侧导航栏的权限策略,进入权限策略页面,单击创建权限策略。
进入创建权限策略页面,单击脚本编辑配置脚本如下所示且名称命名为AliyunHologresEncryptionDefaultRolePolicy。
{ "Version": "1", "Statement": [ { "Action": [ "kms:Encrypt", "kms:Decrypt", "kms:GenerateDataKey", "kms:DescribeKey" ], "Resource": "acs:kms:*:*:*/*", "Effect": "Allow" } ] }
单击确定,完成自定义权限策略的创建。
创建Hologres代理角色并授权
登录RAM控制台,单击左侧导航栏的角色。
进入角色页面,单击创建角色,进入创建角色对话框,选择可信实体类型为阿里云服务。
单击下一步,角色类型选择普通服务角色,角色名称命名为AliyunHologresEncryptionDefaultRole,设置选择受信服务为交互式分析,单击完成。
进入创建完成页面,单击为角色授权。
进入添加权限页面,授权范围选择整个云账号,选择权限为自定义策略中第一步创建的自定义角色策略(AliyunHologresEncryptionDefaultRolePolicy)。
单击确定,完成角色创建和授权操作。
在创建完角色后,单击创建的角色,在信任策略管理页签,可以查看信任策略的设置。
创建密钥
具体操作,请参见密钥管理快速入门。
重要Hologres只支持使用对称密钥,其密钥类型为Aliyun_AES_256。
设置加密规则
登录需要进行存储数据加密的数据库实例,登录数据库请参见登录数据库。
在临时Query查询页面,选择已创建的实例名和数据库后,请您在SQL查询的编辑框输入如下语句,单击运行。
一个设置加密规则并查询数据的简单使用示例如下。
对数据库开启存储加密。
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;
运行结果如下。
若此时禁用了KMS,在实例重启或者24小时后,查询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类型。
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';
示例返回结果: