SQL Server 2016 中的动态数据屏蔽






4.76/5 (8投票s)
什么是数据屏蔽,如何在现有应用程序中启用它,以及如何授予不同用户对屏蔽数据的访问权限
动态数据屏蔽
数据屏蔽是一种通过使用随机字符或结构上与原始数据相似的数据来创建数据新表示的方法。通常是为了保护我们的敏感数据。它也称为数据混淆。
动态数据屏蔽 (DDM) 是一项不断发展的技术,其目标是对生产数据进行实时数据屏蔽。DDM 会更改数据流,以便数据请求者无法访问敏感数据,同时对原始生产数据不进行任何物理更改。
动态数据屏蔽通过屏蔽敏感数据对非特权用户的访问来限制对敏感数据的了解。动态数据屏蔽通过允许客户选择要公开的敏感数据量,同时对应用程序层的影响微乎其微,从而有助于防止未经授权访问敏感数据。它是一项数据保护功能,可以在查询结果集中隐藏指定数据库字段上的敏感数据,而数据库中的数据不会改变。动态数据屏蔽易于与现有应用程序配合使用,因为屏蔽规则应用于查询结果。许多应用程序可以在不修改现有查询的情况下屏蔽敏感数据。
为什么选择动态数据屏蔽?
许多应用程序都包含存储在数据库中的敏感数据,并且这些数据仅对需要知道的用户可用。只有有业务需求查看数据的用户才应该能够访问这些数据。具有不同访问权限的多种用户类型正在同时访问数据。应用程序用户应该只能访问他们所需的数据部分。敏感数据字段不应暴露给直接连接到生产数据库的工程师。
SQL Server 2016 中的动态数据屏蔽
Microsoft SQL Server 2016 具有一项内置的安全功能,称为动态数据屏蔽。这是 SQL Server 2016 中一项新的可编程性安全功能,通过混淆查询结果来限制对敏感数据的访问。您可以使用内置或可自定义的屏蔽规则来保护敏感数据免遭未经授权的最终用户访问。但特权用户仍然可以看到未屏蔽的数据。
使用动态数据屏蔽的一个常见用例是合规性要求。应用程序需要严格遵守隐私标准和监管要求来屏蔽敏感数据。动态数据屏蔽最好的地方在于它非常简单易用。
数据是动态屏蔽的,数据库中的底层数据保持不变。对应用程序透明,并且非常容易应用于现有的生产数据库,为您要保护的敏感数据提供额外的安全层。
特点
- 使用您已经熟悉的简单 T-SQL 命令提供可配置的屏蔽策略
- 动态混淆查询结果中的数据
- 数据库物理上不改变,数据库操作不受影响
- 灵活定义一组特权 SQL 用户或角色以进行未屏蔽访问
屏蔽类型
SQL Server 2016 提供了四种类型的屏蔽。
1. 默认屏蔽
默认屏蔽会根据分配的数据类型屏蔽全部数据。
- 对于
字符串
类型(char
、nchar
、varchar
、nvarchar
、text
、ntext
),它会将数据替换为 XXXX 或更少的 X,如果字段大小小于4
。 - 对于数值数据类型(
bigint
、bit
、decimal
、int
、money
、numeric
、smallint
、smallmoney
、tinyint
、float
、real
),它使用0
值。 - 对于二进制数据类型(
binary
、varbinary
、image
),它使用单个字节的二进制值0
。
2. 电子邮件屏蔽
电子邮件屏蔽特别针对存储电子邮件的字段。它只显示电子邮件的第一个字母,后跟 XXX,后跟@
符号,后跟XXXX
和一个常量后缀“.com
”,形成一个电子邮件。示例:aXXX@XXXX.com
3. 自定义屏蔽
SQL Server 2016 允许您为特定字段定义自己的屏蔽。在此方法中,您可以定义要显示的自定义前缀和后缀字符,并按原样显示填充。 “prefix,[padding], suffix
”。
4. 随机屏蔽
可以在任何数值字段上定义随机屏蔽。它显示指定范围内的随机数。
向字段添加屏蔽
我使用的是 SQL Server Management Studio,系统上安装了 SQL Server 2016。我以管理员权限登录。我创建了一个数据库和一个Customer
表。我有一个自定义应用程序,该应用程序使用自定义用户帐户来使用数据并访问它。
我在表上执行了一个select
查询,结果如下所示
当我执行应用程序时,结果相同。
现在,我们将实现屏蔽。动态数据屏蔽的实现非常简单。在特定列上实现数据屏蔽的语法是
Alter table [Table Name] Alter Column [Column Name] _
ADD MASKED WITH (FUNCTION=’[masking function]’)
默认屏蔽
我们将仅通过更改具有管理员特权的表来应用屏蔽。
Alter table Customers Alter Column LastName ADD MASKED WITH (FUNCTION=’default()’)
成功执行此查询后,我们将检查结果。结果在 SSMS 中将相同,但在应用程序中将更改。因为数据以管理员权限显示,但以较低权限的服务帐户显示。在这里,您可以看到LastName
字段已完全屏蔽。有一点需要注意,我没有对应用程序进行任何更改。
电子邮件屏蔽
我们的customers
表中有一个电子邮件列。我们将通过以下方式对该列应用电子邮件屏蔽:
Alter table Customers Alter Column Email ADD MASKED WITH (FUNCTION=’email()’)
现在,我们将再次刷新应用程序以查看结果。您可以看到电子邮件字段已按上述方式屏蔽。
自定义屏蔽
我们的customers
表中有一个Phone
列。我们将对该列应用自定义屏蔽以隐藏数据,方法是:
Alter table Customers Alter Column Phone ADD MASKED WITH (FUNCTION=’partial(2, ”X-XXXX-X”,2)’)
此部分函数将在Phone
字段上应用自定义屏蔽。前缀中的2
和后缀中的2
定义了显示起始的 2 位和结束的 2 位数字,并且双引号下的填充将按原样显示(占位符文本)。现在,我们将再次刷新应用程序以查看结果。您可以看到email
字段已按上述方式屏蔽。
随机屏蔽
随机屏蔽将显示特定列中定义范围内的随机数。我们将通过以下方式对CustomerId
列应用随机屏蔽:
Alter table Customers Alter Column CustomerId ADD MASKED WITH (FUNCTION=’random(10000,99999)’)
随机函数需要两个参数:下限和上限。现在,我们将再次刷新应用程序以查看结果。您可以看到CustomerId
字段已使用我们屏蔽函数中定义的两个值之间的随机整数进行了屏蔽。
您应该注意的主要一点是,在所有情况下,我们都没有对应用程序进行任何更改。我们只是应用了屏蔽,它就可以工作了。
删除屏蔽
同样,删除任何列上的屏蔽也非常容易。您只需要一个简单的 T-SQL 命令来从列中删除屏蔽。
Alter table Customers Alter Column CustomerId DROP MASKED
允许和撤销用户查看未屏蔽的数据
管理员用户始终可以看到原始的未屏蔽数据,因为他们拥有特权。如果存在业务需求,您可以允许非特权用户查看未屏蔽的数据。
Grant Unmask TO DBUser
简单来说,如果您不再希望查看未屏蔽的数据,则可以撤销未屏蔽的访问权限。
Revoke Unmask TO DBUser
跟踪屏蔽的列
如果您想跟踪您已使用屏蔽功能的列,则定义了一个新的系统视图,名为masked_columns
。
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;
结论
本文是关于数据屏蔽的。在本文中,您了解了什么是数据屏蔽,如何在现有应用程序中启用数据屏蔽,以及如何授予不同用户对屏蔽数据的访问权限。主要问题在于它很容易实现数据屏蔽。数据屏蔽的主要优点是我们无需对应用程序进行任何更改。我们只需要在数据库中实现它。
历史
- 2016 年 3 月 11 日:初始版本