Hologres為您提供資料脫敏功能,支援按照列層級設定脫敏。啟用該功能後,如果您查詢的資料涉及敏感資訊,則在展示結果中,該部分資料會被脫敏展示,提高了對敏感及私密資料的保護。本文為您介紹Hologres如何開啟、查詢及刪除資料脫敏功能。
背景資訊
隨著巨量資料時代的來臨,巨量資料、雲端運算和人工智慧等新技術應用不斷深化,為資料的深度挖掘及分析提供了強有力的支撐,巨量資料中蘊含的巨大價值被逐步挖掘出來。與此同時也帶來了敏感及私密資訊保護方面的棘手難題。
Hologres提供的資料脫敏功能,實現了資料在高效共用、挖掘及分析的同時,使得敏感及隱私資訊不被泄露,提高了對敏感及私密資料的保護。
使用限制
出於安全考慮,Hologres暫不支援從設定了脫敏規則的表和列向未設定脫敏規則的表和列匯入資料,相關報錯資訊如下。
錯誤原因:ERROR: The insert table has not set SECURITY LABEL
暫不支援針對設定了脫敏規則的表進行UNION和DISTINCT查詢,相關報錯資訊如下。
錯誤原因:ERROR: UNION is not support on security item
資料脫敏會一定程度的影響查詢效能,影響程度和脫敏方式、資料量都有關,效能有10%~20%的下降,極端情境可能存在數倍效能下降。
使用資料脫敏
Hologres支援對目標列或目標使用者佈建資料脫敏。使用資料脫敏前,您需登入目標資料庫開啟脫敏功能。完成後可配置對應的脫敏規則,針對某一列或某個使用者佈建脫敏。具體操作步驟如下。
為目標資料庫開啟資料脫敏。
資料脫敏功能預設不開啟,需要Superuser登入至目標資料庫開啟該功能,開啟命令及相關參數說明如下。
命令:
CREATE EXTENSION IF NOT EXISTS hg_anon; --建立hg_anon擴充函數。 ALTER DATABASE <db_name> SET hg_anon_enable = on; --為指定資料庫開啟資料脫敏功能,預設為off。
樣本:
CREATE EXTENSION IF NOT EXISTS hg_anon;--建立hg_anon擴充函數。 ALTER DATABASE test SET hg_anon_enable = on;--為資料庫test開啟資料脫敏功能。
參數說明:
參數
參數的相關描述
hg_anon
hg_anon是Hologres內部封裝的擴充函數,您需要調用該擴充函數才能開啟資料脫敏功能。
<db_name>
需要開啟資料脫敏功能的資料庫名稱。使用時需要替換<db_name>為實際資料庫名稱。
hg_anon_enable
選擇開啟或關閉資料脫敏功能,取值如下:
on,開啟資料脫敏。
off,關閉資料脫敏。
預設該參數設定為off。
設定脫敏列。
可由Superuser或表Owner對目標列進行脫敏,具體命令、樣本、參數說明如下。
命令:
說明對多列資料進行脫敏時,需要多次執行該語句。
SECURITY LABEL FOR hg_anon ON COLUMN <tablename>.<col_name> IS <label_name>;
樣本:對holotest表的ID列按照名稱脫敏。
SECURITY LABEL FOR hg_anon ON COLUMN holotest.id IS 'name';
參數說明:
參數
描述
hg_anon
hg_anon是Hologres內部封裝的擴充函數,您需要調用該擴充函數才能開啟資料脫敏功能。
<tablename>
需要脫敏的列所在的表名稱。使用時需要替換<tablename>為實際表名稱。
<col_name>
需要脫敏的列名稱。使用時需要替換<col_name>為實際列名稱。
label_name
系統預設的脫敏函數,您可以使用
show hg_anon_labels;
SQL查看當前資料庫設定的label_name。從HologresV1.1版本開始,預設的label_name如下。
lable_name
說明
樣本
name
姓名脫敏。
脫敏前:李華;脫敏後:*華。
脫敏前:王小強;脫敏後:**強。
email
郵箱地址脫敏。
脫敏前:lihuang@alibaba.com;脫敏後:lih***@alibaba.com
ip
IP地址脫敏。
脫敏前:192.0.2.1;脫敏後:192.*.*.*。
id
社會安全號碼碼脫敏。
脫敏前:110345188812011234;脫敏後:1****************4
phone
電話號碼脫敏。
脫敏前:13900001234;脫敏後:*********34。
bank_id
銀行卡、信用卡帳號脫敏。
脫敏前:2349867902834701928;脫敏後:***************1928。
hash
使用MD5演算法進行脫敏。
脫敏前:浙江省杭州市文一西路;脫敏後:dbf894b409d4a2ef17dfd9c7fdcafcd8。
first_mask
定義了一個first_mask的規則,只顯示第一個字元。
脫敏前:123456789;脫敏後:1********。
脫敏結果樣本:
其他相關命令
刪除已經設定的脫敏
SECURITY LABEL FOR hg_anon ON COLUMN test_hg_anon_demo.name is NULL;
查看設定的脫敏列
SELECT c.relname, a.attname, provider, label FROM pg_seclabel s INNER JOIN pg_catalog.pg_class c ON s.classoid = c.tableoid AND s.objoid = c.oid INNER JOIN pg_catalog.pg_attribute a ON s.objoid = a.attrelid WHERE a.attnum = objsubid;
進階技巧
對不同使用者佈建脫敏
預設情況下所有使用者都會脫敏,可以單獨設定某些使用者不脫敏。
命令格式如下
SECURITY LABEL FOR hg_anon ON ROLE user_name IS '[label_name|all]:[masked|unmasked]';
參數
說明
user_name
帳號ID。請通過使用者資訊頁面擷取。
label_name
系統預設的脫敏函數,您可以使用
show hg_anon_labels;
SQL查看當前資料庫設定的label_name。masked
使用資料脫敏。
unmasked
不使用資料脫敏。
使用樣本
對帳號ID為1365xxxxxxxxxxxx的使用者不脫敏的語句如下。
SECURITY LABEL FOR hg_anon ON ROLE "1365xxxxxxxxxxxx" IS 'all:unmasked';
對帳號ID為1365xxxxxxxxxxxx的使用者針對
phone
標籤的列設定為不脫敏的語句如下。SECURITY LABEL FOR hg_anon ON ROLE "1365xxxxxxxxxxxx" IS 'phone:unmasked';
相關命令
查看對使用者佈建的脫敏情況
SELECT usename, label FROM pg_shseclabel s INNER JOIN pg_catalog.pg_user u ON s.objoid = u.usesysid;
刪除對使用者佈建的脫敏
SECURITY LABEL FOR hg_anon ON ROLE "1365xxxxxxxxxxxx" IS NULL;
自訂脫敏規則
如果預設的label_name無法滿足需求,您可以通過修改GUC的hg_anon_labels參數自訂脫敏規則。
命令
ALTER DATABASE <db_name> SET hg_anon_labels = '[ {"label": <label_name1>, "method", <method1>}, {"label": <label_name2>, "method", <method2>}, ... ]'; --label_name是您自訂的名稱,method是Hologres內建的一些方法。
說明執行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}}
自訂內容脫敏。
無
使用樣本
使用Hologres資料脫敏功能完整的使用樣本如下。
建立資料庫
使用如下命令語句建立資料庫。
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 ) ;
插入範例資料
使用如下命令語句,在personal_basic_information表中插入範例資料。
INSERT INTO personal_basic_information(name,email,ip,id,phone,bank_id) VALUES ('Zhang San','zhangsan@alibaba.com','127.0.0.1','142732199102290022','13900001234','4514610803067088'), ('Li Si','lisi@alibaba.com','127.0.0.1','510622198402308000','13900001111','6252470010027800'), ('Li Xiaoyao','lixiaoyao@alibaba.com','172.21.4.234','511025188812271696','13900002222','6252470010027800');
查看資料
查看資料脫敏前的資料。
SELECT * FROM personal_basic_information;
設定脫敏規則
使用如下命令語句為資料設定脫敏規則。
--建立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;
脫敏後的資料如下所示。
如果對帳號ID為1365xxxxxxxxxxxx的使用者佈建不脫敏,SQL如下。
SECURITY LABEL FOR hg_anon ON ROLE "1365xxxxxxxxxxxx" IS 'all:unmasked';
查詢資料結果如下。
若對帳號ID為1365xxxxxxxxxxxx的使用者佈建對於
phone
的標籤不脫敏,SQL如下。SECURITY LABEL FOR hg_anon ON ROLE "1365xxxxxxxxxxxx" IS 'phone:unmasked';
查詢結果如下。
使用資料保護傘進行資料脫敏
您不僅可以手工設定脫敏規則,也可以使用資料保護傘進行資料脫敏。
使用限制。
僅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。