規劃及實作動態遮罩

已完成

Azure SQL Database、Azure SQL 受控執行個體與 Azure Synapse Analytics 都支援動態資料遮罩。 動態資料遮罩可藉由遮罩處理,使不具權限的使用者無法看見敏感性資料。

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

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

動態資料遮罩基本概念

您可以在 [SQL Database 設定] 窗格中的 [安全性] 下,選取 [動態資料遮罩] 刀鋒視窗,在 Azure 入口網站中設定動態資料遮罩原則。

動態資料遮罩原則

  • 從遮罩中排除的 SQL 使用者 - 一組 SQL 使用者或 Microsoft Entra ID 身分識別,可在 SQL 查詢結果中取得未經遮罩處理的資料。 具有管理員權限的使用者永遠會從遮罩處理中排除,而且會看到沒有任何遮罩的原始資料。
  • 遮罩規則 - 一組規則,定義會遮罩處理的指定欄位和所使用的遮罩函數。 指定的欄位可使用資料庫結構描述名稱、資料表名稱和資料行名稱來定義。
  • 遮罩函數 - 一組方法,可控制不同案例的資料顯示性。
功能 描述 例子
預設 請依據指定欄位的資料類型進行完整遮罩。

對於字串資料類型,若欄位大小少於 4 個字元 (char、nchar、varchar、nvarchar、text、ntext) 時使用 XXXX (或更少)。

對於數值資料類型,請使用零值 (bigint、bit、decimal、int、moneynumericsmallint、smallmoney、tinyint、float、real)。

對於日期與時間資料類型,請使用 1900-01-01 00:00:00.0000000 (date、datetime2、datetime、datetimeoffset、smalldatetime、time)。

對於二進位資料類型,請使用單一位元組的 ASCII 值 0 (binary、 varbinary、 image)。
範例資料行定義語法:Phone# varchar(12) MASKED WITH (FUNCTION = 'default()') NULL

變更語法的範例:ALTER COLUMN Gender ADD MASKED WITH (FUNCTION = 'default()')
Email 此遮罩方法會讓電子郵件地址的第一個字母和常數後置詞 ".com" 以形式為電子郵件地址形式來公開。 aXXX@XXXX.com。 範例定義語法:Email varchar(100) MASKED WITH (FUNCTION = 'email()') NULL

變更語法的範例:ALTER COLUMN Email ADD MASKED WITH (FUNCTION = 'email()')
隨機 此隨機遮罩函數可用在任何數值類型,會以指定範圍內隨機的值遮罩原始值。 範例定義語法:Account_Number bigint MASKED WITH (FUNCTION = 'random([start range], [end range])')

變更語法的範例:ALTER COLUMN [Month] ADD MASKED WITH (FUNCTION = 'random(1, 12)')
自訂字串 此遮罩方法會公開第一個及最後一個字母,並在中間新增自訂填補字串。 prefix,[padding], 後綴

如果原始的值過短而無法完成整個遮罩,則不會暴露部分的前置詞或後置詞。
範例定義語法:FirstName varchar(100) MASKED WITH (FUNCTION = 'partial(prefix,[padding],suffix)') NULL

變更語法的範例:ALTER COLUMN [Phone Number] ADD MASKED WITH (FUNCTION = 'partial(1,"XXXXXXX",0)')

這會將 555.123.1234 之類的電話號碼變成 5XXXXXXX。

其他範例:

ALTER COLUMN [電話號碼] ADD MASKED WITH (FUNCTION = 'partial(5,“XXXXXXX”,0)' )

這會將 555.123.1234 之類的電話號碼變成 555.1XXXXXXX。
日期時間 適用於: SQL Server 2022 (16.x)

使用資料類型 datetime、datetime2、date、time、datetimeoffset、smalldatetime 所定義的資料行遮罩方法。 它有助於遮罩一日中年 => datetime("Y"),月=> datetime("M"),日=>datetime("D"),小時=>datetime("h"),分=>datetime("m"),或秒=>datetime("s") 的部分。
如何遮蔽 datetime 值的年份的範例:

ALTER COLUMN BirthDay ADD MASKED WITH (FUNCTION = 'datetime(“Y”)')

如何遮蔽 datetime 值的月份的範例:

ALTER COLUMN BirthDay ADD MASKED WITH (FUNCTION = 'datetime(“M”)')

如何遮蔽 datetime 值的分鐘的範例:

ALTER COLUMN BirthDay ADD MASKED WITH (FUNCTION = 'datetime(“m”)')
遮罩函式 遮罩邏輯
預設 根據指定欄位的資料類型進行完整遮罩

* 若字串資料類型的欄位大小少於 4 個字元 (nchar、ntext、nvarchar) 時使用 XXXX (或更少)。
* 對於數值資料類型,請使用零值 (bigint、bit、decimal、int、money、numeric、smallint、smallmoney、tinyint、float、real)。
* 對於日期/時間資料類型,請使用 1900-01-01 (date、datetime2、datetime、datetimeoffset、smalldatetime、time)。
* 對於 sql_variant,會使用目前類型的預設值。
* 對於 XML,則會使用文件 <遮罩/>。
* 對於特殊資料類型,請使用空值 (timestamp、table、HierarchyID、uniqueidentifier、binary、image、varbinary 和 spatial 類型)。
信用卡 遮罩方法會公開指定欄位的末四碼,並新增常數字串做為信用卡格式的前置詞。

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

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

顯示產生隨機數之遮罩方法的螢幕快照。
自訂文字 遮罩方法會公開第一個和最後一個字元,並在中間新增自訂填補字串。 如果原始字串小於公開的前置詞和後置詞,則只會使用填補字串。

prefix[padding]suffix

瀏覽窗格的螢幕快照。

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

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

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

資料遮罩原則

資料遮罩規則

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

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

資料遮罩原則

  • 建立或更新:建立或更新資料庫數據遮罩原則。
  • Get:可取得資料庫資料遮罩原則。

資料遮罩規則

權限

以下是設定動態資料遮罩的內建角色:

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

讀取/寫入:

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

讀取:

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

寫入:

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

若要深入瞭解搭配 T-SQL 命令使用動態數據遮罩時的許可權,請參閱 許可權

細微權限範例

防止未經授權存取敏感性資料,並防止藉由將其遮罩至不同資料庫層級的未經授權使用者來取得控制。 您可以將資料庫層級、架構層級、資料表層級或資料行層級的 UNMASK 權限授與或撤銷資料庫使用者或角色。 結合 Microsoft Entra 驗證,您可以針對 Azure 環境中維護的使用者、群組和應用程式管理 UNMASK 權限。 UNMASK 權限提供了更細微的方法,用於控制和限制對資料庫中儲存的資料進行未經授權的存取,並改善資料安全管理。

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

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

    CREATE TABLE Data.Membership (
        MemberID INT IDENTITY(1, 1) NOT NULL PRIMARY KEY CLUSTERED,
        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 PRIMARY KEY CLUSTERED,
        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 權限給使用者:

    --Grant column level UNMASK permission to ServiceAttendant
    GRANT UNMASK ON Data.Membership(FirstName) TO ServiceAttendant;
    
    
    
    -- Grant table level UNMASK permission to ServiceLead
    GRANT UNMASK ON Data.Membership TO ServiceLead;
    
    
    
    -- Grant schema level UNMASK permission to ServiceManager
    GRANT UNMASK ON SCHEMA::Data TO ServiceManager;
    GRANT UNMASK ON SCHEMA::Service TO ServiceManager;
    
    
    
    --Grant database level UNMASK permission to 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;