细粒度透明数据加密
数据库加密是保护敏感数据安全的关键手段,通过加密可以防止未经授权的用户访问和读取敏感数据。DWS的细粒度透明加密功能通过表级加密方式和列级加密方式提供了细粒度的加密能力,对数据库进行更加精准的数据安全保护,同时加密过程完全透明对应用层和SQL访问不会产生影响。用户可根据不同的数据敏感级别和访问需求来选择合适的加密方式。
细粒度透明加密支持两种加密算法:AES-CTR-128(非国密场景)和SM4-CTR-128(国密场景)。
开启国密SM4-CTR-128算法时,建议开启KAE(鲲鹏加速引擎,需联系技术支持开启GUC参数enable_kae_accelerate),否则会影响集群性能。(未开启KAE,集群性能会有大幅度损耗;开启KAE后,TPC-DS复杂查询场景下的列存整体性能劣化通常在5%至15%之间,行存整体性能劣化通常在50%以上,具体的劣化幅度取决于硬件是否提供KAE鲲鹏加速引擎)。
具体的细粒度透明数据加密语法请参考CREATE TABLE。
密钥缓存和轮转
执行ALTER CLUSTER ENCRYPTION KEY ROTATION命令进行密钥轮转后,系统会生成新的数据加密密钥(DEK)。每次轮转产生的密钥都会在首次访问时从KMS解密并缓存到本地缓存中,以减少后续访问KMS的网络开销。
TDE缓存容量通过GUC参数tde_cache_config(该参数需联系技术支持设置)的cachesize字段设置。当缓存中的密钥数量达到容量上限时,系统会按照最近最少使用策略淘汰旧密钥,为新密钥腾出空间。
若缓存容量设置过小,无法容纳所有历史轮转密钥,则被淘汰的密钥在下次访问时将产生缓存未命中,系统需重新从KMS获取并解密该密钥后再次写入缓存,这会增加I/O访问延迟。
缓存超时时间通过GUC参数tde_cache_config(该参数需联系技术支持设置)的cachetime字段设置。当设置为正数时,系统会定期清理超过该时间未被访问的缓存密钥,同样会导致后续访问时需要重新连接KMS。
建议合理规划密钥轮转的频率,根据业务实际需要缓存的密钥数量设置cachesize,确保缓存能够容纳所有活跃密钥,避免因缓存淘汰产生额外的KMS访问开销。同时,根据密钥访问的时间局部性特征合理设置cachetime,在内存占用与访问性能之间取得平衡。
注意事项
使用细粒度透明加密功能时,需遵守以下约束,避免影响业务正常运行:
- 细粒度透明加密仅9.1.1.200及以上集群版本支持,且需联系技术支持配置GUC参数tde_version为2。
- 细粒度透明加密仅行存表、列存2.0表支持。
- 行存表不支持列级的透明加密配置,仅列存表支持列级。
- 集群级透明加密和细粒度透明加密功能互斥,无法同时开启。已经开启了集群级透明加密,则无法开启细粒度透明加密功能。
- 集群升级观察期内,不支持创建透明加密表。
- 索引不支持修改透明加密配置。
- 不支持基于加密表创建物化视图,也不支持对物化视图加密。
- 普通列存+delta表、Hstore非opt表、行列混存表、LSM表不支持表级加密。
- 临时表不支持加密。
- 细粒度透明加密功能强依赖KMS(密钥管理服务)才能获取密钥,如果DWS集群使用细粒度加密功能时出现报错,需联系技术支持修复KMS故障。故障修复前不能重启DWS集群或者实例,否则会导致集群不可用。
操作示例
以员工信息表employees为例,使用细粒度透明加密功能。
- 创建表employees为初始未加密表。
CREATE TABLE employees ( emp_id int PRIMARY KEY, emp_name text, emp_email text, emp_phone text, salary decimal(10,2), hire_date date ); - 创建表级加密表employees_encrypted(AES-CTR-128算法),并将employees表数据迁移到employees_encrypted。
CREATE TABLE employees_encrypted ( emp_id int PRIMARY KEY, emp_name text, emp_email text, emp_phone text, salary decimal(10,2), hire_date date ) WITH (encrypt_option = table,encrypt_algo = AES_CTR_128); INSERT INTO employees_encrypted SELECT * FROM employees; - 创建SM4加密(国密算法)的薪资表salaries。
CREATE TABLE salaries ( emp_id int, salary decimal(10,2), bonus decimal(10,2), effective_date date ) WITH (encrypt_option = table, encrypt_algo = SM4_CTR_128); - 创建列级加密表hr_analysis,仅针对敏感列“salary”信息加密。
CREATE TABLE hr_analysis ( emp_id int, emp_name text, emp_department text, salary decimal(10,2) ENCRYPT, -- 仅薪资列加密 performance_score int ) WITH (orientation = column, encrypt_option = column); - 列级加密表hr_analysis由指定列加密修改为全列加密。
ALTER TABLE hr_analysis MODIFY (emp_id to encrypt); ALTER TABLE hr_analysis MODIFY (emp_name to encrypt); ALTER TABLE hr_analysis MODIFY (emp_department to encrypt); ALTER TABLE hr_analysis MODIFY (performance_score to encrypt); VACUUM FULL hr_analysis;
- 对加密表进行解密。
ALTER TABLE employees_encrypted SET (encrypt_option = off); VACUUM FULL employees_encrypted;
对初始未加密表开启加密。
ALTER TABLE employees SET (encrypt_option = table); VACUUM FULL employees;
- 修改表的加密算法为SM4。
ALTER TABLE employees SET (encrypt_algo = SM4_CTR_128); VACUUM FULL employees; ALTER TABLE hr_analysis SET (encrypt_algo = SM4_CTR_128); VACUUM FULL hr_analysis;
- 定期密钥轮转,按安全策略每半年执行一次密钥轮转。
ALTER CLUSTER ENCRYPTION KEY ROTATION;