RDS PostgreSQL提供了rds_encdb外掛程式,用於對查詢結果集的敏感列進行加密。同時,通過對資料庫賬戶許可權進行設定,相關賬戶在訪問敏感列資訊時,僅能獲得密文格式的查詢結果。
目前尚不支援在目標資料庫中手動直接安裝rds_encdb外掛程式。如需進行自主安裝,請聯絡我們並獲得授權後,按照本文操作使用外掛程式。
前提條件
執行個體大版本為RDS PostgreSQL 16。
執行個體核心小版本為20250228及以上。
如需升級核心小版本,請參見升級核心小版本。
應用情境
rds_encdb外掛程式適用於需要對查詢結果進行動態脫敏的情境,尤其適合金融、醫學和電商等高敏感性資料行業。例如:
資料動態加密情境
合規審計情境
第三方資料共用情境
通過使用該外掛程式,您無需修改業務代碼即可實現結果集級加密,從而在保證查詢效率的同時維護資料隱私。
使用限制
當前暫不支援以下SQL特性:
函數返回的查詢結果集。
非SELECT類型查詢,例如遊標操作、prepare/execute語句。
CTE和UNION子句。
安裝外掛程式
設定列加密策略
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。
設定樣本
使用測試帳號test_user串連RDS PostgreSQL執行個體,建立測試表,並插入測試資料。
CREATE TABLE test(a text,b text,c text); INSERT INTO test VALUES ('foo','bar','hello world');查詢測試表中的資料,此時返回的結果為明文。
SELECT * FROM test;返回結果:
a | b | c -----+-----+------------- foo | bar | hello world (1 row)使用安裝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');使用測試帳號test_user串連RDS PostgreSQL執行個體,查詢測試表中的資料,此時返回的結果為密文。
SELECT * FROM test;返回結果:
a | b | c ------------------------------------------------------------------+------------------------------------------------------------------+------------- 1yAZAAAACVyTxvBACK5JFw0w/ZU62Yt9btkv9bSN8TcJWOfXCiWVnCqnakSZCwI= | DSAZAAAACaSrnhi0usv3MiJsgRQKXA5xEArdALSdnFVjqD0nrd1s6ilShhw00EM= | hello world (1 row)在中繼資料表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 | 帳號的加密列許可權:
|
salt | text | 帳號對應的密鑰。使用encjdbc方式訪問時,用戶端在建立串連後會自行設定並產生。 |
expire_time | timestamptz | 帳號加密列許可權的到期時間。超過配置時間後,加密列許可權將會變更為RESTRICTED ACCESS。 格式為: |
設定樣本
以上文已經設定了加密策略的表test為例,建立表的帳號test_user,預設RESTRICTED ACCESS許可權。
使用測試帳號test_user串連RDS PostgreSQL執行個體,查詢測試表中的資料,此時返回的結果為密文。
SELECT * FROM test;返回結果:
a | b | c ------------------------------------------------------------------+------------------------------------------------------------------+------------- 1yAZAAAACVyTxvBACK5JFw0w/ZU62Yt9btkv9bSN8TcJWOfXCiWVnCqnakSZCwI= | DSAZAAAACaSrnhi0usv3MiJsgRQKXA5xEArdALSdnFVjqD0nrd1s6ilShhw00EM= | hello world (1 row)使用安裝rds_encdb外掛程式的帳號(高許可權帳號)串連RDS PostgreSQL,為目標帳號設定加密列許可權。
SELECT rds_encdb.setup_encryption_role('test_user','FULL ACCESS','2025-04-17 16:01:02.509447+00');查看已經設定加密列許可權的帳號。
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)使用測試帳號test_user串連RDS PostgreSQL執行個體,查詢測試表中的資料,此時返回的結果為明文。
SELECT * FROM test;返回結果:
a | b | c -----+-----+------------- foo | bar | hello world (1 row)