教程:排查 Azure Purview 访问策略的分发问题(预览版)

重要

此功能目前以预览版提供。 Azure 预览版的补充使用条款包含适用于 beta 版、预览版或其他尚未正式发布的 Azure 功能的其他法律条款。

本教程介绍如何以编程方式提取在 Azure Purview 中创建的访问策略。 这样可以排查 Azure Purview(创建和更新策略的位置)与数据源(强制执行策略的位置)之间的策略通信问题。

有关 Azure Purview 策略的详细信息,请参阅后续步骤部分中列出的概念指南。

本指南使用 SQL Server 中的示例作为数据源。

先决条件

概述

可以通过完全拉取或增量拉取从 Azure Purview 提取访问策略,如以下部分所述。

Azure Purview 策略模型是用 JSON 语法编写的。

可以基于 Azure Purview 帐户名将策略分发终结点构造为 {endpoint} = https://<account-name>.purview.azure.com/pds

完全拉取

完全拉取为特定数据资源范围提供一组完整的策略。

请求

若要通过完全拉取提取数据源的策略,请按如下所示向 /policyElements 发送 GET 请求:

GET {{endpoint}}/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/{resourceProvider}/{resourceType}/{resourceName}/policyelements?api-version={apiVersion}&$filter={filter}

其中的路径 /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/{resourceProvider}/{resourceType}/{resourceName} 与数据源的资源 ID 相匹配。

最后两个参数 api-version$filter 是字符串类型的查询参数。 $filter 是可选的,可以采用以下值:atScope(未指定参数时的默认值)或 childrenScope。 第一个值用于请求在路径级别应用的所有策略,包括在更高范围存在的策略,以及专门在更低范围(即子数据对象)应用的策略。 第二个值用于返回应用于子数据对象的精细策略。

提示

可以在 Azure 门户中数据源的属性下找到资源 ID。

响应状态代码

HTTP 代码 HTTP 代码说明 类型 说明 响应
200 成功 成功 已成功处理请求 策略数据
401 未经身份验证 错误 请求中未传递持有者令牌,或令牌无效 错误数据
403 禁止 错误 其他身份验证错误 错误数据
404 未找到 错误 请求路径无效或未注册 错误数据
500 内部服务器错误 错误 后端服务不可用 错误数据
503 后端服务不可用 错误 后端服务不可用 错误数据

SQL Server 的示例(Azure SQL 数据库)

示例参数:

  • Azure Purview 帐户:relecloud-pv
  • 数据源资源 ID:/subscriptions/BB345678-abcd-ABCD-0000-bbbbffff9012/resourceGroups/marketing-rg/providers/Microsoft.Sql/servers/relecloud-sql-srv1

示例请求:

GET https://relecloud-pv.purview.azure.com/pds/subscriptions/BB345678-abcd-ABCD-0000-bbbbffff9012/resourceGroups/marketing-rg/providers/Microsoft.Sql/servers/relecloud-sql-srv1/policyElements?api-version=2021-01-01-preview&$filter=atScope

示例响应:

200 OK

