全部產品
Search
文件中心

MaxCompute:資料動態脫敏

更新時間:Oct 25, 2024

當您期望某些使用者只可以查看MaxCompute專案中隱藏關鍵資訊的敏感性資料時,您可以開啟MaxCompute動態脫敏功能,在資料訪問或展示時即時隱藏或替換敏感性資料,以防止敏感性資料泄露。本文為您介紹如何開啟MaxCompute動態脫敏功能,並提供參考樣本。

功能介紹

MaxCompute提供資料動態脫敏功能,用於業務開發測試、資料共用、營運等情境中對個人識別資訊(PII)等敏感性資料以脫敏計算和展示的方式進行保護。脫敏策略支援掩碼、散列、字元替換、數值取整、日期取整等脫敏策略,支援與資料保護傘的資料分類分級功能聯動,滿足使用者對身份資訊、銀行卡號、地址、電話等資料的脫敏需求。

MaxCompute資料脫敏在最靠近資料從儲存中讀取的環節中實現,確保資料在查詢、下載、關聯、UDF計算時已經處於脫敏狀態,避免敏感性資料泄露風險。image

使用限制

  • 支援地區

    該功能目前處於公測階段,僅華東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。

  • 視圖

    • 傳統的視圖支援資料脫敏策略,視圖脫敏策略與原脫敏表脫敏策略同步,當原表綁定、解除綁定脫敏策略時,傳統的視圖會同步生效。

    • 物化視圖依據視圖建立時原表的脫敏策略建立對應的脫敏資料檢視。當原表繼續綁定、解除綁定脫敏策略時,物化視圖維持建立時的脫敏策略不變。

  • 脫敏策略

    當使用者訪問敏感性資料時,如果同時有多條脫敏策略生效,將執行優先順序較高的脫敏策略對敏感性資料進行脫敏。詳情請參見預定義脫敏策略優先順序

資料脫敏流程

在資料返回過程中,會檢查使用者對應的脫敏規則配置情況,如果已經配置了脫敏規則,需要按照規則返回脫敏後的資料,如果沒有配置則返回明文。image

脫敏命令

專案開啟或關閉資料脫敏功能

脫敏功能開關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。

  • 支援類型:全部類型。

  • 樣本

    --脫敏前,資料類型string
    +------------+
    | col_string |
    +------------+
    | Michael Johnson |
    +------------+
    
    --脫敏策略
    MASKED_NULLIFY
    
    --脫敏後
    +------------+
    | col_string | 
    +------------+
    | NULL       | 
    +------------+

賦預設值

MASKED_DV

賦預設值,每種資料類型的預設值請參見賦預設值脫敏策略(MASKED_DV)的賦值參考

  • 支援類型:全部類型。

  • 樣本

    --脫敏前,資料類型timestamp
    +---------------+
    | col_timestamp |
    +---------------+
    | 2024-05-01 11:12:13 |
    +---------------+
    --脫敏策略
    MASKED_DV
    --脫敏後,Project時區預設是中國的東八區
    +---------------+
    | col_timestamp | 
    +---------------+
    | 1970-01-01 08:00:00 | 
    +---------------+

只保留年份

MASKED_DATE_YEAR

只保留時間的年份數值,非年份數值設定為1月1日00:00(UTC時間)。

  • 支援類型:DATE、DATETIME、TIMESTAMP_NTZ、TIMESTAMP。

  • 樣本

    --脫敏前,資料類型timestamp
    +---------------+
    | col_timestamp |
    +---------------+
    | 2024-05-01 11:12:13 |
    +---------------+
    --脫敏策略
    MASKED_DATE_YEAR
    --脫敏後,Project時區預設是中國的東八區
    +---------------+
    | col_timestamp | 
    +---------------+
    | 2024-01-01 08:00:00 | 
    +---------------+

取整

MASKED_POINT_RESERVE(<num>)

