动态数据屏蔽
适用于: Azure SQL 数据库 Azure SQL 托管实例 Azure Synapse Analytics(仅限专用 SQL 池)
Azure SQL 数据库、Azure SQL 托管实例和 Azure Synapse Analytics 支持动态数据掩码 (DDM)。 动态数据掩码功能通过对非特权用户屏蔽敏感数据来限制此类数据的泄漏。
动态数据掩码使客户能够指定在对应用层所产生影响最小的前提下可以透露的敏感数据量,从而帮助防止敏感数据遭到未经授权的访问。 它是一项基于策略的安全功能,可以隐藏对指定数据库字段进行查询时获得的结果集中的敏感数据,而不会更改数据库中的数据。
例如,呼叫中心的服务代表可能通过确认呼叫方电子邮件的几个字符来对其进行识别,但是完整的电子邮件地址不应泄露给服务代表。 掩码规则可定义为对任何查询的结果集中的所有电子邮件地址进行掩蔽。 另举一例:在需要进行故障排除时,开发人员可通过定义适当的数据掩码来保护个人数据,因此可在不违反符合性法规的情况下,对生产环境进行查询。
动态数据掩码基础知识
对于 Azure SQL 数据库,通过在 SQL 数据库配置窗格中的“安全性”下选择“动态数据掩码”边栏选项卡,在 Azure 门户中设置动态数据掩码策略。
不能使用 SQL 托管实例的 Azure 门户设置此功能。 请改用 T-SQL,如本文的动态数据掩码示例中所示。 有关详细信息,请参阅 Dynamic Data Masking。
动态数据掩码策略
- 不对其进行屏蔽的 SQL 用户:一组可在 SQL 查询结果中获取非掩码数据的 SQL 用户(可包含来自 Microsoft Entra ID(旧称 Azure Active Directory)的标识)。 具有管理权限的用户(如服务器管理员、Microsoft Entra 管理员和 db_owner 角色)无需任何掩码即可查看原始数据。 (注意:它也适用于 SQL Server 中的 sysadmin 角色)
- 掩码规则:一组定义将要掩码的指定字段以及使用的掩码函数的规则。 可以使用数据库架构名称、表名称和列名称定义指定的字段。
- 掩码函数:一组用于控制不同情况下的数据透露的方法。
掩码函数 | 掩码逻辑 |
---|---|
默认 | 根据指定字段的数据类型完全掩码 * 对于字符串数据类型(nchar、ntext、nvarchar),将使用 XXXX (或更少,如果字段大小小于 4 个字符)。* 对于数值数据类型(bigint、bit、decimal、int、money、numeric、smallint、smallmoney、tinyint、float、real),将使用零值。 * 对于日期/时间数据类型(date、datetime2、datetime、datetimeoffset、smalldatetime、time),将使用 1900-01-01 。* 对于 sql_variant,将使用当前类型的默认值。 * 对于 XML,将使用文档 <masked /> 。* 对于特殊数据类型(timestamp、table、HierarchyID、uniqueidentifier、binary、image、varbinary 和空间类型),将使用空值。 |
信用卡 | 此掩码方法公开指定字段的最后四位数,并添加一个信用卡格式的常量字符串作为前缀。XXXX-XXXX-XXXX-1234 |
电子邮件 | 此掩码方法公开第一个字母并将域替换为 XXX.com,并使用一个电子邮件地址格式的常量字符串作为前缀。aXX@XXXX.com |
随机数 | 此掩码方法根据选定边界和实际数据类型生成随机数。 如果指定的边界相等,则掩码函数是常数。 |
自定义文本 | 此掩码方法公开第一个和最后一个字符,并在中间添加一个自定义填充字符串。 如果原始字符串短于公开的前缀和后缀,则只使用填充字符串。prefix[padding]suffix |
建议进行掩码的字段
DDM 建议引擎会将数据库中的某些字段标记为可能的敏感字段,可以考虑对这些字段进行屏蔽。 在门户的“动态数据掩码”窗格中,会看到针对数据库建议的列。 针对一个或多个列选择“添加掩码”,然后选择相应的掩码函数,并选择“保存”,即可对这些字段应用掩码。
使用 T-SQL 管理动态数据掩码
- 若要创建动态数据掩码,请参阅创建动态数据掩码。
- 若要在现有列上添加或编辑掩码,请参阅在现有列中添加或编辑掩码。
- 若要授予查看未屏蔽数据的权限,请参阅授予查看未屏蔽数据的权限。
- 若要删除动态数据掩码,请参阅删除动态数据掩码。
使用 PowerShell cmdlet 为数据库设置动态数据掩码
数据掩码策略
数据掩码规则
- Get-AzSqlDatabaseDataMaskingRule
- New-AzSqlDatabaseDataMaskingRule
- Remove-AzSqlDatabaseDataMaskingRule
- Set-AzSqlDatabaseDataMaskingRule
使用 REST API 为数据库设置动态数据掩码
你可以使用 REST API 以编程方式管理数据掩码策略和规则。 已发布的 REST API 支持以下操作:
数据掩码策略
数据掩码规则
权限
以下是用于配置动态数据掩码的内置角色:
以下是使用动态数据屏蔽所需的操作:
读/写:
Microsoft.Sql/servers/databases/dataMaskingPolicies/*
读取:
Microsoft.Sql/servers/databases/dataMaskingPolicies/read
写入:
Microsoft.Sql/servers/databases/dataMaskingPolicies/write
若要详细了解在使用带有 T-SQL 命令的动态数据掩码时的权限,请参阅权限
粒度权限示例
通过在数据库的不同级别向未经授权的用户屏蔽敏感数据,来防止对敏感数据进行未经授权的访问并获得控制权。 可以在数据库级别、架构级别、表级别或列级别向任何数据库用户或角色授予或撤销 UNMASK 权限。 结合 Microsoft Entra 身份验证,可以为 Azure 环境中维护的用户、组和应用程序管理 UNMASK 权限。 UNMASK 权限可更精细地控制和限制对数据库中存储的数据进行的未经授权访问,并改进数据安全管理。
创建架构以包含用户表:
CREATE SCHEMA Data; GO
创建具有掩码列的表:
CREATE TABLE Data.Membership ( MemberID INT IDENTITY(1, 1) NOT NULL, FirstName VARCHAR(100) MASKED WITH (FUNCTION = 'partial(1, "xxxxx", 1)') NULL, LastName VARCHAR(100) NOT NULL, Phone VARCHAR(12) MASKED WITH (FUNCTION = 'default()') NULL, Email VARCHAR(100) MASKED WITH (FUNCTION = 'email()') NOT NULL, DiscountCode SMALLINT MASKED WITH (FUNCTION = 'random(1, 100)') NULL, BirthDay DATETIME MASKED WITH (FUNCTION = 'default()') NULL );
插入示例数据:
INSERT INTO Data.Membership (FirstName, LastName, Phone, Email, DiscountCode, BirthDay) VALUES ('Roberto', 'Tamburello', '555.123.4567', 'RTamburello@contoso.com', 10, '1985-01-25 03:25:05'), ('Janice', 'Galvin', '555.123.4568', 'JGalvin@contoso.com.co', 5, '1990-05-14 11:30:00'), ('Shakti', 'Menon', '555.123.4570', 'SMenon@contoso.net', 50, '2004-02-29 14:20:10'), ('Zheng', 'Mu', '555.123.4569', 'ZMu@contoso.net', 40, '1990-03-01 06:00:00');
创建架构以包含服务表:
CREATE SCHEMA Service; GO
创建具有掩码列的服务表:
CREATE TABLE Service.Feedback ( MemberID INT IDENTITY(1, 1) NOT NULL, Feedback VARCHAR(100) MASKED WITH (FUNCTION = 'default()') NULL, Rating INT MASKED WITH (FUNCTION = 'default()'), Received_On DATETIME );
插入示例数据:
INSERT INTO Service.Feedback (Feedback, Rating, Received_On) VALUES ('Good', 4, '2022-01-25 11:25:05'), ('Excellent', 5, '2021-12-22 08:10:07'), ('Average', 3, '2021-09-15 09:00:00');
在数据库中创建不同用户:
CREATE USER ServiceAttendant WITHOUT LOGIN; GO CREATE USER ServiceLead WITHOUT LOGIN; GO CREATE USER ServiceManager WITHOUT LOGIN; GO CREATE USER ServiceHead WITHOUT LOGIN; GO
向数据库中的用户授予读取权限:
ALTER ROLE db_datareader ADD MEMBER ServiceAttendant; ALTER ROLE db_datareader ADD MEMBER ServiceLead; ALTER ROLE db_datareader ADD MEMBER ServiceManager; ALTER ROLE db_datareader ADD MEMBER ServiceHead;
向用户授予不同的 UNMASK 权限:
--Grant column level UNMASK permission to ServiceAttendant GRANT UNMASK ON Data.Membership(FirstName) TO ServiceAttendant; -- Grant table level UNMASK permission to ServiceLead GRANT UNMASK ON Data.Membership TO ServiceLead; -- Grant schema level UNMASK permission to ServiceManager GRANT UNMASK ON SCHEMA::Data TO ServiceManager; GRANT UNMASK ON SCHEMA::Service TO ServiceManager; --Grant database level UNMASK permission to ServiceHead; GRANT UNMASK TO ServiceHead;
在用户
ServiceAttendant
的上下文中查询数据:EXECUTE AS USER = 'ServiceAttendant'; SELECT MemberID, FirstName, LastName, Phone, Email, BirthDay FROM Data.Membership; SELECT MemberID, Feedback, Rating FROM Service.Feedback; REVERT;
在用户
ServiceLead
的上下文中查询数据:EXECUTE AS USER = 'ServiceLead'; SELECT MemberID, FirstName, LastName, Phone, Email, BirthDay FROM Data.Membership; SELECT MemberID, Feedback, Rating FROM Service.Feedback; REVERT;
在用户
ServiceManager
的上下文中查询数据:EXECUTE AS USER = 'ServiceManager'; SELECT MemberID, FirstName, LastName, Phone, Email, BirthDay FROM Data.Membership; SELECT MemberID, Feedback, Rating FROM Service.Feedback; REVERT;
在用户
ServiceHead
的上下文下查询数据EXECUTE AS USER = 'ServiceHead'; SELECT MemberID, FirstName, LastName, Phone, Email, BirthDay FROM Data.Membership; SELECT MemberID, Feedback, Rating FROM Service.Feedback; REVERT;
若要撤销 UNMASK 权限,请使用以下 T-SQL 语句:
REVOKE UNMASK ON Data.Membership(FirstName) FROM ServiceAttendant; REVOKE UNMASK ON Data.Membership FROM ServiceLead; REVOKE UNMASK ON SCHEMA::Data FROM ServiceManager; REVOKE UNMASK ON SCHEMA::Service FROM ServiceManager; REVOKE UNMASK FROM ServiceHead;