{
    "count": 2,
    "syncToken": "820:0",
    "elements": [
        {
            "id": "9912572d-58bc-4835-a313-b913ac5bef97",
            "kind": "policy",
            "updatedAt": "2022-11-04T20:57:20.9389522Z",
            "version": 1,
            "elementJson": "{\"id\":\"9912572d-58bc-4835-a313-b913ac5bef97\",\"name\":\"marketing-rg_sqlsecurityauditor\",\"kind\":\"policy\",\"version\":1,\"updatedAt\":\"2022-11-04T20:57:20.9389522Z\",\"decisionRules\":[{\"kind\":\"decisionrule\",\"effect\":\"Permit\",\"updatedAt\":\"11/04/2022 20:57:20\",\"cnfCondition\":[[{\"attributeName\":\"resource.azure.path\",\"attributeValueIncludedIn\":[\"/subscriptions/BB345678-abcd-ABCD-0000-bbbbffff9012/resourceGroups/marketing-rg/**\"]}],[{\"fromRule\":\"purviewdatarole_builtin_sqlsecurityauditor\",\"attributeName\":\"derived.purview.role\",\"attributeValueIncludes\":\"purviewdatarole_builtin_sqlsecurityauditor\"}],[{\"attributeName\":\"principal.microsoft.groups\",\"attributeValueIncludedIn\":[\"b29c1676-8d2c-4a81-b7e1-365b79088375\"]}]]},{\"kind\":\"decisionrule\",\"effect\":\"Permit\",\"id\":\"auto_0235e4df-0d3f-41ca-98ed-edf1b8bfcf9f\",\"updatedAt\":\"11/04/2022 20:57:20\",\"cnfCondition\":[[{\"attributeName\":\"resource.azure.path\",\"attributeValueIncludedIn\":[\"/subscriptions/BB345678-abcd-ABCD-0000-bbbbffff9012/resourceGroups/marketing-rg/**\"]}],[{\"attributeName\":\"request.azure.dataAction\",\"attributeValueIncludedIn\":[\"Microsoft.Sql/sqlservers/Connect\"]}],[{\"attributeName\":\"principal.microsoft.groups\",\"attributeValueIncludedIn\":[\"b29c1676-8d2c-4a81-b7e1-365b79088375\"]}]]},{\"kind\":\"decisionrule\",\"effect\":\"Permit\",\"id\":\"auto_45fa5236-a2a3-4291-9f0a-813b2883f118\",\"updatedAt\":\"11/04/2022 20:57:20\",\"cnfCondition\":[[{\"attributeName\":\"resource.azure.path\",\"attributeValueIncludedIn\":[\"/subscriptions/BB345678-abcd-ABCD-0000-bbbbffff9012/resourceGroups/marketing-rg/**\"]}],[{\"attributeName\":\"request.azure.dataAction\",\"attributeValueIncludedIn\":[\"Microsoft.Sql/sqlservers/databases/Connect\"]}],[{\"attributeName\":\"principal.microsoft.groups\",\"attributeValueIncludedIn\":[\"b29c1676-8d2c-4a81-b7e1-365b79088375\"]}]]}]}"
        },
        {
            "id": "f1f2ecc0-c8fa-473f-9adf-7f7bd53ffdb4",
            "scopes": [
                "/subscriptions/BB345678-abcd-ABCD-0000-bbbbffff9012/resourceGroups/marketing-rg"
            ],
            "kind": "policyset",
            "updatedAt": "2022-11-04T20:57:20.9389456Z",
            "version": 1,
            "elementJson": "{\"id\":\"f1f2ecc0-c8fa-473f-9adf-7f7bd53ffdb4\",\"name\":\"f1f2ecc0-c8fa-473f-9adf-7f7bd53ffdb4\",\"kind\":\"policyset\",\"version\":1,\"updatedAt\":\"2022-11-04T20:57:20.9389456Z\",\"preconditionRules\":[{\"dnfCondition\":[[{\"attributeName\":\"resource.azure.path\",\"attributeValueIncludedIn\":[\"/subscriptions/BB345678-abcd-ABCD-0000-bbbbffff9012/resourceGroups/marketing-rg/**\"]}]]}],\"policyRefs\":[\"9912572d-58bc-4835-a313-b913ac5bef97\"]}"
        }
    ]
}

增量拉取

增量拉取提供策略的增量视图(即自上次发出拉取请求以来发生的更改),而不管上次拉取是完全拉取还是增量拉取。 在发出第一次增量拉取之前,需要进行一次完全拉取。

请求

若要通过增量拉取提取策略,请向 /policyEvents 发送 GET 请求,如下所示:

GET {{endpoint}}/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/{resourceProvider}/{resourceType}/{resourceName}/policyEvents?api-version={apiVersion}&syncToken={syncToken}

在任何连续增量提取中,提供从上一个拉取中获取的 syncToken。

响应状态代码

HTTP 代码 HTTP 代码说明 类型 说明 响应
200 成功 成功 已成功处理请求 策略数据
304 未修改 成功 自上次发出增量拉取调用以来未收到任何事件
401 未经身份验证 错误 请求中未传递持有者令牌,或令牌无效 错误数据
403 禁止 错误 其他身份验证错误 错误数据
404 未找到 错误 请求路径无效或未注册 错误数据
500 内部服务器错误 错误 后端服务不可用 错误数据
503 后端服务不可用 错误 后端服务不可用 错误数据

SQL Server 的示例(Azure SQL 数据库)

示例参数:

  • Azure Purview 帐户:relecloud-pv
  • 数据源资源 ID:/subscriptions/BB345678-abcd-ABCD-0000-bbbbffff9012/resourceGroups/marketing-rg/providers/Microsoft.Sql/servers/relecloud-sql-srv1
  • syncToken:820:0

示例请求:

https://relecloud-pv.purview.azure.com/pds/subscriptions/BB345678-abcd-ABCD-0000-bbbbffff9012/resourceGroups/marketing-rg/providers/Microsoft.Sql/servers/relecloud-sql-srv1/policyEvents?api-version=2021-01-01-preview&syncToken=820:0

