动态数据掩码(Dynamic Data Masking,DDM)能够防止把敏感数据暴露给未经授权的用户。DDM作用于数据表的字段上,在查询结果中隐藏敏感数据列,使用DDM不会修改表中的数据,只是把查询结果中的结果对未经授权的屏蔽。

动态数据屏蔽在 SQL Server 2016 (13.x) 和 Azure SQL Database中提供,使用 Transact-SQL 命令进行配置。

一,定义动态数据屏蔽规则

对于数据表的列定义屏蔽规则,有4中类型:

  • Default
  • Email
  • Random
  • Custom String

在创建表时定义屏蔽规则:

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

向现有表添加屏蔽规则:

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

二,权限控制

控制创建和修改mask的权限,一个用户只有具有该列的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)'); 

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

01-14 06:33