全部產品
Search
文件中心

ApsaraDB RDS:敏感欄位加密(rds_encdb)

更新時間:Apr 19, 2025

RDS PostgreSQL提供了rds_encdb外掛程式,用於對查詢結果集的敏感列進行加密。同時,通過對資料庫賬戶許可權進行設定,相關賬戶在訪問敏感列資訊時,僅能獲得密文格式的查詢結果。

重要

目前尚不支援在目標資料庫中手動直接安裝rds_encdb外掛程式。如需進行自主安裝,請聯絡我們並獲得授權後,按照本文操作使用外掛程式。

前提條件

  • 執行個體大版本為RDS PostgreSQL 16。

  • 執行個體核心小版本為20250228及以上。

    如需升級核心小版本,請參見升級核心小版本

應用情境

rds_encdb外掛程式適用於需要對查詢結果進行動態脫敏的情境,尤其適合金融、醫學和電商等高敏感性資料行業。例如:

  • 資料動態加密情境

  • 合規審計情境

  • 第三方資料共用情境

通過使用該外掛程式,您無需修改業務代碼即可實現結果集級加密,從而在保證查詢效率的同時維護資料隱私。

使用限制

當前暫不支援以下SQL特性:

  • 函數返回的查詢結果集。

  • 非SELECT類型查詢,例如遊標操作、prepare/execute語句。

  • CTE和UNION子句。

安裝外掛程式

  1. 設定執行個體參數,將rds_encdb.enable_encryption的運行參數值改為on

  2. 請使用高許可權帳號串連目標資料庫,並執行以下SQL安裝rds_encdb外掛程式。如需建立高許可權帳號,請參見建立帳號

    CREATE EXTENSION rds_encdb;
    說明

    執行SELECT * FROM pg_extension;可以查看已安裝的外掛程式。

設定列加密策略

rds_encdb外掛程式通過中繼資料表rds_encdb.encryption_rule來記錄需要加密的列。如需對某一列資料啟用加密,只需向該表中插入相應的記錄。此後,針對該列的查詢將以密文格式返回,並且此設定對現有會話同樣有效。

rds_encdb.encryption_rule表結構

列名

類型

說明

id

int

主鍵,自增ID。

rule_name

name

表示該加密規則的名稱。

attrelid

regclass

該加密規則對應的表,需滿足 (rule_name, attrelid, attnum) 的唯一約束。

attnum

smallint

該加密規則對應的原表中列的序號。

密碼編譯演算法

預設的密碼編譯演算法為AES_256_GCM。

設定樣本

  1. 使用測試帳號test_user串連RDS PostgreSQL執行個體,建立測試表,並插入測試資料。

    CREATE TABLE test(a text,b text,c text);
    
    INSERT INTO test VALUES ('foo','bar','hello world');
  2. 查詢測試表中的資料,此時返回的結果為明文。

    SELECT * FROM test;

    返回結果:

      a  |  b  |      c
    -----+-----+-------------
     foo | bar | hello world
    (1 row)
  3. 使用安裝rds_encdb外掛程式的帳號(高許可權帳號)串連RDS PostgreSQL,向中繼資料表rds_encdb.encryption_rule插入一條記錄,以對test表的第1列和第2列進行加密。

    INSERT INTO rds_encdb.encryption_rule 
    VALUES 
        (9, 'rule1', 'test', '1'), 
        (10, 'rule1', 'test', '2');
  4. 使用測試帳號test_user串連RDS PostgreSQL執行個體,查詢測試表中的資料,此時返回的結果為密文。

    SELECT * FROM test;

    返回結果:

                                    a                                 |                                b                                 |      c
    ------------------------------------------------------------------+------------------------------------------------------------------+-------------
     1yAZAAAACVyTxvBACK5JFw0w/ZU62Yt9btkv9bSN8TcJWOfXCiWVnCqnakSZCwI= | DSAZAAAACaSrnhi0usv3MiJsgRQKXA5xEArdALSdnFVjqD0nrd1s6ilShhw00EM= | hello world
    (1 row)
  5. 在中繼資料表rds_encdb.encryption_rule中查看已設定的加密規則。

    SELECT * FROM rds_encdb.encryption_rule;

    返回結果:

     id | rule_name | attrelid | attnum
    ----+-----------+----------+--------
      9 | rule1     | test     |      1
     10 | rule1     | test     |      2
    (2 rows)

