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以下版本,請您使用自助升級或加入Hologres釘釘交流群反饋,詳情請參見如何獲取更多的在線支持?。
為了能夠檢測出敏感數據,保護傘對于主賬號設置不脫敏的規則。
目前每天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。