Hologres為您提供資料脫敏功能,支援按照列層級設定脫敏。啟用該功能後,如果您查詢的資料涉及敏感資訊,則在展示結果中,該部分資料會被脫敏展示,提高了對敏感及私密資料的保護。本文為您介紹Hologres如何開啟、查詢及刪除資料脫敏功能。
背景資訊
隨著巨量資料時代的來臨,巨量資料、雲端運算和人工智慧等新技術應用不斷深化,為資料的深度挖掘及分析提供了強有力的支撐,巨量資料中蘊含的巨大價值被逐步挖掘出來。與此同時也帶來了敏感及私密資訊保護方面的棘手難題。
Hologres提供的資料脫敏功能,實現了資料在高效共用、挖掘及分析的同時,使得敏感及隱私資訊不被泄露,提高了對敏感及私密資料的保護。
版本對比
Hologres自V3.1版本開始,最佳化了資料脫敏行為。如下是V3.1版本以及低版本的功能對比,以便您更好的使用資料脫敏。
功能 | V3.1及以上版本 | V3.0及以下版本 |
非TEXT類型欄位脫敏 | 支援對INT、FLOAT、數組等類型設定預設脫敏策略,但是僅在設定Default值脫敏策略時生效。詳情請參見Default值。 | 不支援,但是可以通過CAST TEXT方式繞過脫敏(不建議)。 |
視圖(View) | 結果脫敏。 | 結果不脫敏(不建議)。 |
JOIN欄位或者Where條件有脫敏欄位 | 結果是空。 | 結果不脫敏(不建議)。 |
Flink消費脫敏欄位的Binlog |
|
|
MC直讀脫敏欄位 | 禁止通過MaxCompute直讀Hologres脫敏欄位。 | 支援讀取(不建議)。 |
準備工作
在使用資料脫敏之前,需要Superuser在資料庫層級開啟如下參數。
--superuser帳號執行
CREATE EXTENSION IF NOT EXISTS hg_anon;
ALTER DATABASE <current_db> SET hg_anon_enable = on;
執行上述代碼後,系統將根據Hologres的執行個體版本使用對應的資料脫敏行為。您還可以根據業務需要選擇脫敏行為:
若V3.1及以上版本的資料脫敏行為中有明顯的缺陷導致行為不符合預期,可以通過如下參數回退到V3.0及以下版本資料脫敏行為。
CALL hologres.set_hg_anon_version(1);
V3.0及以下版本的執行個體不支援set_hg_anon_version預存程序。如果已經使用過脫敏功能的執行個體升級至V3.1版本,則可以執行以下命令以啟用V3.1的脫敏功能。否則,系統將繼續使用舊版本的脫敏功能。
CALL hologres.set_hg_anon_version(2);
說明若該語句執行成功,則代表開啟V3.1及以上版本的資料脫敏行為。
若該語句執行失敗,錯誤記錄檔顯示:
"Error: not safe to upgrade to hg_anon version 2"
,則代表開啟失敗。原因在於當前DB中為非TEXT/VARCHAR/CHAR的列類型設定了脫敏,V3.1及以上版本的資料脫敏結果不符合預期,需要訂正脫敏行為。
使用限制
暫不支援從設定了脫敏規則的表和列向未設定脫敏規則的表和列匯入資料,相關報錯資訊如下。
錯誤原因:ERROR: The insert table has not set SECURITY LABEL
暫不支援針對設定了脫敏規則的表進行UNION和DISTINCT查詢,相關報錯資訊如下。
錯誤原因:ERROR: UNION is not support on security item
資料脫敏會一定程度的影響查詢效能,影響程度和脫敏方式、資料量都有關,效能有10%~20%的下降,極端情境可能存在數倍效能下降。
不支援對外部表格設定脫敏規則。
資料脫敏
設定脫敏規則
Hologres支援對目標列或目標使用者佈建資料脫敏。在進行資料脫敏之前,一定要開啟資料脫敏的GUC參數,詳情請參見準備工作。
文法
對列設定脫敏策略
對多列資料進行脫敏時,需要多次執行該語句。
SECURITY LABEL FOR hg_anon ON COLUMN <tablename>.<col_name> IS <label_name>/'default_value';
對使用者佈建脫敏策略
SECURITY LABEL FOR hg_anon ON ROLE <user_name> IS '[<label_name>|all]:[masked|unmasked]';
參數說明
參數
描述
hg_anon
hg_anon是Hologres內部封裝的擴充函數,您需要調用該擴充函數才能開啟資料脫敏功能。
tablename
需要脫敏的列所在的表名稱。
col_name
需要脫敏的列名稱。
label_name
系統預設的脫敏函數,您可以使用
SHOW hg_anon_labels;
查看當前資料庫設定的label_name。user_name
帳號ID。請通過使用者資訊頁面擷取。
masked|unmasked
masked:使用資料脫敏。
unmasked:不使用資料脫敏。
系統預設的label_name詳情如下表所示。
資料類型
label_name
脫敏策略
脫敏類型
說明
脫敏樣本
TEXT
name
name
mask
姓名脫敏。
脫敏前:李華;脫敏後:*華。
脫敏前:王小強;脫敏後:**強。
email
email
mask
郵箱地址脫敏。
脫敏前:lihuang@alibaba.com;脫敏後:lih***@alibaba.com。
ip
ip
mask
IP地址脫敏。
脫敏前:1.2.3.4;脫敏後:1.*.*.*。
id
id
mask
社會安全號碼碼脫敏。
脫敏前:110345188812011234;脫敏後:1****************4。
phone
phone
mask
電話號碼脫敏。
脫敏前:13900001234;脫敏後:*********34。
bank_id
bank_id
mask
銀行卡、信用卡帳號脫敏。
脫敏前:2349867902834701928;脫敏後:***************1928。
hash
md5
hash
使用MD5演算法進行脫敏。
脫敏前:浙江省杭州市文一西路;脫敏後:dbf894b409d4a2ef17dfd9c7fdcafcd8。
first_mask
first_mask
mask
定義了一個first_mask的規則,只顯示第一個字元。
脫敏前:123456789;脫敏後:1********。
INT、FLOAT等類型
Default
default_value
default_value
按照預設值脫敏。
說明如果在設定資料脫敏時,label_name不存在,將會退化成預設值脫敏。
僅Hologres V3.1及以上版本支援設定。
資料類型與脫敏預設值映射如下:
TEXT/VARCHAR/CHAR:***
BOOLEAN:false
INT8/INT4/INT2:0
TIMESTAMPTZ/TIMESTAMP:2000-01-01 00:00:00
FLOAT8/FLOAT4/DECIMAL/NUMERIC:0.0
MONEY:0
DATE:2000-01-01
TIME/TIMETZ:目前時間
UUID:00000000-0000-0000-0000-000000000000
查看設定的脫敏規則
查看為列設定的脫敏
--查看為列設定的脫敏 SELECT c.relname ,a.attname ,provider ,label FROM pg_seclabel s INNER JOIN pg_catalog.pg_class c ON s.objoid = c.relfilenode INNER JOIN pg_catalog.pg_attribute a ON s.objoid = a.attrelid WHERE a.attnum = objsubid;
查看為使用者佈建的脫敏
--查看為使用者佈建的脫敏規則 SELECT usename, label FROM pg_shseclabel s INNER JOIN pg_catalog.pg_user u ON s.objoid = u.usesysid;
修改自訂脫敏規則
設定的脫敏規則如果無法滿足需求,您可以通過修改GUC的hg_anon_lables
參數自訂脫敏規則。
文法
--label_name是您自訂的名稱,method是Hologres內建的一些方法。 ALTER DATABASE <db_name> SET hg_anon_labels = '[ {"label": <label_name1>, "method":<method1>}, {"label": <label_name2>, "method":<method2>}, ... ]';
執行
ALTER DATABASE
命令後,當前串連會不生效,需要重建立一個串連。您可使用如下命令查看設定是否生效。SHOW hg_anon_enable;
樣本
ALTER DATABASE test_db SET hg_anon_labels = '[ {"label":"ip", "method":{"desensType":"mask", "type":"ip"}}, {"label":"email", "method":{"desensType":"mask", "type":"email"}}, {"label":"name", "method":{"desensType":"mask", "type":"name"}}, {"label":"first_mask", "method":{"desensType":"mask", "type":"user_define", "before":1, "after":0}}, {"label":"hash", "method":{"desensType":"hash", "type":"md5", "salt":""}}]';
參數說明:
脫敏項
脫敏內容描述
脫敏結果樣本
{"desensType":"mask", "type":"ip"}
IP地址脫敏。
192.*.*.*
{"desensType":"mask", "type":"email"}
郵箱地址脫敏。
abc***@example.net
{"desensType":"mask", "type":"name"}
名稱脫敏。
*五
{"desensType":"hash", "type":"md5", "salt":""}
Hash脫敏。
e086aa137fa19f67d27b39d0eca186103228f322c9c98a125554a24f875f0f7e
{"label":"first_mask", "method":{"desensType":"mask", "type":"user_define", "before":1, "after":0}}{"label":"last_mask", "method":{"desensType":"mask", "type":"user_define", "before":0, "after":1}}
自訂內容脫敏。
無
使用樣本
樣本資料
準備一張資料來源,您也可以使用業務資料。
--建立資料庫
CREATE DATABASE hg_anon_demo;
--建立範例資料表
DROP TABLE IF EXISTS personal_basic_information;
CREATE TABLE personal_basic_information
(
name TEXT
,email TEXT
,ip TEXT
,id TEXT
,phone TEXT
,bank_id TEXT);
--插入範例資料
INSERT INTO personal_basic_information(name,email,ip,id,phone,bank_id) VALUES
('張三','jiaxi.jx@alibaba-inc.com','127.0.0.1','142732199104050022','18157161223','4514610803067088'),
('李四','wb-hy583084@antgroup.com','127.0.0.1','510622198412248000','15757121834','6252470010027800'),
('李逍遙','wb-hy583084@antgroup.com','172.21.4.234','511025198812271696','18215451832','6252470010027800');
為某列設定脫敏規則
--建立hg_anon擴充函數。
CREATE EXTENSION IF NOT EXISTS hg_anon;
--為資料庫hg_anon_demo開啟資料脫敏功能。
ALTER DATABASE hg_anon_demo SET hg_anon_enable = on;
--設定每一列的脫敏規則
SECURITY LABEL FOR hg_anon ON COLUMN personal_basic_information.name IS 'name';
SECURITY LABEL FOR hg_anon ON COLUMN personal_basic_information.id IS 'id';
SECURITY LABEL FOR hg_anon ON COLUMN personal_basic_information.phone IS 'phone';
SECURITY LABEL FOR hg_anon ON COLUMN personal_basic_information.email IS 'email';
SECURITY LABEL FOR hg_anon ON COLUMN personal_basic_information.bank_id IS 'bank_id';
SECURITY LABEL FOR hg_anon ON COLUMN personal_basic_information.ip IS 'ip';
建立串連後,使用如下命令,查看脫敏結果。
SELECT * FROM personal_basic_information;
返回結果如下。
name | email | ip | id | phone | bank_id
------+------------------------+--------------+--------------------+-------------+------------------
*四 | wb-***@antgroup.com | 127.*.*.* | 5****************0 | *********34 | ************7800
**遙 | wb-***@antgroup.com | 172.**.*.*** | 5****************6 | *********32 | ************7800
*三 | jia***@alibaba-inc.com | 127.*.*.* | 1****************2 | *********23 | ************7088
(3 rows)
取消某列的脫敏
SECURITY LABEL FOR hg_anon ON COLUMN personal_basic_information.name IS null;
SECURITY LABEL FOR hg_anon ON COLUMN personal_basic_information.id IS null;
使用如下命令,查看取消某列脫敏的結果。
SELECT name,id FROM personal_basic_information;
返回結果如下。
SELECT name,id FROM personal_basic_information;
name | id
--------+--------------------
李四 | 510622198412248000
李逍遙 | 511025198812271696
張三 | 142732199104050022
(3 rows)
取消某個使用者的脫敏規則
--取消basic帳號取消所有的脫敏
SECURITY LABEL FOR hg_anon ON ROLE "BASIC$test" IS 'all:unmasked';
使用如下命令,查看取消某個使用者脫敏的結果。
SELECT * FROM personal_basic_information;
返回結果如下。
name | email | ip | id | phone | bank_id
--------+--------------------------+--------------+--------------------+-------------+------------------
李四 | wb-hy583084@antgroup.com | 127.0.0.1 | 510622198412248000 | 15757121834 | 6252470010027800
李逍遙 | wb-hy583084@antgroup.com | 172.21.4.234 | 511025198812271696 | 18215451832 | 6252470010027800
張三 | jiaxi.jx@alibaba-inc.com | 127.0.0.1 | 142732199104050022 | 18157161223 | 4514610803067088
(3 rows)
JOIN列設定脫敏
--樣本join列設定脫敏
CREATE TABLE tbl1 (
id text
);
INSERT INTO tbl1
VALUES ('142732199102290022');
--其中personal_basic_information表的id列已經設定了脫敏
SELECT * FROM personal_basic_information a JOIN tbl1 b ON a.id = b.id;
返回結果如下。
name | email | ip | id | phone | bank_id | id
------+-------+----+----+-------+---------+----
(0 rows)
使用資料保護傘進行資料脫敏
您不僅可以手工設定脫敏規則,也可以使用資料保護傘進行資料脫敏。
使用限制。
僅Hologres V1.1及以上版本支援使用資料保護傘進行資料脫敏。
說明如果您的執行個體是V1.1以下版本,請您使用常見升級準備失敗報錯或加入HologresDingTalk交流群反饋,詳情請參見如何擷取更多的線上支援?。
為了能夠檢測出敏感性資料,保護傘對於主帳號設定不脫敏的規則。
目前每天9:00:00,保護傘會抽樣資料,識別敏感性資料,並對設定的敏感性資料列設定脫敏規則。
目前Hologres支援使用資料保護傘進行資料脫敏的地區有:華北2(北京)、華北3(張家口)、華東2(上海)、華東1(杭州)、華南1(深圳)、中國(香港)、新加坡、德國(法蘭克福)、馬來西亞(吉隆坡)、印尼(雅加達)、美國(矽谷)。
使用方法。
開啟脫敏功能。
資料脫敏功能預設不開啟,需要擁有Superuser許可權的使用者在對應的資料庫中執行如下命令開啟該功能。
--安裝資料脫敏EXTENSION CREATE EXTENSION IF NOT EXISTS hg_anon; --對指定的資料庫開啟資料脫敏功能,預設為關閉狀態 ALTER DATABASE <db_name> SET hg_anon_enable = on;
db_name為需要開啟資料脫敏功能的資料庫。
重要hg_anon_enable
是一個GUC,運行ALTER DATABASE命令後當前串連不生效。您可以使用如下SQL查看設定是否生效。
SHOW hg_anon_enable;
設定脫敏資料庫。
登入資料保護傘控制台,詳情請參見進入資料保護傘。
在左側導覽列,單擊
,進入資料識別規則頁面。在敏感性資料識別頁面建立一條資料識別規則,詳情請參見資料識別規則。
在左側導覽列,單擊資料脫敏管理,進入資料脫敏管理頁面。
在脫敏情境下拉式清單中,選擇Hologres展示脫敏(hologres_display_desense_code),並單擊右側選擇脫敏database。
在授權帳號脫敏對話方塊,從未脫敏database列表選擇需要脫敏的資料庫顯示在脫敏database列表中,單擊我同意授權資料保護傘對該database脫敏,單擊確定。
在資料脫敏管理頁面,單擊右上方的建立脫敏規則,詳情請參見資料脫敏管理,之後系統會對您設定的資料庫進行脫敏。
常見問題
按照使用樣本探索資料未脫敏
問題現象:按照使用樣本執行後發現查詢出的資料未進行脫敏。
可能原因:
對部分使用者佈建了不脫敏的規則。
未設定脫敏標籤。
解決方案:
執行如下SQL命令檢查是否對於部分使用者佈建了不脫敏的規則。
SELECT usename, label FROM pg_shseclabel s INNER JOIN pg_catalog.pg_user u on s.objoid = u.usesysid;
預設情況下該SQL查詢結果為空白,表示對所有使用者均需要進行資料脫敏;若不為空白,請對使用者佈建為脫敏。
使用如下SQL,檢查設定的脫敏標籤。
SHOW hg_anon_labels;
如果結果中並未包含ip等標籤,請執行如下SQL命令設定脫敏標籤。
ALTER DATABASE compress_test SET hg_anon_labels = '[ {"label":"ip", "method":{"desensType":"mask", "type":"ip"}}, {"label":"email", "method":{"desensType":"mask", "type":"email"}}, {"label":"name", "method":{"desensType":"mask", "type":"name"}}, {"label":"id", "method":{"desensType":"mask", "type":"id"}}, {"label":"phone", "method":{"desensType":"mask", "type":"phone"}}, {"label":"bank_id", "method":{"desensType":"mask", "type":"bank_id"}}, {"label":"hash", "method":{"desensType":"hash", "type":"md5", "salt":""}}, {"label":"first_mask", "method":{"desensType":"mask", "type":"user_define", "before":1, "after":0}} ]';
以上標籤對應的規則請參見系統預設的label_name詳情。