當您期望某些使用者只可以查看MaxCompute專案中隱藏關鍵資訊的敏感性資料時,您可以開啟MaxCompute動態脫敏功能,在資料訪問或展示時即時隱藏或替換敏感性資料,以防止敏感性資料泄露。本文為您介紹如何開啟MaxCompute動態脫敏功能,並提供參考樣本。
功能介紹
MaxCompute提供資料動態脫敏功能,用於業務開發測試、資料共用、營運等情境中對個人識別資訊(PII)等敏感性資料以脫敏計算和展示的方式進行保護。脫敏策略支援掩碼、散列、字元替換、數值取整、日期取整等脫敏策略,支援與資料保護傘的資料分類分級功能聯動,滿足使用者對身份資訊、銀行卡號、地址、電話等資料的脫敏需求。
MaxCompute資料脫敏在最靠近資料從儲存中讀取的環節中實現,確保資料在查詢、下載、關聯、UDF計算時已經處於脫敏狀態,避免敏感性資料泄露風險。
使用限制
支援地區
該功能目前處於公測階段,僅華東1(杭州)、華東2(上海)、華北2(北京)、華北3(張家口)、華北6(烏蘭察布)、華南1(深圳)、西南1(成都)、中國香港、日本(東京)、馬來西亞(吉隆坡)、印尼(雅加達)、德國(法蘭克福)地區支援資料動態脫敏。
支援的驅動版本
MaxCompute串連方式
驅動版本
脫敏功能支援情況
Java SDK
0.48.0-public及以上版本
支援
odpscmd
0.47.1及以上版本
支援
JDBC
3.4.3及以上版本
支援
MaxFrame
不限制
支援
PyODPS
不限制
支援
Go SDK
不限制
支援
內部表
MaxCompute內部表支援資料脫敏策略,外部表格不支援。
資料脫敏與行級許可權功能互斥,已配置脫敏策略的表不支援再配置行級權限原則,反之亦然。
對中文字元使用掩碼策略脫敏時,中文字元編碼格式必須為UTF-8。
視圖
傳統的視圖支援資料脫敏策略,視圖脫敏策略與原脫敏表脫敏策略同步,當原表綁定、解除綁定脫敏策略時,傳統的視圖會同步生效。
物化視圖依據視圖建立時原表的脫敏策略建立對應的脫敏資料檢視。當原表繼續綁定、解除綁定脫敏策略時,物化視圖維持建立時的脫敏策略不變。
脫敏策略
當使用者訪問敏感性資料時,如果同時有多條脫敏策略生效,將執行優先順序較高的脫敏策略對敏感性資料進行脫敏。詳情請參見預定義脫敏策略優先順序。
資料脫敏流程
在資料返回過程中,會檢查使用者對應的脫敏規則配置情況,如果已經配置了脫敏規則,需要按照規則返回脫敏後的資料,如果沒有配置則返回明文。
脫敏命令
專案開啟或關閉資料脫敏功能
脫敏功能開關odps.data.masking.policy.enable
為專案空間的Project級屬性,只有專案Owner或被賦予專案層級的Super_Administrator和Admin角色的帳號可以進行操作,操作詳情請參見為使用者賦予內建管理角色。
專案開啟資料脫敏功能。
setproject odps.data.masking.policy.enable=true;
專案關閉資料脫敏功能。
setproject odps.data.masking.policy.enable=false;
建立和刪除脫敏策略
命令格式
建立脫敏策略。
CREATE DATA MASKING POLICY [IF NOT EXISTS] <policy_name> TO { USER <user_list> | ROLE <role_list> | default } USING <Predefined Masking Policy>;
刪除脫敏策略。
DROP DATA MASKING POLICY <policy_name>;
參數說明
參數名稱
是否必填
描述
policy_name
是
脫敏策略名稱稱。策略名稱稱大小寫不敏感,不支援特殊字元,只能包含a~z、A~Z、數字和底線。建議以字母開頭,名稱的長度不超過128位元組。
USER | ROLE | default
是
三者選其一。
USER:對使用者脫敏,<user_list>填寫待脫敏的使用者名稱稱。您可以在MaxCompute中執行
list users;
命令擷取角色資訊。ROLE:對角色脫敏,<role_list>填寫待脫敏的角色名稱。您可以在MaxCompute中執行
list roles;
命令擷取角色資訊。default:預設脫敏,使用者或角色訪問敏感列時如果沒有匹配到脫敏策略,那麼採用default策略對敏感列進行脫敏。
Predefined Masking Policy
是
預定義的脫敏策略,詳情請參見預定義脫敏策略。
使用樣本
樣本1:為使用者userA、userB和userC建立MD5雜湊脫敏策略。
CREATE data masking policy IF NOT EXISTS masking_test_001 TO USER (userA, userB, userC) USING MASKED_MD5(0);
樣本2:為專案開發角色和營運角色建立MD5雜湊脫敏策略。
CREATE data masking policy IF NOT EXISTS masking_test_001 TO ROLE (role_project_deploy, role_project_dev) USING MASKED_MD5(0);
將脫敏策略應用于敏感資料列
命令格式
--將脫敏策略應用于敏感表的敏感性資料列 APPLY DATA MASKING POLICY <policy_name> BIND TO TABLE <table_name> COLUMN <column_name>; --為敏感表的敏感性資料列取消指定的脫敏策略 APPLY DATA MASKING POLICY <policy_name> UNBIND FROM TABLE <table_name> COLUMN <column_name>; --為敏感表的敏感性資料列取消全部脫敏策略 APPLY DATA MASKING POLICY UNBIND ALL FROM TABLE <table_name> COLUMN <column_name>; --為敏感表的全部敏感性資料列取消全部脫敏策略 APPLY DATA MASKING POLICY UNBIND ALL FROM TABLE <table_name>;
參數說明
參數名稱
是否必填
描述
policy_name
是
脫敏策略名稱稱。
table_name
是
表名稱。包含敏感性資料的表。
column_name
是
列名稱。包含敏感性資料的列。
查看脫敏策略
命令格式
--查看脫敏策略的建立資訊 DESC DATA MASKING POLICY <policy_name>; --查看錶的擴充資訊,包含敏感性資料列的資訊應用的脫敏策略資訊 DESC EXTENDED <table_name>; --顯示當前Project下所有的脫敏策略名稱稱 LIST DATA MASKING POLICY; --顯示與指定使用者綁定的脫敏策略名稱稱 LIST DATA MASKING POLICY TO USER <user_name>; --顯示與指定角色綁定的脫敏策略名稱稱 LIST DATA MASKING POLICY TO ROLE <role_name>; --顯示與指定表綁定的所有脫敏策略名稱稱 LIST DATA MASKING POLICY ON <table_name>; --顯示與指定表指定資料行繫結的所有脫敏策略名稱稱 LIST DATA MASKING POLICY ON <table_name> TO COLUMN <column_name>;
參數說明
參數名稱
是否必填
描述
policy_name
是
脫敏策略名稱稱。
table_name
是
表名稱。包含敏感性資料的表。
column_name
是
列名稱。包含敏感性資料的列。
user_name
是
使用者名稱稱。
role_name
是
角色名稱。
預定義脫敏策略
預定義脫敏策略包含掩碼、散列、字元替換、取整等脫敏策略,您可以根據敏感性資料類型選擇適用的脫敏策略實現資料保護。
策略類型 | 策略名稱稱 | 命令格式 | 描述 |
通用 | 不脫敏 | UNMASKED | 不脫敏。 支援類型:全部類型。 |
置空值 | MASKED_NULLIFY | 置空值,資料脫敏後返回NULL。
| |
賦預設值 | MASKED_DV | 賦預設值,每種資料類型的預設值請參見賦預設值脫敏策略(MASKED_DV)的賦值參考。
| |
只保留年份 | MASKED_DATE_YEAR | 只保留時間的年份數值,非年份數值設定為1月1日00:00(UTC時間)。
| |
取整 | MASKED_POINT_RESERVE(<num>) | 取整,保留小數點後0~5位小數。
| |
掩碼 | 字串頭尾部分掩碼 | MASKED_STRING_MASKED_BA(<before>, <after>) | 字串頭尾部分用
|
字串中間部分掩碼 | MASKED_STRING_UNMASKED_BA(<before>, <after>) | 字串頭尾部分用明文,中間部分用
| |
散列 | SHA256散列 | MASKED_SHA256(<salt>) | SHA256散列演算法脫敏。
|
SHA512散列 | MASKED_SHA512(<salt>) | SHA512散列演算法脫敏。
| |
MD5散列 | MASKED_MD5(<salt>) | MD5散列演算法脫敏。
| |
SM3散列 | MASKED_SM3(<salt>) | SM3散列演算法脫敏。
| |
字元替換 | 隨機字元替換 | MASKED_REPLACE_RANDOM(<position>) | 用隨機字元替換資料,替換後字串長度不變,隨機值包括數字和英文字母。
|
頭尾隨機字元替換 | MASKED_REPLACE_RANDOM_BA(<before>, <after>) | 用隨機字元替換資料的頭尾部分,替換後字串長度不變,隨機值包括數字和英文字母。
| |
固定字元替換 | MASKED_REPLACE_FIXED(<position>, <fixed_string>) |
|
使用樣本
個人敏感資訊脫敏
此處以個人敏感資訊為例,為您展示如何配置敏感策略,並對敏感資訊進行脫敏。
資料準備。
建立個人敏感資訊表,並插入敏感性資料。
-- 建立敏感資訊表 CREATE TABLE if NOT EXISTS personal_info ( id bigint COMMENT '使用者唯一標識ID', name string COMMENT '使用者姓名', age int COMMENT '使用者年齡', gender string COMMENT '使用者性別', height float COMMENT '使用者身高', birthday date COMMENT '使用者生日', phone_number string COMMENT '使用者電話號碼', email string COMMENT '使用者電子郵箱', address string COMMENT '使用者地址', salary decimal(18, 2) COMMENT '使用者薪水', create_time timestamp COMMENT '使用者資訊建立時間', update_time timestamp COMMENT '使用者資訊更新時間', is_deleted boolean COMMENT '使用者資訊是否被刪除的標誌位' ); -- 插入敏感性資料 INSERT INTO personal_info VALUES (1, '張三', 18, '男', 178.56, '1990-01-01', '13800000000', 'zhangsan@example.com', '北京市海澱區', 5000.00, '2023-04-19 11:32:00', '2023-04-19 11:32:00', false), (2, '李四', 20, '女', 162.70, '1992-02-02', '13900000000', 'lisi@example.com', '上海市浦東新區', 6000.00, '2023-04-19 11:32:00', '2023-04-19 11:32:00',false), (3, '王五', 22, '男', 185.21, '1994-03-03', '14000000000', 'wangwu@example.com', '深圳市南山區', 7000.00, '2023-04-19 11:32:00', '2023-04-19 11:32:00', false);
配置脫敏策略。
姓名只保留第1個字,其他字元用
*
代替。CREATE data masking policy IF NOT EXISTS masking_name TO USER (RAM$xxx@test.aliyunid.com:xxx) USING MASKED_STRING_UNMASKED_BA(1, 0); apply data masking policy masking_name bind TO TABLE personal_info COLUMN name;
身高欄位取整。
CREATE data masking policy IF NOT EXISTS masking_height TO USER (RAM$xxx@test.aliyunid.com:xxx) USING MASKED_POINT_RESERVE(0); apply data masking policy masking_height bind TO TABLE personal_info COLUMN height;
生日只保留年份。
CREATE data masking policy IF NOT EXISTS masking_birthday TO USER (RAM$xxx@test.aliyunid.com:xxx) USING MASKED_DATE_YEAR; apply data masking policy masking_birthday bind TO TABLE personal_info COLUMN birthday;
預設使用者使用SM3演算法雜湊電話號碼。
CREATE DATA MASKING POLICY default_sm3 TO DEFAULT USING MASKED_SM3(0); apply data masking policy default_sm3 bind TO TABLE personal_info COLUMN phone_number;
使用被脫敏帳號,查詢脫敏後的資料。
SELECT id, name, height, birthday, phone_number FROM personal_info; -- 脫敏前 +------------+------+--------+----------+--------------+ | id | name | height | birthday | phone_number | +------------+------+--------+----------+--------------+ | 1 | 張三 | 178.56 | 1990-01-01 | 13800000000 | | 2 | 李四 | 162.7 | 1992-02-02 | 13900000000 | | 3 | 王五 | 185.21 | 1994-03-03 | 14000000000 | +------------+------+--------+----------+--------------+ -- 脫敏後 +------------+------------+------------+------------+--------------+ | id | name | height | birthday | phone_number | +------------+------------+------------+------------+--------------+ | 1 | 張* | 179.0 | 1990-01-01 | lvYJaH4ElL2ilpQx/8tfMUw7xP22yblIgmfWp0/msUQ= | | 2 | 李* | 163.0 | 1992-01-01 | 9fFWacNSwCRZLAjMHqunlfwkqhTbP2ubuDOeOSh4N1c= | | 3 | 王* | 185.0 | 1994-01-01 | k/0JoQCSarJg9ATJ5tyVnhQf1jIBxHXRbB+cvUm4OmE= | +------------+------------+------------+------------+--------------+
預設對所有使用者和角色脫敏
下述執行個體為您展示當使用者或角色同時命中多種敏感策略時,優先順序較高的敏感策略將生效。
對預設使用者採用MASKED_SHA256(5)的masking策略。
CREATE DATA MASKING POLICY default_hash_policy
TO DEFAULT
USING MASKED_SHA256(5);
對特殊使用者A,B採用UNMASKED的策略。
CREATE DATA MASKING POLICY ab_unmask_policy
TO USER (A, B)
USING UNMASKED;
結果:使用者A,B可以訪問明文資料,其他使用者只能訪問SHA256散列脫敏的資料。
A,B使用者命中MASKED_SHA256(5),UNMASKED策略,因此執行優先順序較高的脫敏策略UNMASKED(詳情請參見預定義脫敏策略優先順序)。其他使用者命中MASKED_SHA256(5)策略。
附錄
預定義脫敏策略優先順序
當使用者訪問敏感性資料時有多條脫敏策略生效時,將執行較高優先順序的脫敏策略對敏感性資料進行脫敏。
例如使用者A訪問列col_string同時匹配到2條脫敏策略,分別是優先順序3級MASKED_REPLACE_RANDOM(3)和優先順序4級MASKED_SM3,系統將執行較高優先順序的脫敏策略即MASKED_REPLACE_RANDOM(3),使用者A將看到隨機字元替換的脫敏結果。
優先順序 | 預定義脫敏策略 |
0(高) | UNMASKED |
1 | MASKED_POINT_RESERVE(num) |
2 | MASKED_DATE_YEAR |
3 | MASKED_STRING_MASKED_BA(before, after) |
MASKED_STRING_UNMASKED_BA(before, after) | |
MASKED_REPLACE_RANDOM(position) | |
MASKED_REPLACE_RANDOM_BA(before, after) | |
MASKED_REPLACE_FIXED(position) | |
4 | MASKED_SHA256 |
MASKED_SHA512 | |
MASKED_MD5 | |
MASKED_SM3 | |
5 | MASKED_DV |
6(低) | MASKED_NULLIFY |
賦預設值脫敏策略(MASKED_DV)的賦值參考
資料類型 | 預設值 |
bigint | 0 |
double | 0.0 |
decimal | 0 |
string | "" |
datetime | DATETIME'1970-01-01 00:00:00'(UTC時間) |
boolean | false |
tinyint | 0 |
smallint | 0 |
int | 0 |
binary | '' |
float | 0.0 |
double | 0.0 |
decimal | 0 |
varchar(n) | "" |
char(n) | " " (填充n個空格) |
date | DATE'1970-01-01' |
timestamp | TIMESTAMP'1970-01-01 00:00:00'(UTC時間) |
timestamp_ntz | TIMESTAMP'1970-01-01 00:00:00'(UTC時間) |
array | {子類型的預設值} |
map | {key:value} (key, value分別對應子類型的預設值) |
json | "" |
struct | (子類型的預設值) |