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之前,也是用真实的数据
结果如下
参考: