Fabric 数据仓库中的动态数据掩码
适用于:✅SQL 分析终结点和 Microsoft Fabric 中的仓库
动态数据掩码通过对非特权用户屏蔽敏感数据来限制此类数据的泄漏。 它可以用于显著简化应用程序中安全性的设计和编码。
动态数据掩码有助于防止未经授权的查看敏感数据,使管理员能够指定要透露的敏感数据量,对应用程序层的影响最小。 可以在指定的数据库字段上配置动态数据掩码,在查询结果集中隐藏敏感数据。 使用动态数据掩码时,数据库中的数据不会更改,因此它可用于现有应用程序,因为屏蔽规则应用于查询结果。 许多应用程序可以屏蔽敏感数据,而无需修改现有查询。
- 一个中央数据掩码策略直接对数据库中的敏感字段起作用。
- 指定有权访问敏感数据的特权用户或角色。
- 动态数据掩码采用完全掩码和部分掩码功能,以及用于数值数据的随机掩码。
- 简单的 Transact-SQL 命令定义和管理掩码。
动态数据掩码旨在限制敏感数据的公开,防止没有访问权限的用户查看敏感数据。 动态数据掩码并不是要防止数据库用户直接连接到数据库并运行可以公开敏感数据的详尽查询。
动态数据掩码与其他 Fabric 安全功能互补,例如 列级安全性 和 行级安全性。 强烈建议将这些数据保护功能一起使用,以保护数据库中的敏感数据。
定义动态数据掩码
针对表中的列定义屏蔽规则即可模糊该列中的数据。 有四种类型的可用屏蔽。
函数 | 说明 | 示例 |
---|---|---|
默认值 | 根据指定字段的数据类型进行完全屏蔽。 对于字符串数据类型,可使用 XXXX (或更少,如果字段大小小于 4 个字符)(char、nchar、varchar、nvarchar、text、ntext)。对于数字数据类型,可使用零值(bigintbitdecimal、 int、 money、 numeric、 smallint、 smallmoney、 tinyint、 float、 real)。 对于日期和时间数据类型,可使用 1900-01-01 00:00:00.0000000 (date、datetime2、datetime、datetimeoffset、smalldatetime、time)。对于二进制数据类型,可使用单字节的 ASCII 值 0(binary、 varbinary、 image)。 |
列定义语法示例: Phone# varchar(12) MASKED WITH (FUNCTION = 'default()') NULL ALTER 语法示例: ALTER COLUMN Gender ADD MASKED WITH (FUNCTION = 'default()') |
电子邮件 | 该屏蔽方法公开电子邮件地址的第一个字母,以及电子邮件地址格式中的常量后缀“.com”。 aXXX@XXXX.com 。 |
定义语法示例: Email varchar(100) MASKED WITH (FUNCTION = 'email()') NULL ALTER 语法示例: ALTER COLUMN Email ADD MASKED WITH (FUNCTION = 'email()') |
Random | 一种随机屏蔽函数,适用于任何数字类型,可以在指定范围内使用随机值来屏蔽原始值。 | 定义语法示例: Account_Number bigint MASKED WITH (FUNCTION = 'random([start range], [end range])') ALTER 语法示例: ALTER COLUMN [Month] ADD MASKED WITH (FUNCTION = 'random(1, 12)') |
自定义字符串 | 该屏蔽方法公开第一个和最后一个字母,在中间添加自定义填充字符串。 prefix,[padding],suffix 如果因原始值太短而无法进行完整的掩码,则不会公开部分前缀或后缀。 |
定义语法示例: FirstName varchar(100) MASKED WITH (FUNCTION = 'partial(prefix,[padding],suffix)') NULL ALTER 语法示例: ALTER COLUMN [Phone Number] ADD MASKED WITH (FUNCTION = 'partial(1,"XXXXXXX",0)') 这会将电话号码 555.123.1234 转换为 5XXXXXXX 。 其他示例: ALTER COLUMN [Phone Number] ADD MASKED WITH (FUNCTION = 'partial(5,"XXXXXXX",0)') 这会将电话号码 555.123.1234 转换为 555.1XXXXXXX 。 |
有关更多示例,请参阅如何在 Fabric 数据仓库中实现动态数据掩码。
权限
对工作区没有“管理员”、“成员”或“参与者”权限以及对仓库没有提升权限的用户将看到屏蔽的数据。
无需任何特殊权限即可使用动态数据掩码来创建表,只需在架构权限上的标准 CREATE TABLE
和 ALTER
。
添加、替换或删除对列的掩码,需要 ALTER ANY MASK
权限以及对表的 ALTER
权限。 可以将 ALTER ANY MASK
权限授予安全管理人员。
具有表的 SELECT
权限的用户可以查看表数据。 列在被定义为“已进行掩码”后,将显示掩码后的数据。 对于需要从定义了掩码的列中检索非掩码数据的用户,可授予其 UNMASK
权限。
数据库 CONTROL
的权限包括允许用户查看未进行掩码数据的权限 ALTER ANY MASK
和 UNMASK
权限。 管理用户或角色(如管理员、成员或参与者)按设计对数据库具有 CONTROL 权限,默认情况下可以查看未进行掩码的数据。 仓库的提升权限包括 CONTROL
权限。
安全注意事项:可使用推断或暴力技术绕过掩码
动态数据屏蔽旨在通过在应用程序使用的一组预定义查询中限制数据泄露,来简化应用程序开发。 虽然动态数据掩码也可以用于在直接访问数据时防止敏感数据的意外泄露,不过请务必注意,具有查询权限的非特权用户可以应用技术来获取对实际数据的访问权限。
例如,假设某用户具有足够权限来对仓库运行查询,尝试“猜测”基础数据并最终推断实际值。 假设我们对 [Employee].[Salary]
列定义了一个掩码,此用户直接连接到数据库并开始猜测值,从而最终推断 Employees
表中的 [Salary]
值:
SELECT ID, Name, Salary FROM Employees
WHERE Salary > 99999 and Salary < 100001;
结果:
ID | 名称 | 薪金 |
---|---|---|
62543 | Jane Doe | 0 |
91245 | John Smith | 0 |
这演示动态数据掩码不应独立用于完全保护敏感数据免受用户对仓库或 SQL 分析终结点的查询访问。 这适用于防止敏感数据泄露,但无法防范推断基础数据的恶意企图。
请务必使用 SQL 粒度权限正确管理对象级安全性,并且始终遵循最低必需权限原则。