動態數據掩碼

  • 2019 年 11 月 7 日
  • 筆記

動態數據掩碼(Dynamic Data Masking,簡稱為DDM)能夠防止把敏感數據暴露給未經授權的用戶。DDM作用於數據表的字段上,在查詢結果中隱藏敏感數據。啟用DDM不會修改表中的數據,只是把查詢結果對未經授權的用戶屏蔽,使未授權用戶看到的查詢結果是被掩碼的,例如,第二列是號碼列,前7個數字被掩碼,只暴露後三位數字:

動態數據屏蔽在 SQL Server 2016 (13.x) 和 Azure SQL Database中開始提供,使用 Transact-SQL 命令進行配置。

一,定義動態數據掩碼規則

對於數據表的列定義屏蔽規則,有4種掩碼函數:

  • Default:對於字符串類型,使用XXXX來做掩碼;對於數值類型,使用0值來做掩碼;對於date和time類型,使用01.01.1900 00:00:00.0000000來做掩碼;對於binary類型,使用0來做掩碼。
  • Email:作用於字符串類型,首字符、@和 .com 不做掩碼,其他字符替換為XXXX來做掩碼。
  • Random:作用於數值類型,使用隨機值來替換原始數字作為掩碼
  • Custom String:作用於字符串類型,把中間的字符替換為掩碼,兩端的字符顯示出來。對於prefix和 suffix中間的字符,使用padding來擴展,如果原始字符太短,不能掩碼,那麼prefix和suffix中間的字符不會暴露。

屏蔽函數的語法規則:

MASKED WITH (FUNCTION = 'default()')  MASKED WITH (FUNCTION = 'email()')  MASKED WITH (FUNCTION = 'random(start, end)')  MASKED WITH (FUNCTION = 'partial(prefix,[padding],suffix)')

啟用DDM,有兩種方式:

方式1:在創建表時定義屏蔽規則

Email varchar(100) MASKED WITH (FUNCTION = 'email()') NULL

方式2:向現有表添加屏蔽規則,通過ALTER TABLE命令修改列的定義:

ALTER COLUMN Email ADD MASKED WITH (FUNCTION = 'email()') NULL

二,權限控制

一個用戶只有被授予在該列上的UNMASK 權限,才可以查看該列的原始數據,否則,返回的是掩碼之後的數據。

1,創建和修改mask的權限

在使用動態數據屏蔽來創建表時,不需任何特殊權限,只需要具有CREATE TABLE 權限以及對架構的 ALTER 權限。

當需要添加、替換或刪除對列的屏蔽時,需要 ALTER ANY MASK 權限以及對錶的 ALTER 權限,可以將 ALTER ANY MASK 權限授予安全負責人。

具有表的 SELECT 權限的用戶可以查看錶數據,列在被定義為“已屏蔽”後,將顯示屏蔽後的數據。對於需要從定義了屏蔽的列中檢索數據的用戶,可授予其 UNMASK 權限,使其可以看到原始數據。

針對數據庫的 CONTROL 權限包括 ALTER ANY MASK 和 UNMASK 權限。

2,更新mask列的權限

在一列上創建mask不會阻止該列上的數據更新,如果用戶有write權限,那麼該用戶即使沒有該列上的UNMASK的權限,也可以修改該列的數據。為了避免該情況的發生,應該通過其他權限來控制用戶對屏蔽列的修改。

3,屏蔽複製

使用 SELECT INTO 或 INSERT INTO ,把數據從一個屏蔽列複製到另一個表中,這會使得屏蔽數據複製到新表中。

在執行SQL Server Import 和 Export時,也會把屏蔽複製到新的表中。

4,授權查看屏蔽數據

把UNMASK  的權限授權給用戶,那麼該用戶就可以查看屏蔽列的原始值:

GRANT UNMASK TO TestUser;  EXECUTE AS USER = 'TestUser';  SELECT * FROM Membership;  REVERT;    -- Removing the UNMASK permission    REVOKE UNMASK TO TestUser; 

三,屏蔽列操作

用戶可以對屏蔽列進行查詢、增加、修改和刪除操作。

1,查詢屏蔽列

查看數據庫中已經創建的屏蔽列:

SELECT tbl.name AS table_name      ,c.name AS column_name      ,c.is_masked      ,c.masking_function  FROM sys.masked_columns AS c  INNER JOIN sys.tables AS tbl      ON c.[object_id] = tbl.[object_id]  WHERE is_masked = 1

2,增加屏蔽列

對現有表增加屏蔽列

ALTER TABLE Membership  ALTER COLUMN LastName ADD MASKED WITH (FUNCTION = 'partial(2,"XXX",0)') NULL; 

3,修改屏蔽列

對現有的屏蔽列進行修改

ALTER TABLE Membership  ALTER COLUMN LastName varchar(100) MASKED WITH (FUNCTION = 'default()');  

4,刪除屏蔽列

把列上的屏蔽刪除,刪除掩碼規則,不會刪除該列的值:

ALTER TABLE Membership  ALTER COLUMN LastName DROP MASKED; 

 

參考文檔:

Dynamic Data Masking