rds_encdb外掛程式提供了一張視圖,通過執行以下SQL,可以將設定的加密規則記錄以(規則名稱,表名)方式進行彙總。

SELECT * FROM rds_encdb.rules;

例如:

 rule_name | attrelid | attname_list
-----------+----------+--------------
 rule1     | test     | b,a
(1 row)

設定帳號加密列許可權

使用安裝rds_encdb外掛程式時的高許可權帳號,為目標帳號設定以下加密列許可權,若未進行設定,則預設為RESTRICTED ACCESS許可權。

帳號許可權

說明

FULL ACCESS

完全訪問加密列許可權。具備該許可權的帳號進行查詢時,返回結果中的加密列將以明文形式呈現。

RESTRICTED ACCESS

限制訪問加密列許可權。具備該許可權的帳號進行查詢時,返回結果中的加密列將以密文形式呈現。使用encjdbc方式訪問時,返回結果中的加密列將以明文形式呈現。

設定帳號加密列許可權

重要

使用安裝rds_encdb外掛程式時的高許可權帳號,為目標帳號

SELECT rds_encdb.setup_encryption_role('帳號', '加密列許可權', '到期時間');

取消帳號加密列許可權

SELECT rds_encdb.remove_encryption_role('帳號');

已設定加密列許可權的帳號將記錄在rds_encdb外掛程式的中繼資料表rds_encdb.encryption_role_auth中。該表的結構如下:

列名

類型

說明

role

regrole

主鍵,表示該加密許可權對應的使用者名稱。

role_type

char

帳號的加密列許可權:

  • rRESTRICTED ACCESS

  • fFULL ACCESS。

salt

text

帳號對應的密鑰。使用encjdbc方式訪問時,用戶端在建立串連後會自行設定並產生。

expire_time

timestamptz

帳號加密列許可權的到期時間。超過配置時間後,加密列許可權將會變更為RESTRICTED ACCESS

格式為:YYYY-MM-DD HH:MM:SS.ssssss+/-TZ

設定樣本

以上文已經設定了加密策略的表test為例,建立表的帳號test_user,預設RESTRICTED ACCESS許可權。

  1. 使用測試帳號test_user串連RDS PostgreSQL執行個體,查詢測試表中的資料,此時返回的結果為密文。

    SELECT * FROM test;

    返回結果:

                                    a                                 |                                b                                 |      c
    ------------------------------------------------------------------+------------------------------------------------------------------+-------------
     1yAZAAAACVyTxvBACK5JFw0w/ZU62Yt9btkv9bSN8TcJWOfXCiWVnCqnakSZCwI= | DSAZAAAACaSrnhi0usv3MiJsgRQKXA5xEArdALSdnFVjqD0nrd1s6ilShhw00EM= | hello world
    (1 row)
  2. 使用安裝rds_encdb外掛程式的帳號(高許可權帳號)串連RDS PostgreSQL,為目標帳號設定加密列許可權。

    SELECT rds_encdb.setup_encryption_role('test_user','FULL ACCESS','2025-04-17 16:01:02.509447+00');
  3. 查看已經設定加密列許可權的帳號。

    SELECT * FROM rds_encdb.encryption_role_auth;

    返回結果:

       role    | role_type | salt |          expire_time
    -----------+-----------+------+-------------------------------
     test_user | f         |      | 2025-04-18 00:01:02.509447+08
    (1 row)
  4. 使用測試帳號test_user串連RDS PostgreSQL執行個體,查詢測試表中的資料,此時返回的結果為明文。

    SELECT * FROM test;

    返回結果:

      a  |  b  |      c
    -----+-----+-------------
     foo | bar | hello world
    (1 row)