共用方式為


動態資料遮罩

適用於:Azure SQL 資料庫 Azure SQL 受控執行個體 Azure Synapse Analytics (僅限專用 SQL 集區)Fabric 中的 SQL 資料庫

Azure SQL 資料庫、Microsoft Fabric 中的 SQL 資料庫、Azure SQL 受控執行個體 和 Azure Synapse Analytics 支援動態數據遮罩 (DDM)。 動態資料遮罩可藉由遮罩處理,使不具權限的使用者無法看見敏感性資料。

動態資料遮罩可讓客戶在應用程式層級受到最小影響的情況下指定要顯示多少機密資料,而協助防止未經授權者存取機密資料。 這項原則式安全性功能會將敏感性資料隱藏在指定資料庫欄位的查詢結果集內,而資料庫中的資料則不會變更。

例如,話務中心的服務代表可能會藉由確認來電者電子郵件地址的數個字元來識別該來電者,但系統不應該對服務代表顯示完整的電子郵件地址。 可以定義一個遮蔽規則,遮蔽任何查詢結果集中的整個電子郵件地址。 在另一個範例中,可以定義適當的資料遮罩來保護個人資料,以便開發人員在生產環境中進行疑難排解用途的查詢,且不會違反法務規定。

動態資料遮罩基本概念

針對 Azure SQL 資料庫,您可以選取 [SQL 資料庫 組態] 窗格中 [安全性] 下的 [動態數據遮罩] 窗格,在 Azure 入口網站 中設定動態數據遮罩原則。

無法在 Fabric 中使用 SQL 受管理執行個體 或 SQL 資料庫的 Azure 入口網站 來設定此功能。 相反地,請使用 Transact-SQL(T-SQL),如本文中 細粒度權限範例 所示。 欲了解更多資訊,請參見 動態資料遮罩

動態資料遮罩原則

  • 排除在遮蔽之外的 SQL 使用者: 一組 SQL 使用者,可以包含 Microsoft Entra ID 的身份,這些使用者在 SQL 查詢結果中獲得未遮罩的資料。 具有伺服器管理員、Microsoft Entra 管理員或 db_owner 角色等管理權限的使用者可以檢視原始資料,而不需要任何遮罩。 (注意:也適用於 SQL Server 中的系統管理員角色)

  • 遮罩規則:一組規則,定義會遮罩處理的指定欄位和所使用的遮罩函數。 指定的欄位可使用資料庫結構描述名稱、資料表名稱和資料行名稱來定義。

  • 遮罩函數:一組方法,可控制不同案例的資料顯示性。

    遮罩函數 遮罩邏輯
    預設值 根據指定欄位的資料類型進行完整遮罩

    如果欄位大小少於 4 個字元的字串資料型態,則使用 XXXX(或更少)(ncharntextnvarchar)。
    對於數值資料型態(bigintbitdecimalintmoneynumericsmallintsmallmoneytinyintfloatreal)使用零值。
    用於1900-01-01日期/時間資料類型(datedatetime2datetime、datetimeoffsetsmalldatetimetime)。
    sql_variant則使用目前型別的預設值。
    對於 XML 則使用文件 <masked />
    對於特殊資料型態(時間戳、資料表階層ID唯一識別碼二進位影像變數和空間型態)使用空值。
    信用卡 遮罩方法將顯示指定欄位的末四碼,並在開頭新增一個常數字串,形成類似信用卡的格式。

    XXXX-XXXX-XXXX-1234
    電子郵件 遮罩方法將公開第一個字母,並將網域更換為 XXX.com,使用的常數字串前置詞為電子郵件地址格式。

    aXX@XXXX.com
    隨機數字 遮罩方法會產生一個隨機數字,其根據為選取的界限與實際資料類型。 如果指定的邊界相等,則遮罩函數是常數。

    螢幕擷取畫面:產生亂數的遮罩方法。
    自訂文字 遮罩方法會公開第一個和最後一個字元,並在中間新增自訂填補字串。 如果原始字串小於公開的前置詞和後置詞,則只會使用填補字串。

    prefix[padding]suffix
    導覽窗格的螢幕擷取畫面。
    Datetime 支援日期/時間欄位的細緻遮罩,分別為 datetimedatetime2datetimedatetimeoffsetsmalldatetime。 你可以遮罩特定成分,如年份(datetime("Y"))、月份(datetime("M"))、日()、datetime("D")小時(datetime("h"))、分鐘(datetime("m")或秒)。datetime("s") 你可以用 T-SQL 來套用這個函式。

    例如:

    - 面具年份: ALTER COLUMN BirthDay ADD MASKED WITH (FUNCTION = 'datetime("Y")')
    - 口罩月份: ALTER COLUMN BirthDay ADD MASKED WITH (FUNCTION = 'datetime("M")')
    - 掩蔽分鐘: ALTER COLUMN BirthDay ADD MASKED WITH (FUNCTION = 'datetime("m")')

