首页 > 代码库 > SQL Server ->> SQL Server 2016新特性之 -- Dynamic Data Masking

SQL Server ->> SQL Server 2016新特性之 -- Dynamic Data Masking

Dynamic Data Masking是为了防止敏感数据暴露给未经授权的用户,以一种最小开销和维护成本的形式。Dynamic Data Masking用于表的字段,相当于盖住字段数据的一部分。比如一些像邮件或者工资这样敏感的数据,涉及PII的,我们可以运用这个功能。运用这个功能的步骤,首先先定义一组人(database role)可以拥有看数据的权限,然后GRANT UNMASK权限给这个角色组。微软提供了4种类型的masking给我们选择:default,email,random和custom string。default是字符类型替换为xxxx,数字替换为0,时间变成1990-01-01。email适用于email类型,除了第一个字符、@符号和.com其他的都替换成x。

 

注意的地方:

1) SELECT INTO、INSERT INTO和用数据库的IMPORT/EXPORT功能会把mask也带入到新生成的表或者目标表里面

2)加了mask的数据在备份好的文件中也是被masked的

3)加了MASK的字段并不能阻止被有更新权限的用户更新

4)兼容模式必须是130(SQL SERVER 2016)

 

CREATE TABLE dbo.DMMTest
(
    strcol1 nvarchar(500) MASKED WITH (FUNCTION = default()) NULL,
    intcol1 int MASKED WITH (FUNCTION = default()) NULL,
    dttmcol1 datetime MASKED WITH (FUNCTION = default()) NULL,
    bincol1 varbinary(100) MASKED WITH (FUNCTION = default()) NULL,
    emailcol1 nvarchar(200) MASKED WITH (FUNCTION = email()) NULL,
    randomcol1 int MASKED WITH (FUNCTION = random(3,10)) NULL
)

insert dbo.DMMTest
(
    strcol1,
    intcol1,
    dttmcol1,
    bincol1,
    emailcol1,
    randomcol1
)
values(
abcdefghijklmn,
123456789,
getdate(),
0x123456789,
jerrychen@cjj.com,
123456789
)

 

 如果用一个没有被GRANT UNMASK的用户看到的数据是这样的

技术分享

 

查看哪些字段加了mask

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

 

GROUP BY 其实发生在mask之前,也是用真实的数据

技术分享

 

结果如下

技术分享

 

 

参考:

Dynamic Data Masking

SQL Server ->> SQL Server 2016新特性之 -- Dynamic Data Masking