示例响应:

200 OK

{
    "count": 2,
    "syncToken": "822:0",
    "elements": [
        {
            "eventType": "Microsoft.Purview/PolicyElements/Delete",
            "id": "f1f2ecc0-c8fa-473f-9adf-7f7bd53ffdb4",
            "scopes": [
                "/subscriptions/BB345678-abcd-ABCD-0000-bbbbffff9012/resourceGroups/marketing-rg"
            ],
            "kind": "policyset",
            "updatedAt": "2022-11-04T20:57:20.9389456Z",
            "version": 1,
            "elementJson": "{\"id\":\"f1f2ecc0-c8fa-473f-9adf-7f7bd53ffdb4\",\"name\":\"f1f2ecc0-c8fa-473f-9adf-7f7bd53ffdb4\",\"kind\":\"policyset\",\"version\":1,\"updatedAt\":\"2022-11-04T20:57:20.9389456Z\",\"preconditionRules\":[{\"dnfCondition\":[[{\"attributeName\":\"resource.azure.path\",\"attributeValueIncludedIn\":[\"/subscriptions/BB345678-abcd-ABCD-0000-bbbbffff9012/resourceGroups/marketing-rg/**\"]}]]}],\"policyRefs\":[\"9912572d-58bc-4835-a313-b913ac5bef97\"]}"
        },
        {
            "eventType": "Microsoft.Purview/PolicyElements/Delete",
            "id": "9912572d-58bc-4835-a313-b913ac5bef97",
            "scopes": [
                "/subscriptions/BB345678-abcd-ABCD-0000-bbbbffff9012/resourceGroups/marketing-rg"
            ],
            "kind": "policy",
            "updatedAt": "2022-11-04T20:57:20.9389522Z",
            "version": 1,
            "elementJson": "{\"id\":\"9912572d-58bc-4835-a313-b913ac5bef97\",\"name\":\"marketing-rg_sqlsecurityauditor\",\"kind\":\"policy\",\"version\":1,\"updatedAt\":\"2022-11-04T20:57:20.9389522Z\",\"decisionRules\":[{\"kind\":\"decisionrule\",\"effect\":\"Permit\",\"updatedAt\":\"11/04/2022 20:57:20\",\"cnfCondition\":[[{\"attributeName\":\"resource.azure.path\",\"attributeValueIncludedIn\":[\"/subscriptions/BB345678-abcd-ABCD-0000-bbbbffff9012/resourceGroups/marketing-rg/**\"]}],[{\"fromRule\":\"purviewdatarole_builtin_sqlsecurityauditor\",\"attributeName\":\"derived.purview.role\",\"attributeValueIncludes\":\"purviewdatarole_builtin_sqlsecurityauditor\"}],[{\"attributeName\":\"principal.microsoft.groups\",\"attributeValueIncludedIn\":[\"b29c1676-8d2c-4a81-b7e1-365b79088375\"]}]]},{\"kind\":\"decisionrule\",\"effect\":\"Permit\",\"id\":\"auto_0235e4df-0d3f-41ca-98ed-edf1b8bfcf9f\",\"updatedAt\":\"11/04/2022 20:57:20\",\"cnfCondition\":[[{\"attributeName\":\"resource.azure.path\",\"attributeValueIncludedIn\":[\"/subscriptions/BB345678-abcd-ABCD-0000-bbbbffff9012/resourceGroups/marketing-rg/**\"]}],[{\"attributeName\":\"request.azure.dataAction\",\"attributeValueIncludedIn\":[\"Microsoft.Sql/sqlservers/Connect\"]}],[{\"attributeName\":\"principal.microsoft.groups\",\"attributeValueIncludedIn\":[\"b29c1676-8d2c-4a81-b7e1-365b79088375\"]}]]},{\"kind\":\"decisionrule\",\"effect\":\"Permit\",\"id\":\"auto_45fa5236-a2a3-4291-9f0a-813b2883f118\",\"updatedAt\":\"11/04/2022 20:57:20\",\"cnfCondition\":[[{\"attributeName\":\"resource.azure.path\",\"attributeValueIncludedIn\":[\"/subscriptions/BB345678-abcd-ABCD-0000-bbbbffff9012/resourceGroups/marketing-rg/**\"]}],[{\"attributeName\":\"request.azure.dataAction\",\"attributeValueIncludedIn\":[\"Microsoft.Sql/sqlservers/databases/Connect\"]}],[{\"attributeName\":\"principal.microsoft.groups\",\"attributeValueIncludedIn\":[\"b29c1676-8d2c-4a81-b7e1-365b79088375\"]}]]}]}"
        }
    ]
}

在此例中,增量拉取根据 "eventType": "Microsoft.Purview/PolicyElements/Delete" 传达了已删除针对资源组 marketing-rg 的、范围为 "scopes": ["/subscriptions/BB345678-abcd-ABCD-0000-bbbbffff9012/resourceGroups/marketing-rg"] 的策略的事件。

策略构造

在对完全拉取 (/policyElements) 和增量拉取 (/policyEvents) 请求做出的响应中使用了三个顶级策略构造:PolicyPolicySetAttributeRule

策略

Policy 指定当 Azure AD 主体尝试通过客户端进行访问时,数据源必须强制执行的决策(允许或拒绝),前提是请求上下文属性满足策略中指定的属性谓词(例如:范围、请求的操作等)。 对策略的评估会触发对策略中引用的 AttributeRules 的评估。

成员 Value 类型 基数 说明
ID 字符串 1
name 字符串 1
kind 字符串 1
版本 1 数字 1
updatedAt 字符串 1 时间的字符串表示形式,格式为 yyyy-MM-ddTHH:mm:ss.fffffffZ(例如“2022-01-11T09:55:52.6472858Z”)
preconditionRules array[Object:Rule] 0..1 所有规则都采用“AND”运算
decisionRules array[Object:DecisionRule] 1

PolicySet

PolicySet 将策略 ID 数组与需要强制执行它们的资源范围相关联。

成员 Value 类型 基数 说明
ID 字符串 1
name 字符串 1
kind 字符串 1
版本 1 数字 1
updatedAt 字符串 1 时间的字符串表示形式,格式为 yyyy-MM-ddTHH:mm:ss.fffffffZ(例如“2022-01-11T09:55:52.6472858Z”)
preconditionRules array[Object:Rule] 0..1
policyRefs array[string] 1 策略 ID 列表

AttributeRule

AttributeRule 生成派生属性,并将其添加到请求上下文属性中。 对 AttributeRule 的评估会触发对 AttributeRule 中引用的附加 AttributeRules 的评估。

成员 Value 类型 基数 说明
ID 字符串 1
name 字符串 1
kind AttributeRule 字符串 1
版本 1 数字 1
dnfCondition array[array[Object:AttributePredicate]] 0..1
cnfCondition array[array[Object:AttributePredicate]] 0..1
condition 对象:条件 0..1
derivedAttributes array[Object:DerivedAttribute] 1

PolicySet、Policy 和 AttributeRule 中常用的子构造

AttributePredicate

AttributePredicate 检查是否满足属性中指定的谓词。 AttributePredicate 可以指定以下属性:

  • attributeName:指定需要评估其中的属性谓词的属性名称。
  • matcherId:匹配程序函数的 ID,该函数用于将请求上下文中按属性名称查找的属性值与谓词中指定的属性值文本进行比较。 目前,我们支持两个 matcherId 值:ExactMatcherGlobMatcher。 如果未指定 matcherId,则默认值为 GlobMatcher
  • fromRule:可选属性,指定需要评估的 AttributeRule 的 ID,以便使用要在此谓词中进行比较的属性值填充请求上下文。
  • attributeValueIncludes:应与请求上下文属性值匹配的标量文本值。
  • attributeValueIncludedIn:应与请求上下文属性值匹配的文本值数组。
  • attributeValueExcluded:不应与请求上下文属性值匹配的标量文本值。
  • attributeValueExcludedIn:不应与请求上下文属性值匹配的文本值数组。

CNFCondition

必须满足 ANDofORs 语义的 AttributePredicates 数组。

DNFCondition

必须满足 ORofANDs 语义的 AttributePredicates 数组。

PreConditionRule

  • PreConditionRule 最多可以指定 CNFConditionDNFConditionCondition 中的一个。
  • 所有指定的 CNFConditionDNFConditionCondition 都应计算为 true 才能使 PreConditionRule 满足当前请求。
  • 如果不满足任何先决条件规则,则 PolicySetPolicy 将被视为不适用于当前请求并且被跳过。

条件

  • 使用 condition 可以指定复杂的谓词条件,这些谓词可以嵌套函数库中的函数。
  • decision compute time 处,condition 计算为 truefalse,并且还可以发出可选的约定。
  • 如果 condition 计算为 false,则包含的 DecisionRule 被视为不适用于当前请求。

后续步骤

Azure Purview 访问策略的概念指南: