你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

动态数据屏蔽

适用于:Azure SQL 数据库Azure SQL 托管实例Azure Synapse Analytics(仅限专用 SQL 池)Fabric 中的 SQL 数据库

Azure SQL 数据库、Microsoft Fabric SQL 数据库、Azure SQL 托管实例和 Azure Synapse Analytics 支持动态数据掩码 (DDM)。 动态数据掩码功能通过对非特权用户屏蔽敏感数据来限制此类数据的泄漏。

动态数据掩码使客户能够指定在对应用层所产生影响最小的前提下可以透露的敏感数据量,从而帮助防止敏感数据遭到未经授权的访问。 它是一项基于策略的安全功能,可以隐藏对指定数据库字段进行查询时获得的结果集中的敏感数据,而不会更改数据库中的数据。

例如,呼叫中心的服务代表可能通过确认呼叫方电子邮件的几个字符来对其进行识别,但是完整的电子邮件地址不应泄露给服务代表。 可以定义掩码规则,以屏蔽任何查询的结果集中的整个电子邮件地址。 另举一例:在需要进行故障排除时,开发人员可通过定义适当的数据掩码来保护个人数据,因此可在不违反符合性法规的情况下,对生产环境进行查询。

动态数据掩码基础知识

对于 Azure SQL 数据库,通过在 SQL 数据库配置窗格中的“安全性”下选择“动态数据掩码”边栏选项卡,在 Azure 门户中设置动态数据掩码策略

无法使用 Azure 门户为 SQL 托管实例或 Fabric SQL 数据库设置此功能。 请改用 Transact-SQL (T-SQL),如本文中 粒度权限示例 所示。 有关详细信息,请参阅 动态数据掩码

动态数据掩码策略

  • 从屏蔽中排除的 SQL 用户: 一组 SQL 用户,其中包括来自 Microsoft Entra ID 的标识,当它们访问 SQL 查询结果时能够获取未屏蔽的数据。 具有管理权限的用户(如服务器管理员、Microsoft Entra 管理员和 db_owner 角色)无需任何掩码即可查看原始数据。 (注意:它也适用于 SQL Server 中的 sysadmin 角色)

  • 掩码规则:一组定义将要掩码的指定字段以及使用的掩码函数的规则。 可以使用数据库架构名称、表名称和列名称定义指定的字段。

  • 掩码函数:一组用于控制不同情况下的数据透露的方法。

    掩码函数 掩码逻辑
    默认 根据指定字段的数据类型完全掩码

    如果字符串数据类型(XXXXnvarchar)的字段大小小于 4 个字符,请使用 (或更少)。
    对数值数据类型使用零值(bigintbitdecimalintmoneynumericsmallint、smallmoney、tinyintfloatreal)。
    1900-01-01用于日期/时间数据类型(datedatetime2datetime、datetimeoffsetsmalldatetimetime)。
    对于 sql_variant,将使用当前类型的默认值。
    对于 XML,将使用文档 <masked />
    对特殊数据类型使用空值(timestamptableHierarchyIDuniqueidentifierbinaryimagevarbinary 和空间类型)。
    信用卡 此掩码方法公开指定字段的最后四位数,并添加一个信用卡格式的常量字符串作为前缀。

    XXXX-XXXX-XXXX-1234
    电子邮件 此掩码方法公开第一个字母并将域替换为 XXX.com,并使用一个电子邮件地址格式的常量字符串作为前缀。

    aXX@XXXX.com
    随机数 此掩码方法根据选定边界和实际数据类型生成随机数。 如果指定的边界相等,则掩码函数是常数。

    此屏幕截图显示了用于生成随机数的掩码方法。
    自定义文本 此掩码方法公开第一个和最后一个字符,并在中间添加一个自定义填充字符串。 如果原始字符串短于公开的前缀和后缀,则只使用填充字符串。

    prefix[padding]suffix
    导航窗格的屏幕截图。
    Datetime 启用日期/时间列(即 datetimedatetime2datetimedatetimeoffsetsmalldatetime)的细粒度掩码。 可以屏蔽特定组件,例如年份(datetime("Y"))、月(datetime("M"))、日(datetime("D"))、小时(datetime("h"))、分钟(datetime("m")或秒)。datetime("s") 使用 T-SQL 应用此函数。

    例如:

    - 掩码年份: ALTER COLUMN BirthDay ADD MASKED WITH (FUNCTION = 'datetime("Y")').
    - 掩码月份: ALTER COLUMN BirthDay ADD MASKED WITH (FUNCTION = 'datetime("M")')
    - 掩码分钟: ALTER COLUMN BirthDay ADD MASKED WITH (FUNCTION = 'datetime("m")').

DDM 建议引擎会将数据库中的某些字段标记为可能的敏感字段,可以考虑对这些字段进行屏蔽。 在门户的“动态数据掩码”窗格中,会看到针对数据库建议的列。 针对一个或多个列选择“添加掩码”,然后选择相应的掩码函数,并选择“保存”,即可对这些字段应用掩码。

使用 T-SQL 管理动态数据掩码

使用 PowerShell cmdlet 为数据库设置动态数据掩码

数据掩码策略

数据掩码规则

使用 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 权限提供了一种精细的方式,用于控制和限制对数据库中存储的数据的未经授权的访问,并改进数据安全管理。

  1. 创建架构以包含用户表:

    CREATE SCHEMA Data;
    GO
    
  2. 创建具有掩码列的表:

    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
    );
    
  3. 插入示例数据:

    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');
    
  4. 创建架构以包含服务表:

    CREATE SCHEMA Service;
    GO
    
  5. 创建具有掩码列的服务表:

    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
    );
    
  6. 插入示例数据:

    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');
    
  7. 在数据库中创建不同用户:

    CREATE USER ServiceAttendant WITHOUT LOGIN;
    GO
    
    CREATE USER ServiceLead WITHOUT LOGIN;
    GO
    
    CREATE USER ServiceManager WITHOUT LOGIN;
    GO
    
    CREATE USER ServiceHead WITHOUT LOGIN;
    GO
    
  8. 向数据库中的用户授予读取权限:

    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;
    
  9. 向用户授予不同的 UNMASK 权限:

    • UNMASK 的列级别权限授予 ServiceAttendant

      GRANT UNMASK ON Data.Membership (FirstName) TO ServiceAttendant;
      
    • 将表UNMASK级权限授予ServiceLead

      GRANT UNMASK ON Data.Membership TO ServiceLead;
      
    • 授予 ServiceManager 架构级别 UNMASK 权限

      GRANT UNMASK ON SCHEMA::Data TO ServiceManager;
      GRANT UNMASK ON SCHEMA::Service TO ServiceManager;
      
    • ServiceHead 授予数据库级别 UNMASK 的权限;

      GRANT UNMASK TO ServiceHead;
      
  10. 在用户 ServiceAttendant 的上下文中查询数据:

    EXECUTE AS USER = 'ServiceAttendant';
    
    SELECT MemberID,
           FirstName,
           LastName,
           Phone,
           Email,
           BirthDay
    FROM Data.Membership;
    SELECT MemberID,
           Feedback,
           Rating
    FROM Service.Feedback;
    
    REVERT;
    
  11. 在用户 ServiceLead 的上下文中查询数据:

    EXECUTE AS USER = 'ServiceLead';
    
    SELECT MemberID,
           FirstName,
           LastName,
           Phone,
           Email,
           BirthDay
    FROM Data.Membership;
    SELECT MemberID,
           Feedback,
           Rating
    FROM Service.Feedback;
    
    REVERT;
    
  12. 在用户 ServiceManager 的上下文中查询数据:

    EXECUTE AS USER = 'ServiceManager';
    
    SELECT MemberID,
           FirstName,
           LastName,
           Phone,
           Email,
           BirthDay
    FROM Data.Membership;
    SELECT MemberID,
           Feedback,
           Rating
    FROM Service.Feedback;
    
    REVERT;
    
  13. 在用户 ServiceHead 的上下文下查询数据

    EXECUTE AS USER = 'ServiceHead';
    
    SELECT MemberID,
           FirstName,
           LastName,
           Phone,
           Email,
           BirthDay
    FROM Data.Membership;
    SELECT MemberID,
           Feedback,
           Rating
    FROM Service.Feedback;
    
    REVERT;
    
  14. 若要撤销 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;