> 数据库 > SQL Server 2016 >

SQL Server 2016新特性:动态数据屏蔽(Dynamic Data Masking)

 

       动态数据屏蔽是SQL Server 2016引入的一项新的特性,通过数据屏蔽,你可以对非授权用户限制敏感数据的曝光。动态数据屏蔽会在查询结果集里隐藏指定栏位的敏感数据,而数据库中的实际数据并没有任何变化。动态数据屏蔽很容易应用到现有的应用系统中,因为屏蔽规则是应用在查询结果上,很多应用程序能够在不修改现有查询语句的情况下屏蔽敏感数据。

        动态数据屏蔽是其他SQL Server安全特性(审计、加密、行级别安全控制等)的补充,微软推荐动态数据屏蔽和其他安全特性结合使用,以更好地保护敏感数据。

        屏蔽规则可以在表的某列上定义,以保护该列的数据,有4种屏蔽类型:Default、Email、Custom String和Random。在一个列上创建屏蔽不会阻止该列的更新操作;使用SELECT INTO或INSERT INTO把数据从屏蔽列复制到另一张表时,会导致屏蔽的数据存放在目标表;对于没有UNMASK权限的用户来讲,动态数据屏蔽用在SQLServer导入/导出时,会导致目标数据库或文件包含屏蔽的数据。屏蔽规则不能应用于Encrypted columns, FILESTREAM, computed column等。

 

通过下面的SQL,可以查看哪些表的哪些栏位应用了屏蔽功能:

 

  1. SELECT c.name, tbl.name as table_name, c.is_masked, c.masking_function  
  2. FROM sys.masked_columns AS c  
  3. JOIN sys.tables AS tbl   
  4.     ON c.[object_id] = tbl.[object_id]  
  5. WHERE is_masked = 1;  

 

 

 

下面看看MSDN给的示例,以此来学习如何使用该功能。

1  创建Dynamix Data Mask
1.1  创建一张表,并定义不同类型的dynamic data masks

 

  1. CREATE TABLE Membership  
  2.   (MemberID int IDENTITY PRIMARY KEY,  
  3.    FirstName varchar(100) MASKED WITH (FUNCTION = 'partial(1,"XXXXXXX",0)') NULL,  
  4.    LastName varchar(100) NOT NULL,  
  5.    Phone# varchar(12) MASKED WITH (FUNCTION = 'default()') NULL,  
  6.    Email varchar(100) MASKED WITH (FUNCTION = 'email()') NULL);  
  7.   
  8. INSERT Membership (FirstName, LastName, Phone#, Email) VALUES   
  9. ('Roberto', 'Tamburello', '555.123.4567', 'RTamburello@contoso.com'),  
  10. ('Janice', 'Galvin', '555.123.4568', 'JGalvin@contoso.com.co'),  
  11. ('Zheng', 'Mu', '555.123.4569', 'ZMu@contoso.net');  
  12. SELECT * FROM Membership;  

 

 

 

1.2  创建一个user,并授SELECT权限,该user执行查询,就能看到屏蔽的数据。

 

  1. CREATE USER TestUser WITHOUT LOGIN;  
  2. GRANT SELECT ON Membership TO TestUser;  
  3.   
  4. EXECUTE AS USER = 'TestUser';  
  5. SELECT * FROM Membership;  
  6. REVERT;  

 

 

 

2  在已存在的列上添加或编辑屏蔽功能
2.1  添加屏蔽功能

 
  1. ALTER TABLE Membership  
  2. ALTER COLUMN LastName ADD MASKED WITH (FUNCTION = 'partial(2,"XXX",0)');  
2.2  修改屏蔽功能

 

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

 

 

3  授权查看未屏蔽的数据

 

  1. GRANT UNMASK TO TestUser;  
  2. EXECUTE AS USER = 'TestUser';  
  3. SELECT * FROM Membership;  
  4. REVERT;   
  5.   
  6. -- 解除UNMASK权限  
  7. REVOKE UNMASK TO TestUser;  

 

 

 

4  删除动态数据屏蔽

 

  1. ALTER TABLE Membership   
  2. ALTER COLUMN LastName DROP MASKED;  



(责任编辑:IT)