动态数据掩码(Dynamic Data Masking,DDM)可以防止把敏感数据暴露给未经受权的用户。DDM做用于数据表的字段上,在查询结果中隐藏敏感数据列,使用DDM不会修改表中的数据,只是把查询结果对未经受权的用户屏蔽,使未受权用户看到的查询结果是被屏蔽的,例如,第二列是号码列,前7个数字被掩码:sql
动态数据屏蔽在 SQL Server 2016 (13.x) 和 Azure SQL Database中提供,使用 Transact-SQL 命令进行配置。数据库
对于数据表的列定义屏蔽规则,有4中类型:安全
屏蔽规则的语法:架构
MASKED WITH (FUNCTION = 'default()') MASKED WITH (FUNCTION = 'email()') MASKED WITH (FUNCTION = 'random(start, end)') MASKED WITH (FUNCTION = 'partial(prefix,[padding],suffix)')
在建立表时定义屏蔽规则:dom
Email varchar(100) MASKED WITH (FUNCTION = 'email()') NULL
向现有表添加屏蔽规则:spa
ALTER COLUMN Email ADD MASKED WITH (FUNCTION = 'email()') NULL
控制建立和修改mask的权限,一个用户只有具备该列的UNMASK 权限,才能够查看该列的数据。code
1,建立和修改mask的权限server
在使用动态数据屏蔽来建立表时,不需任何特殊权限,只须要具备CREATE TABLE 权限以及对架构的 ALTER 权限。blog
当须要添加、替换或删除对列的屏蔽时,须要 ALTER ANY MASK 权限以及对表的 ALTER 权限,能够将 ALTER ANY MASK 权限授予安全负责人。ip
具备表的 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;
参考文档: