在安全合规或静态数据加密等场景下,推荐使用透明数据加密TDE功能。TDE对数据文件执行实时I/O加密和解密,通过在数据库层加密静态数据,阻止攻击者直接从存储中读取敏感信息,有效提高数据的安全性。
背景信息
TDE原理请参见TDE加密解密原理。
前提条件
RDS PostgreSQL实例需满足以下要求:
实例大版本为PostgreSQL 10或以上版本。
存储类型为云盘。
实例内核小版本为20221030或以上。查看和升级内核小版本请参见升级内核小版本。
如果包含只读实例,只读实例也需满足以上条件。
已使用阿里云主账号授权RDS访问密钥管理服务KMS(Key Management Service)。详情请参见授权RDS访问KMS。
已开通密钥管理服务KMS(Key Management Service)。如果您未开通KMS,可在开通TDE过程中根据引导开通KMS。
注意事项
确保主实例和只读实例内核小版本均为20221030及以上,否则开通TDE加密会失败。
开通TDE后,I/O密集型(I/O bound)场景可能会对数据库性能产生一定影响。
TDE实例不支持用户通过物理流复制自建备库。
TDE开通后无法关闭。
确保密钥管理服务KMS状态正常,否则云盘无法解密,整个实例将不可用。
使用已有自定义密钥时,需要注意:
禁用或删除了KMS的自定义密钥,将会造成RDS实例无法正常工作,受影响的操作包括:创建快照、恢复快照和备库重建等。
撤销授权关系后,重启RDS实例会导致RDS实例不可用。
需要使用主账号或者具有AliyunSTSAssumeRoleAccess权限的账号。
说明关于密钥的相关操作请参见密钥管理服务。
开通TDE加密
更换密钥
访问RDS实例列表,在上方选择地域,然后单击目标实例ID。
在左侧导航栏单击数据安全性。
在TDE页签单击TDE状态右侧的更换密钥。
选择使用由阿里云自动生成的密钥或使用已有自定义密钥,选择密钥,单击确定。
使用TDE对表或索引进行加密或解密
实例级别开启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可以防止备份泄露导致数据泄露,备份文件是加密的。如果要恢复数据到本地,需要在恢复过程中进行解密。
相关文档
关于密钥的相关操作请参见密钥管理服务。
设置全局加密时,如何修改rds_default_table_encryption参数,请参见设置实例参数。
RDS PostgreSQL提供rds_tde_utils插件,用于批量加密、解密索引、表、数据库对象。
开启SSL访问链路加密,具体操作请参见SSL链路加密。
如果您需要对数据表中的指定敏感数据列进行加密,可以开启全密态数据库(公测),加密后,敏感数据将以密文进行传输、计算和存储。
您还可以使用API开启透明数据加密。
API
描述
开启RDS实例透明数据加密。