取整,保留小數點後0~5位小數。

  • num:保留小數點後的位元,num取值為[0, 5]的整數。

  • 支援類型:DECIMAL、FLOAT、DOUBLE。

  • 樣本

    --脫敏前,資料類型float
    +-----------+
    | col_float |
    +-----------+
    | 1.12345   |
    +-----------+
    --脫敏策略,保留2位小數
    MASKED_POINT_RESERVE(2)
    --脫敏後
    +------------+
    | col_float  | 
    +------------+
    | 1.12       | 
    +------------+

掩碼

字串頭尾部分掩碼

MASKED_STRING_MASKED_BA(<before>, <after>)

字串頭尾部分用*掩碼,中間部分用明文顯示。

  • before:字串起始部分將被*替換,掩碼長度由參數before指定,before取值為大於等於0的整數。當before的值為0時,前部不進行掩碼處理。

  • after:字串的尾部將被*替換,掩碼長度由參數after指定,after取值為大於等於0的整數。

  • 支援類型:STRING、VARCHAR、CHAR、BINARY。

  • 樣本

    --脫敏前,資料類型string
    +------------+
    | col_string |
    +------------+
    | Michael Johnson |
    +------------+
    --脫敏策略,前3位,後3位字元用*號代替,中間位明文顯示
    MASKED_STRING_MASKED_BA(3, 3)
    --脫敏後
    +------------+
    | col_string | 
    +------------+
    | ***hael John*** | 
    +------------+

字串中間部分掩碼

MASKED_STRING_UNMASKED_BA(<before>, <after>)

字串頭尾部分用明文,中間部分用*掩碼。

  • before:字串頭部明文的字元長度,before取值為大於等於0的整數。

  • after:字串尾部明文的字元長度,after取值為大於等於0的整數。

  • 支援類型:STRING、VARCHAR、CHAR、BINARY。

  • 樣本

    --脫敏前,資料類型string
    +------------+
    | col_string |
    +------------+
    | Michael Johnson |
    +------------+
    --脫敏策略,保留前1位,後1位明文顯示
    MASKED_STRING_UNMASKED_BA(1, 1)
    --脫敏後
    +------------+
    | col_string | 
    +------------+
    | M*************n | 
    +------------+

散列

SHA256散列

MASKED_SHA256(<salt>)

SHA256散列演算法脫敏。

  • salt:鹽值,num取值為0~9的整數。

  • 支援類型:STRING、VARCHAR、CHAR、BINARY。

  • 樣本

    --脫敏前,資料類型string
    +------------+
    | col_string | 
    +------------+
    | 4562-1234-5678-9123 | 
    +------------+
    --脫敏策略
    MASKED_SHA256(0)
    --脫敏後
    +------------+
    | col_string | 
    +------------+
    | zwGMB1aCF1t705EfcwdDorql4MZb46XBqQJw/2RVx8U= | 
    +------------+

SHA512散列

MASKED_SHA512(<salt>)

SHA512散列演算法脫敏。

  • salt:鹽值,num取值為0~9的整數。

  • 支援類型:STRING、VARCHAR、CHAR、BINARY。

  • 樣本

    --脫敏前,資料類型string
    +------------+
    | col_string | 
    +------------+
    | 4562-1234-5678-9123 | 
    +------------+
    --脫敏策略
    MASKED_SHA512(0)
    --脫敏後
    +------------+
    | col_string | 
    +------------+
    | 3PPywfEIp08WuTUI8FZCCfdVuRu68wZTVwWWVAf4pboACUnH6w9kFMLpl2AARaGW/mvWvg26p0EIqmE0fAEiuA== | 
    +------------+

MD5散列

MASKED_MD5(<salt>)

MD5散列演算法脫敏。

  • salt:鹽值,num取值為0~9的整數。

  • 支援類型:STRING、VARCHAR、CHAR、BINARY。

  • 樣本

    --脫敏前,資料類型string
    +------------+
    | col_string | 
    +------------+
    | 4562-1234-5678-9123 | 
    +------------+
    --脫敏策略
    MASKED_MD5(0)
    --脫敏後
    +------------+
    | col_string | 
    +------------+
    | mK/o08tew5g7S3XV/BkFfw== | 
    +------------+

