透明数据加密(TDE)需要使用ALTER语句对表或索引进行加解密,为减少您重复加解密的操作,RDS PostgreSQL提供此插件,用于批量加密、解密。

前提条件

RDS PostgreSQL实例需满足以下要求:
  • 实例大版本为PostgreSQL 10或以上。
  • 实例内核小版本为20221030或以上。
    说明 如需升级内核小版本,请参见升级内核小版本
  • 您已开通透明数据加密,具体请参见设置透明数据加密

注意事项

执行批量加密或解密命令后,会一直等待执行完成后再返回结果,如果数据库中的表数量较多时,可能耗时较长,请谨慎使用。

创建和删除插件

说明 推荐使用高权限账号可以执行如下命令。
  • 创建插件
    CREATE EXTENSION rds_tde_utils;
  • 删除插件
    DROP EXTENSION rds_tde_utils;

使用示例

  1. 创建测试数据。
    CREATE TABLE table_a(id int);
    CREATE INDEX index_a1 ON table_a(id);
    CREATE INDEX index_a2 ON table_a USING hash(id);
    CREATE TABLE table_b(id int);
    CREATE INDEX index_b1 ON table_b(id);
    CREATE INDEX index_b2 ON table_b USING hash(id);
  2. 批量加密。
    说明
    加密过程会对表进行重写,您可以选择rds_tde_lazy_encrypt_tablerds_tde_encrypt_table任意一个函数对表进行加密,两个函数的重写逻辑如下:
    • rds_tde_lazy_encrypt_table的重写逻辑与LAZY VACUUM类似。
    • rds_tde_encrypt_table的重写逻辑与VACUUM FULL类似,请勿在业务高峰期进行加密。
    • 批量加密表table_a及其关联索引(index_a1和index_a2)。
      • SELECT rds_tde_lazy_encrypt_table('table_a'::regclass);
      • SELECT rds_tde_encrypt_table('table_a'::regclass);
    • 批量加密当前数据库下的所有表(table_a和table_b)及其关联索引。
      • SELECT rds_tde_lazy_encrypt_database();
      • SELECT rds_tde_encrypt_database();
  3. 批量解密。
    说明
    解密过程会对表进行重写,您可以选择rds_tde_lazy_decrypt_tablerds_tde_decrypt_table中任意一个函数对表进行解密,两个函数的重写逻辑如下:
    • rds_tde_lazy_decrypt_table的重写逻辑与LAZY VACUUM类似。
    • rds_tde_decrypt_table的重写逻辑与VACUUM FULL类似,请勿在业务高峰期进行解密。
    • 批量解密表table_a及其关联索引(index_a1和index_a2)。
      • SELECT rds_tde_lazy_decrypt_table('table_a'::regclass);
      • SELECT rds_tde_decrypt_table('table_a'::regclass);
    • 批量解密当前数据库下的所有表(table_a和table_b)及其关联索引。
      • SELECT rds_tde_lazy_decrypt_database();
      • SELECT rds_tde_decrypt_database();