设置透明数据加密

在安全合规或静态数据加密等场景下,推荐使用透明数据加密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加密

  1. 访问RDS实例列表,在上方选择地域,然后单击目标实例ID。

  2. 在左侧导航栏单击数据安全性

  3. TDE页签单击未开通左边的滑块。

  4. 选择密钥类型,单击确定,开通TDE。

    • 使用由阿里云自动生成的密钥:该方式使用的加密密钥(KEK)为KMS的服务密钥。

    • 使用已有自定义密钥:该方式使用的加密密钥(KEK)为您上传至KMS的自定义密钥(CMK)。如果没有自定义密钥,需要单击前往创建,在密钥管理服务控制台创建密钥并导入自带的密钥材料。详情请参见创建密钥

    说明

    加密原理请参见TDE加密解密原理

  5. (可选)更换密钥。

    1. TDE页签单击TDE状态右侧的更换密钥

    2. 选择使用由阿里云自动生成的密钥使用已有自定义密钥,选择密钥,单击确定

使用TDE对表或索引进行加密或解密

实例级别开启了TDE之后,您还需要对RDS PostgreSQL的表进行表级别的TDE加密解密操作。

说明

加密和解密会带来性能损耗,请合理控制加密范围以减少性能损耗。

加密

  • 全局设置

    您可以在RDS控制台设置参数rds_default_table_encryptionON,当开启此参数后,新建的表(CREATE TABLE)、索引(CREATE INDEX)将会默认加密。

    说明
    • 该参数仅适用于RDS PostgreSQL 13、14和15实例,如何修改参数,请参见设置实例参数

    • 如果未找到此参数,请升级内核小版本至最新后再尝试。具体操作,请参见升级内核小版本

    • 如果您将参数rds_default_table_encryption的取值由ON修改为OFF,仅影响后续创建的表或索引,之前已创建默认加密的表和索引不受影响。

  • 指定表、索引加密

    • 表加密。

      -- 创建加密表
      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

    描述

    开启TDE

    开启RDS实例透明数据加密。