在安全合规或静态数据加密等场景下,推荐使用透明数据加密TDE功能,对数据文件执行实时I/O加密和解密,通过在数据库层执行静态数据加密,阻止可能的攻击者绕过数据库直接从存储中读取敏感信息,有效提高数据库中敏感数据的安全性。
前提条件
RDS PostgreSQL实例需满足以下要求:
实例大版本为PostgreSQL 10或以上版本。
存储类型为云盘。
实例内核小版本为20221030或以上。查看内核小版本请参见升级内核小版本。
如果包含只读实例,只读实例也需满足以上条件。
说明如需升级内核小版本,请参见升级内核小版本。
已使用阿里云主账号授权RDS访问密钥管理服务KMS(Key Management Service)。详情请参见授权RDS访问KMS。
已开通密钥管理服务KMS(Key Management Service)。如果您未开通KMS,可在开通TDE过程中根据引导开通KMS。
注意事项
如果包含只读实例,请确保主实例和只读实例内核小版本均升级到20221030以上,否则开通TDE加密会失败。
TDE开通过程中会重启实例造成实例切换,请做好业务安排,谨慎操作。实例切换的影响请参见实例切换的影响。
TDE开通后无法关闭。
开通TDE后,如果是I/O密集型(I/O bound)场景,可能会对数据库性能产生一定影响。
TDE实例不支持用户通过物理流复制自建备库。
如果密钥管理服务KMS欠费,将会导致云盘无法解密,整个实例不可用,请确保KMS状态正常。
使用已有自定义密钥时,需要注意:
禁用或删除了KMS的自定义密钥,将会造成RDS实例无法正常工作,受影响的操作包括:创建快照、恢复快照和备库重建等。
撤销授权关系后,重启RDS实例会导致RDS实例不可用。
需要使用主账号或者具有AliyunSTSAssumeRoleAccess权限的账号。
说明关于密钥的相关操作请参见密钥管理服务。
开通TDE加密
访问RDS实例列表,在上方选择地域,然后单击目标实例ID。
在左侧导航栏单击数据安全性。
在TDE页签单击未开通左边的滑块。
选择密钥类型,单击确定,开通TDE。
使用由阿里云自动生成的密钥:该方式使用的加密密钥(KEK)为KMS的服务密钥。
使用已有自定义密钥:该方式使用的加密密钥(KEK)为您上传至KMS的自定义密钥(CMK)。如果没有自定义密钥,需要单击前往创建,在密钥管理服务控制台创建密钥并导入自带的密钥材料。详情请参见创建密钥。
说明加密原理请参见TDE加密解密原理。
(可选)更换密钥。
在TDE页签单击TDE状态右侧的更换密钥。
选择使用由阿里云自动生成的密钥或使用已有自定义密钥,选择密钥,单击确定。
使用TDE对表或索引进行加密或解密
实例级别开启了TDE之后,您还需要对RDS PostgreSQL的表进行表级别的TDE加密解密操作。
加密和解密会带来性能损耗,请合理控制加密范围以减少性能损耗。
加密
全局设置
您可以在RDS控制台设置参数rds_default_table_encryption为ON,当开启此参数后,新建的表(CREATE TABLE)、索引(CREATE INDEX)将会默认加密。
指定表、索引加密
表加密。
-- 创建加密表 CREATE TABLE <tablename> WITH (encryption=on); -- 修改表为加密类型 ALTER TABLE <tablename> SET (encryption=on);
索引加密。
-- 创建加密索引 CREATE INDEX <indexname> ... WITH (encryption=on); -- 修改索引为加密类型 ALTER INDEX <indexname> SET (encryption=on);
说明支持6种索引的加密:btree、hash、spgist、gin、gist和brin。
解密
以下ALTER语句会触发表或索引的重写,类似VACUUM FULL,请勿在业务高峰期执行。
解密加密表。
ALTER TABLE <tablename> SET (encryption=off);
解密加密索引。
ALTER INDEX <indexname> SET(encryption=off);
查看表或索引的加密状态
SELECT relname, reloptions FROM pg_class WHERE relname IN ('<tablename>', '<indexname>');
常见问题
开启TDE后,常用数据库工具(pgAdmin等)还能正常使用吗?
可以正常使用。
开启TDE后,还能正常迁移数据到其他RDS实例吗?
可以正常迁移。
加密后查看数据为什么还是明文的?
查询数据时会解密并读取到内存,所以是明文显示。开启TDE可以防止备份泄露导致数据泄露,备份文件是加密的,无法用于恢复到本地,如果要恢复数据到本地,需要先解密数据。