SM3散列

MASKED_SM3(<salt>)

SM3散列演算法脫敏。

  • salt:鹽值,num取值為0~9的整數。

  • 支援類型:STRING、VARCHAR、CHAR、BINARY。

  • 樣本

    --脫敏前,資料類型string
    +------------+
    | col_string | 
    +------------+
    | 4562-1234-5678-9123 | 
    +------------+
    --脫敏策略
    MASKED_SM3(0)
    --脫敏後
    +------------+
    | col_string | 
    +------------+
    | Q2TfwUh4B8QQH8jPL6DfdoGysx/CXBxn2T14dDwQtQw= | 
    +------------+

字元替換

隨機字元替換

MASKED_REPLACE_RANDOM(<position>)

用隨機字元替換資料,替換後字串長度不變,隨機值包括數字和英文字母。

  • position:字元替換位置,取值為整數。

    • position = 0:資料全部用隨機值替換。

    • position > 0:資料的前position位用隨機值替換。

    • position < 0:資料的後position位用隨機值替換 。

  • 支援類型:STRING、VARCHAR、CHAR、BINARY。

  • 樣本

    --脫敏前,資料類型string
    +------------+
    | col_string |
    +------------+
    | Michael Johnson |
    +------------+
    --脫敏策略,字串前7位用隨機字元替換
    MASKED_REPLACE_RANDOM(7)
    --脫敏後
    +------------+
    | col_string | 
    +------------+
    | 4DlJQxi Johnson | 
    +------------+

頭尾隨機字元替換

MASKED_REPLACE_RANDOM_BA(<before>, <after>)

用隨機字元替換資料的頭尾部分,替換後字串長度不變,隨機值包括數字和英文字母。

  • before:資料起始部分將被隨機字元替換,替換長度由參數before指定,before取值為大於等於0的整數。當before的值為0時,前部不進行替換。

  • after:資料的尾部將被隨機字元替換,替換長度由參數after指定,after取值為大於等於0的整數。

  • 支援類型:STRING、VARCHAR、CHAR、BINARY。

  • 樣本

    --脫敏前,資料類型string
    +------------+
    | col_string |
    +------------+
    | Michael Johnson |
    +------------+
    --脫敏策略,字串前4位和後4位用隨機字元替換
    MASKED_REPLACE_RANDOM_BA(4,4)
    --脫敏後
    +------------+
    | col_string | 
    +------------+
    | r0xEael JohnWNr | 
    +------------+

固定字元替換

MASKED_REPLACE_FIXED(<position>, <fixed_string>)

  • 用固定字串替換資料。

  • position:字元替換位置,取值為整數。

    • position = 0:資料全部用fixed_string固定字串替換。

    • position > 0:資料的前position位用fixed_string替換。

    • position < 0:資料的後-position位用fixed_string替換。

  • fixed_string:固定字串,固定字串長度小於等於100,固定字串中不能包含空格。

  • 支援類型:STRING、VARCHAR、CHAR、BINARY。

  • 樣本

    --脫敏前,資料類型string
    +------------+
    | col_string |
    +------------+
    | Michael Johnson |
    +------------+
    --脫敏策略,字串前7位用固定字串"Oli"替換
    MASKED_REPLACE_FIXED(7, "Oli")
    --脫敏後
    +------------+
    | col_string | 
    +------------+
    | Oli Johnson | 
    +------------+

使用樣本

個人敏感資訊脫敏

此處以個人敏感資訊為例,為您展示如何配置敏感策略,並對敏感資訊進行脫敏。

  1. 資料準備。

    建立個人敏感資訊表,並插入敏感性資料。

    -- 建立敏感資訊表
    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);
  2. 配置脫敏策略。

    • 姓名只保留第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;
  3. 使用被脫敏帳號,查詢脫敏後的資料。

    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

(子類型的預設值)