動態資料遮罩
適用於:Azure SQL 資料庫 Azure SQL 受控執行個體 Azure Synapse Analytics (僅限專用的 SQL 集區)
Azure SQL 資料庫、Azure SQL 受控執行個體和 Azure Synapse Analytics 都支援動態資料遮罩 (DDM)。 動態資料遮罩可藉由遮罩處理,使不具權限的使用者無法看見敏感性資料。
動態資料遮罩可讓客戶在應用程式層級受到最小影響的情況下指定要顯示多少機密資料,而協助防止未經授權者存取機密資料。 這項原則式安全性功能會將敏感性資料隱藏在指定資料庫欄位的查詢結果集內,而資料庫中的資料則不會變更。
例如,話務中心的服務代表可能會藉由確認來電者電子郵件地址的數個字元來識別該來電者,但系統不應該對服務代表顯示完整的電子郵件地址。 您可以定義遮罩規則,遮罩任何查詢結果集中的所有電子郵件地址。 在另一個範例中,可以定義適當的資料遮罩來保護個人資料,以便開發人員在生產環境中進行疑難排解用途的查詢,且不會違反法務規定。
動態資料遮罩基本概念
您可以在 Azure 入口網站中設定動態資料遮罩原則,方法為在 SQL Database 設定窗格的 [安全性] 下,選取 [動態資料遮罩] 窗格。 針對 SQL 受控執行個體,無法使用入口網站來設定這項功能。 如需相關資訊,請參閱 Dynamic Data Masking。
動態資料遮罩原則
- 從遮罩處理中排除的 SQL 使用者:一組 SQL 使用者,可能包括可在 SQL 查詢結果中取得未經遮罩處理的資料的 Microsoft Entra 身分識別 (先前稱為 Azure Active Directory)。 具有伺服器管理員、Microsoft Entra 管理員或 db_owner 角色等管理權限的使用者可以檢視原始資料,而不需要任何遮罩。 (注意:也適用於 SQL Server 中的系統管理員角色)
- 遮罩規則:一組規則,定義會遮罩處理的指定欄位和所使用的遮罩函數。 指定的欄位可使用資料庫結構描述名稱、資料表名稱和資料行名稱來定義。
- 遮罩函數:一組方法,可控制不同案例的資料顯示性。
遮罩函數 | 遮罩邏輯 |
---|---|
預設值 | 根據指定欄位的資料類型進行完整遮罩 * 如果字串資料類型的欄位大小少於 4 個字元 (Nchar、ntext、Nvarchar),請使用 XXXX (或較少的)。* 針對數值資料類型 (bigint、bit、decimal、int、money、numeric、smallint、smallmoney、tinyint、float、real),使用零值。 * 針對日期/時間資料類型 (date、datetime2、datetime、datetimeoffset、smalldatetime、time),使用 1900-01-01 。* 對於 sql_variant,會使用目前類型的預設值。 * 對於 XML,使用文件 <masked /> 。* 針對特殊資料類型 (時間戳記、資料表、HierarchyID、uniqueidentifier、二進位值、影像、varbinary 和空間類型),使用空值。 |
信用卡 | 遮罩方法會公開指定欄位的末四碼,並新增常數字串做為信用卡格式的前置詞。XXXX-XXXX-XXXX-1234 |
電子郵件 | 遮罩方法會公開第一個字母並以 XXX.com 取代網域,使用的常數字串前置詞會以電子郵件地址為格式。aXX@XXXX.com |
隨機數字 | 遮罩方法會產生一個隨機數字,其根據為選取的界限與實際資料類型。 如果指定的邊界相等,則遮罩函數是常數。 |
自訂文字 | 遮罩方法會公開第一個和最後一個字元,並在中間新增自訂填補字串。 如果原始字串小於公開的前置詞和後置詞,則只會使用填補字串。prefix[padding]suffix |
要遮罩處理的建議欄位
DDM 建議引擎會將您資料庫中的特定欄位標示為潛在敏感性欄位,而這類欄位可能適合進行遮罩處理。 在入口網站的 [動態資料遮罩] 窗格中,您會看到您的資料庫的建議資料行。 針對一或多個資料行選取 [新增遮罩],然後選取適當的遮罩函式,然後選取 [儲存],以套用這些欄位的遮罩。
使用 T-SQL 管理動態資料遮罩
- 若要建立動態資料遮罩,請參閱建立動態資料遮罩。
- 若要在現有資料行上新增或編輯遮罩,請參閱在現有資料行上新增或編輯遮罩。
- 若要授與權限以檢視未遮罩的資料,請參閱授與權限以檢視未遮罩的資料。
- 若要卸除動態資料遮罩,請參閱卸除動態資料遮罩。
使用 PowerShell Cmdlet 為您的資料庫設定動態資料遮罩
資料遮罩原則
資料遮罩規則
- Get-AzSqlDatabaseDataMaskingRule
- New-AzSqlDatabaseDataMaskingRule
- Remove-AzSqlDatabaseDataMaskingRule
- Set-AzSqlDatabaseDataMaskingRule
使用 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 驗證,您可以針對 Azure 環境中維護的使用者、群組和應用程式管理 UNMASK 權限。 UNMASK 權限提供了更細微的方法,用於控制和限制對資料庫中儲存的資料進行未經授權的存取,並改善資料安全管理。
建立結構描述以包含使用者資料表:
CREATE SCHEMA Data; GO
建立具有遮罩資料行的資料表:
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 );
插入範例資料:
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');
建立結構描述以包含服務資料表:
CREATE SCHEMA Service; GO
建立具有遮罩資料行的服務資料表:
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 );
插入範例資料:
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');
在資料庫中建立不同的使用者:
CREATE USER ServiceAttendant WITHOUT LOGIN; GO CREATE USER ServiceLead WITHOUT LOGIN; GO CREATE USER ServiceManager WITHOUT LOGIN; GO CREATE USER ServiceHead WITHOUT LOGIN; GO
授與讀取權限給資料庫中的使用者:
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;
授與不同的 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;
在使用者
ServiceAttendant
的內容下查詢資料:EXECUTE AS USER = 'ServiceAttendant'; SELECT MemberID, FirstName, LastName, Phone, Email, BirthDay FROM Data.Membership; SELECT MemberID, Feedback, Rating FROM Service.Feedback; REVERT;
在使用者
ServiceLead
的內容下查詢資料:EXECUTE AS USER = 'ServiceLead'; SELECT MemberID, FirstName, LastName, Phone, Email, BirthDay FROM Data.Membership; SELECT MemberID, Feedback, Rating FROM Service.Feedback; REVERT;
在使用者
ServiceManager
的內容下查詢資料:EXECUTE AS USER = 'ServiceManager'; SELECT MemberID, FirstName, LastName, Phone, Email, BirthDay FROM Data.Membership; SELECT MemberID, Feedback, Rating FROM Service.Feedback; REVERT;
在使用者
ServiceHead
的內容下查詢資料EXECUTE AS USER = 'ServiceHead'; SELECT MemberID, FirstName, LastName, Phone, Email, BirthDay FROM Data.Membership; SELECT MemberID, Feedback, Rating FROM Service.Feedback; REVERT;
若要撤銷 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;