动态数据掩藏(DDM) 是SQL Server 2016 CTP 2.1引入的新功能
数据库加密技术本质上改变了数据存储结构,而DDM只是在返回客户端的时候对数据进行隐藏。sysadmin的成员登陆账户 或者 db_owner角色的用户有查看DDM数据的权限。
数据库迁移助手评估DDM候选者
您的数据库包含需要对终端用户掩藏的数据,但是您并不能确定哪些列为Dynamic Data Masking(DDM)候选者。我们如何确认这些列并实施DDM来保护这些数据?
您可以使用Database Migration Assistant来评估哪些列为DDM的候选者。
第一步是下载最新版本的Database Migration Assistant(DMA)。
DMA的下载地址:https://www.microsoft.com/en-us/download/confirmation.aspx?id=53595
DMA是为了取代遗留的SQL Server Upgrade Advisor(SSUA)。
构建SSUA是为了在迁移到SQL Server的新版本之前对数据库进行评估。DMA 同时可以提供评估和执行数据库迁移。评估不仅为了查找迁移中可能存在的问题,同时也是探寻您的数据库使用新功能的机会。
那些新功能就来自于DDM。你可以将DMA指向一个已经存在的数据库,执行评估,获得您应该考虑DDM的列候选者列表。
使用SQL Server Data Migration Assistant创建一个评估
为了创建一个评估,你首先需要登录DMA。登录DMA后,你创建一个新项目:
接下来,我们将选择推荐的新功能:
下一步,我们将连接源服务:
然后我们选择一个数据库:
接下来,我们将开始评估。当完成时,将出现三个标签:Performance、Security和Storage。我们将浏览Security标签,展示如下:
从上图可以观察到,DML返回了DDM和Always Encrypted(AE)的候选列。你应该查看这些列,觉得哪些新功能适合你。
为SQL Server列启动DDM
一旦你确定了DDM的候选列,您可以开始对其进行掩藏。记住,DDM是一个简单的掩藏过程,而不是加密,在列级别执行。这意味着你必须应用掩码于每个独立的列。掩码在数据库查询结束,返回给客户端时应用。因此DDM对性能的影响保持最小。
因为这些数据已经存储数据库表中,为了应用掩码,我们需要执行ALTER语句。我们将应用掩码于下面的列:
[Person].[EmailAddress].[EmailAddress]
[Purchasing].[Vendor].[AccountNumber]
有四个可用的掩码函数:Default、Email、Random和 Partial。Default函数将根据数据类型,使用XXXX或者多个0替代原先的数据。Email函数将展示email地址的首个字母并且在结尾加上“.com”,不管email是还是不是 .com 。Random函数应用在数值类型的数据上,将使用特定范围内的随机数替代原来的数值。Partial展示第一个和最后一个字符,并在中间填充定制的字符串。
下面是执行DDM的T-SQL脚本:
USE [AdventureWorks2016CTP3]
GO
ALTER TABLE [Person].[EmailAddress]
ALTER COLUMN [EmailAddress] varchar(50) MASKED WITH (FUNCTION = 'email()');
ALTER TABLE [Purchasing].[Vendor]
ALTER COLUMN [AccountNumber] nvarchar(15) MASKED WITH (FUNCTION = 'partial(1,"XXXXXXXX",1)');
消息 5074,级别 16,状态 1,第 4 行
索引'IX_EmailAddress_EmailAddress' 依赖于 列'EmailAddress'。
消息 4922,级别 16,状态 9,第 4 行
由于一个或多个对象访问此 列,ALTER TABLE ALTER COLUMN EmailAddress 失败。
解决方案,先删除列依赖对象(这里是索引),执行ALTER TABLE ALTER COLUMN后,在重建依赖对象。
下一步,让我们在实例上创建一个登陆账户,并在数据库AdventureWorks2016CTP3中创建登陆账户的数据库用户,赋予用户对两个表的SELECT权限:
USE [master]
GO
CREATE LOGIN [DDM_User] WITH PASSWORD= 'M$SQLTipsRox27'
GO
USE [AdventureWorks2016CTP3]
GO
CREATE USER [DDM_User] FOR LOGIN [DDM_User]
GO
GRANT SELECT ON [Person].[EmailAddress] TO [DDM_User]
GRANT SELECT ON [Purchasing].[Vendor] TO [DDM_User]
GO
OK,现在在用户DDM_User上下文中查询表,您将看到掩藏的数据。让我们看看用户期望看到的结果,这个是[Person].[EmailAddress]表的结果:
EXEC AS USER='DDM_User'
GO
SELECT *
FROM [Person].[EmailAddress]
REVERT
GO
下面是[Purchasing].[Vendor]表的查看结果:
EXEC AS USER='DDM_User'
GO
SELECT *
FROM [Purchasing].[Vendor]
REVERT
GO
备注:
您应该知道关于DDM的一些额外的事实:
在数据库恢复时将保留掩码,因为掩码是在表的列上定义的。
掩码并不阻止对表的DUI(Deletes、Updates、Inserts)操作。如果用户有修改它们权限的话,他们仍然可以这样做。
当执行导入导出时,DDM应用于用户,因此用户仅允许提取掩藏后的数据,而不允许查看未掩藏的数据。
DDM不能应用于计算列,但如果计算列包含掩藏的列,那么计算列也将被掩藏
最后,DDM不应该被认为是100%牢不可破的。DDM 本意是防止将数据偶然的暴露给没有权限的用户。恶意的操作者可能构建一个蛮力攻击手段,揭示掩藏环境下的信息。
DDM不支持的数据类型:
(var)binary / image
xml
sql_variant
hierarchyid
uniqueidentifier
rowversion (timestamp)
spatial types
下面是对不支持的数据类型使用DDM 的一个简单例子:
CREATE TABLE TestDDMDataType(a binary,b varbinary,c image,d xml,e sql_variant,f hierarchyid,g uniqueidentifier,h rowversion,i geometry
,k geography)
--增加掩码
ALTER TABLE TestDDMDataType
ALTER COLUMN g uniqueidentifier MASKED WITH(FUNCTION='partial(1,''YYYYYYYYYYY'',1)')
--删除掩码
ALTER TABLE dbo.TestDDMDataType ALTER COLUMN g DROP MASKED;
消息 16003,级别 16,状态 0,第 69 行
列“g”的数据类型不支持数据掩码函数“partial”。