1. 介紹
資料編輯(Data Redaction)功能是一種動態資料脫敏機制,針對資料查詢時的敏感資料進行動態的安全保護,透過設定策略對錶的欄位進行動態查詢時動態修訂。
一個完整的資料編輯策略由三部分組成:資料編輯函式、資料編輯策略應用 SQL命令、相應的許可權配置。
在啟用資料編輯之前,需開啟引數開關:redaction_policy。可透過命令列或直接修改 conf 檔案進行修改。命令列格式如下:
alter system set redaction_policy to on;
select pg_reload_conf();
2. 建立編輯策略
語法:
CREATE REDACTION POLICY <name> ON <table_name>
[ ADD [ COLUMN ] <column_name>[,…] USING <funcname_clause> ]
[, ...]
[ FOR ( <expression> ) ]
DISABLE/ENABLE;
解析:
-
name:當前策略的名稱,
-
table_name:當前資料編輯策略作用為哪張表
-
column_name:策略應用於哪個列
-
funcname_clause:資料編輯函式名稱,目前支援的脫敏函式見下文函式列表
-
expression:表示式,即對哪些使用者執行資料編輯策略。比如 user=’u1’,就是對 u1
-
使用者執行資料編輯策略,其他使用者不執行
不同測略透過不同的編輯函式實現,如
-
redact_bankcard 支援的資料型別有BPCHAR, VARCHAR, NVARCHAR, TEXT(注:僅針對信用卡格式的文字類資料)。示例 '4880-9898-4545-2525' 將會被脫敏為'xxxx-xxxx-xxxx-2525',該函式僅對後 4 位之前的數字進行脫敏。
-
redact_emailname 支援的資料型別有 BPCHAR, VARCHAR, NVARCHAR, TEXT (注:僅針對 email 格式的文字型別資料)。示例 'abcd@gmail.com' 將會被脫敏為'xxxx@gmail.com', 對出現第一個'@'之前的文字進行脫敏
-
redact_phone 支援的資料型別有 BPCHAR, VARCHAR, NVARCHAR, TEXT (注:僅對電話號碼碼的文字型別資料)。示例 對電話號碼進行脫敏。適用於手機號和固話號。保留前三位和後四位,對中間數字進行脫敏。如“13534556093” 脫敏為“135****6093”
詳細策略參考 《瀚高安全版資料庫系統V4.5-管理手冊.pdf-6.5.6 資料編輯函式列表》
3. 其他操作
修改資料編輯策略
修改當前策略中,列 colname 使用的資料編輯函式
ALTER REDACTION POLICY policyname MODIFY COLUMN colname USING func_name;
刪除資料編輯策略
DROP REDACTION POLICY policynamelist
例:
DROP REDACTION POLICY p1; --刪除資料編輯策略 p1
4. 使用限制
限制
1、建立策略只能使用 syssso 進行設定,其他使用者無許可權。
2、一張表中只能建立一個策略
3、一個列只能指定一個資料編輯函式
5. 示例
建立表
\c highgo sysdba
create table test_redaction (id int,name varchar(22),salary int,hiredate timestamp,telephone text);
insert into test_redaction values (1,'aaa',20000,'2022-06-21 14:00:00','15512345678');
授權使用者
create user test with password 'Hg#123456'; --建立一個新使用者
grant select on test_redaction to test; --授權
開啟編輯策略
alter system set redaction_policy to on;
select pg_reload_conf();
show redaction_policy;
建立編輯策略,多列
\c highgo syssso
create redaction policy p1 on test_redaction add column salary using redact_digits,add column telephone using redact_phone for (user = 'test');
使用遮蔽使用者查詢資料
\c highgo test
select * from test_redaction;
highgo=> select * from test_redaction ;
id | name | salary | hiredate | telephone
----+------+--------+---------------------+-------------
1 | aaa | 0 | 2022-06-21 14:00:00 | 155****5678
(1 row)