DDM 建議引擎會將您資料庫中的特定欄位標示為潛在敏感性欄位,而這類欄位可能適合進行遮罩處理。 在入口網站的 [動態資料遮罩] 窗格中,您會看到您的資料庫的建議資料行。 針對一或多個資料行選取 [新增遮罩],然後選取適當的遮罩函式,然後選取 [儲存],以套用這些欄位的遮罩。

使用 T-SQL 管理動態資料遮罩

使用 PowerShell Cmdlet 為您的資料庫設定動態資料遮罩

資料遮罩原則

資料遮罩規則

使用 REST API 為您的資料庫設定動態資料遮罩

您可以使用 REST API,以程式設計方式管理資料遮罩原則和規則。 已發佈的 REST API 支援下列作業:

資料遮罩原則

  • 建立或更新:建立或更新資料庫資料遮罩原則。
  • 取得:取得資料庫資料屏蔽政策。

資料遮罩規則

權限

您可以使用以下內建角色來設定動態資料遮蔽:

以下是使用動態資料遮罩的必要動作:

讀取/寫入:

  • Microsoft.Sql/servers/databases/dataMaskingPolicies/*

閱讀:

  • Microsoft.Sql/servers/databases/dataMaskingPolicies/read

寫入:

  • Microsoft.Sql/servers/databases/dataMaskingPolicies/write

若要深入了解搭配使用動態資料遮罩與 T-SQL 命令時的權限,請參閱權限

顆粒化權限範例

防止未經授權者存取敏感資料,並透過在資料庫的不同層級對資料進行遮罩以獲得控制。 你可以在資料庫層級、結構層級、資料表層級或欄位層級授予或撤銷 UNMASK 任何資料庫使用者或角色權限。 結合 Microsoft Entra 認證, UNMASK 您可以管理在 Azure 環境中維護的使用者、群組及應用程式的權限。 此 UNMASK 權限提供一種細緻的方式來控制並限制對資料庫中儲存資料的未經授權存取,並提升資料安全管理。

  1. 建立結構描述以包含使用者資料表:

    CREATE SCHEMA Data;
    GO
    
  2. 建立具有遮罩資料行的資料表:

    CREATE TABLE Data.Membership
    (
        MemberID INT IDENTITY (1, 1) NOT NULL,
        FirstName VARCHAR (100) MASKED WITH (FUNCTION = 'partial(1, "xxxxx", 1)') NULL,
        LastName VARCHAR (100) NOT NULL,
        Phone VARCHAR (12) MASKED WITH (FUNCTION = 'default()') NULL,
        Email VARCHAR (100) MASKED WITH (FUNCTION = 'email()') NOT NULL,
        DiscountCode SMALLINT MASKED WITH (FUNCTION = 'random(1, 100)') NULL,
        BirthDay DATETIME MASKED WITH (FUNCTION = 'default()') NULL
    );
    
  3. 插入範例資料:

    INSERT INTO Data.Membership (FirstName, LastName, Phone, Email, DiscountCode, BirthDay)
    VALUES ('Roberto', 'Tamburello', '555.123.4567', 'RTamburello@contoso.com', 10, '1985-01-25 03:25:05'),
           ('Janice', 'Galvin', '555.123.4568', 'JGalvin@contoso.com.co', 5, '1990-05-14 11:30:00'),
           ('Shakti', 'Menon', '555.123.4570', 'SMenon@contoso.net', 50, '2004-02-29 14:20:10'),
           ('Zheng', 'Mu', '555.123.4569', 'ZMu@contoso.net', 40, '1990-03-01 06:00:00');
    
  4. 建立結構描述以包含服務資料表:

    CREATE SCHEMA Service;
    GO
    
  5. 建立有遮罩欄位的服務表:

    CREATE TABLE Service.Feedback
    (
        MemberID INT IDENTITY (1, 1) NOT NULL,
        Feedback VARCHAR (100) MASKED WITH (FUNCTION = 'default()') NULL,
        Rating INT MASKED WITH (FUNCTION = 'default()'),
        Received_On DATETIME
    );
    
  6. 插入範例資料:

    INSERT INTO Service.Feedback (Feedback, Rating, Received_On)
    VALUES ('Good', 4, '2022-01-25 11:25:05'),
           ('Excellent', 5, '2021-12-22 08:10:07'),
           ('Average', 3, '2021-09-15 09:00:00');
    
  7. 在資料庫中建立不同的使用者:

    CREATE USER ServiceAttendant WITHOUT LOGIN;
    GO
    
    CREATE USER ServiceLead WITHOUT LOGIN;
    GO
    
    CREATE USER ServiceManager WITHOUT LOGIN;
    GO
    
    CREATE USER ServiceHead WITHOUT LOGIN;
    GO
    
  8. 授與讀取權限給資料庫中的使用者:

    ALTER ROLE db_datareader ADD MEMBER ServiceAttendant;
    ALTER ROLE db_datareader ADD MEMBER ServiceLead;
    ALTER ROLE db_datareader ADD MEMBER ServiceManager;
    ALTER ROLE db_datareader ADD MEMBER ServiceHead;
    
  9. 授予使用者不同 UNMASK 權限:

    • 授予欄位層級UNMASK權限:ServiceAttendant

      GRANT UNMASK ON Data.Membership (FirstName) TO ServiceAttendant;
      
    • 授予資料表的層級 UNMASK 權限給 ServiceLead

      GRANT UNMASK ON Data.Membership TO ServiceLead;
      
    • UNMASK的結構層級授予ServiceManager權限。

      GRANT UNMASK ON SCHEMA::Data TO ServiceManager;
      GRANT UNMASK ON SCHEMA::Service TO ServiceManager;
      
    • 授予資料庫層級UNMASK權限;ServiceHead

      GRANT UNMASK TO ServiceHead;
      
  10. 在使用者 ServiceAttendant 的環境中查詢資料:

    EXECUTE AS USER = 'ServiceAttendant';
    
    SELECT MemberID,
           FirstName,
           LastName,
           Phone,
           Email,
           BirthDay
    FROM Data.Membership;
    SELECT MemberID,
           Feedback,
           Rating
    FROM Service.Feedback;
    
    REVERT;
    
  11. 在使用者 ServiceLead 的環境中查詢資料:

    EXECUTE AS USER = 'ServiceLead';
    
    SELECT MemberID,
           FirstName,
           LastName,
           Phone,
           Email,
           BirthDay
    FROM Data.Membership;
    SELECT MemberID,
           Feedback,
           Rating
    FROM Service.Feedback;
    
    REVERT;
    
  12. 在使用者 ServiceManager 的環境中查詢資料:

    EXECUTE AS USER = 'ServiceManager';
    
    SELECT MemberID,
           FirstName,
           LastName,
           Phone,
           Email,
           BirthDay
    FROM Data.Membership;
    SELECT MemberID,
           Feedback,
           Rating
    FROM Service.Feedback;
    
    REVERT;
    
  13. 在使用者 ServiceHead 的內容下查詢資料

    EXECUTE AS USER = 'ServiceHead';
    
    SELECT MemberID,
           FirstName,
           LastName,
           Phone,
           Email,
           BirthDay
    FROM Data.Membership;
    SELECT MemberID,
           Feedback,
           Rating
    FROM Service.Feedback;
    
    REVERT;
    
  14. 要撤銷 UNMASK 權限,請使用以下 T-SQL 語句:

    REVOKE UNMASK ON Data.Membership (FirstName) FROM ServiceAttendant;
    REVOKE UNMASK ON Data.Membership FROM ServiceLead;
    REVOKE UNMASK ON SCHEMA::Data FROM ServiceManager;
    REVOKE UNMASK ON SCHEMA::Service FROM ServiceManager;
    REVOKE UNMASK FROM ServiceHead;