動態資料遮罩

图片 4

一部分特別珍爱資訊安全、個人資料的铺面或產業 (如:
金融、保險業),常常「測試用資料庫」的資料,會加上「掩饰;去識別化」的魔法,防止個資外洩。以后必須本人撰寫
SQL 語句或 Stored Procedure
來處理,且遭遇区别的資料庫使用者,要給予不一样瀏覽權限時,寫起來就更麻煩。現在
SQL Server 二〇一六 已內建「動態資料遮罩 (Dynamic Data
Masking)」作用,除了資料可針對自訂邏輯來遮掩,還可針對区别的資料庫使用者,給予分化的瀏覽權限。

图片 1图片 2

 --建立測試資料表
 CREATE TABLE Employee(
  EmpNo int identity primary key,
  [Name] nvarchar(5),
  ID varchar(10),
  Hireday date,
  Birthday date,
  Age as datediff(year,Birthday,getdate())+1,
  Gender bit,
  Email varchar(50), 
  Tel varchar(20),
  Salary money,
  CreditCard varchar(20))

 --新增測試資料
 INSERT Employee 
 VALUES (N'王二','A123456789','19700101','19800101',0,'aaa@wizard.com','02-12345678',100500,'1234-5678-9012-3456')
       ,(N'李二三','B123456789','19771010','19851010',1,'bbb@wizard.com','03-12345678',88000,'7890-1234-5678-9012')
       ,(N'陳二三四','C123456789','19851231','19951231',1,'ccc@wizard.com','04-12345678',723456,'3456-7890-1234-5678')

树立測試資料

 --測試 default 遮罩,在 varchar 型別
 ALTER TABLE Employee ALTER COLUMN Tel ADD MASKED WITH(FUNCTION='default()')
 GO
 --測試 default 遮罩,在 bit 型別 (bit會全為零)
 ALTER TABLE Employee ALTER COLUMN Gender ADD MASKED WITH(FUNCTION='default()')
 GO
 --測試 default 遮罩,在 money 型別
 ALTER TABLE Employee ALTER COLUMN Salary ADD MASKED WITH(FUNCTION='default()')
 GO
 --測試 default 遮罩,在 date 型別
 ALTER TABLE Employee ALTER COLUMN Hireday ADD MASKED WITH(FUNCTION='default()')
 GO
 --測試 email 遮罩,在 varchar 型別
 ALTER TABLE Employee ALTER COLUMN Email ADD MASKED WITH (FUNCTION = 'email()')

 --建立一般使用者 user1
CREATE USER user1 WITHOUT LOGIN
GRANT SELECT ON Employee TO user1

--以 sa (最高權限者) 瀏覽 (無遮罩)
SELECT * FROM Employee (NOLOCK);

--以 user1 瀏覽 (有遮罩)
EXEC AS USER='user1'
      SELECT * FROM Employee (NOLOCK);
 REVERT

图片 3
圖 1 使用者 sa 和 user1
看见的結果,前面一个無遮罩,後者有遮罩


 --測試自訂遮罩
 ALTER TABLE Employee ALTER COLUMN [Name] ADD MASKED WITH (FUNCTION = 'partial(1,"X",1)')  --Name 保留第一個和最後一個字,其他用 X 取代
 ALTER TABLE Employee ALTER COLUMN CreditCard ADD MASKED WITH (FUNCTION = 'partial(0,"xxxx-xxxx-xxxx-",4)') --信用卡,只顯示最後四碼
 ALTER TABLE Employee ALTER COLUMN ID ADD MASKED WITH (FUNCTION = 'partial(2,"________",0)')  --ID 保留前兩個字,其他用 8 個底線符號取代

 --測試亂數遮罩
 ALTER TABLE Employee ALTER COLUMN Salary ADD MASKED WITH(FUNCTION = 'random(10000,100000)')  --Salary 顯示介於 10000 到 100000 的亂數

图片 4
圖 2 使用者 sa 和 user1
看见的結果,前面八个無遮罩,後者有遮罩


–查詢有啟用 Dynamic Data Masking 成效的資料表和欄位

SELECT m.name, t.name, c.user_type_id, m.is_masked, m.masking_function
 FROM sys.masked_columns (NOLOCK) m
 JOIN sys.tables (NOLOCK) t ON m.[object_id]=t.[object_id]
 JOIN sys.columns (NOLOCK) c ON m.[object_id]=c.[object_id] AND m.name=c.name
 WHERE m.is_masked=1;

–希望某個使用者 user2 瀏覽時,不受遮罩影響
GRANT UNMASK TO user2


–針對某個資料表或欄位,移除 Dynamic Data Masking 功用
ALTER TABLE Employee ALTER COLUMN CreditCard DROP MASKED

–測試是还是不是已移除 Dynamic Data Masking 功用
exec(‘SELECT * FROM Employee (NOLOCK)’) as user=’user1′



參考書籍:

[1] Microsoft SQL Server 二零一五 資訊安全實戰, ch6, 悅知出版社

相關小说:

[1] 動態資料遮罩

[2] SQL二〇一四-動態資料遮罩

[3] sql server 里面的 dynamic Data Masking

[4] Dynamic Data Masking筆記(SQL Server 2016新功能)

[5] CP2-新功能-Dynamic Data Masking

[6] SQL Server 2016 Security Roadmap Session Notes


 

Leave a Comment.