重要
此功能目前以预览版提供。 Azure 预览版的补充使用条款包含适用于 beta 版、预览版或其他尚未正式发布的 Azure 功能的其他法律条款。
本教程介绍如何以编程方式提取在 Azure Purview 中创建的访问策略。 这样可以排查 Azure Purview(创建和更新策略的位置)与数据源(强制执行策略的位置)之间的策略通信问题。
有关 Azure Purview 策略的详细信息,请参阅后续步骤部分中列出的概念指南。
本指南使用 SQL Server 中的示例作为数据源。
先决条件
- Azure 订阅。 如果没有 Azure 订阅,请在开始前创建一个试用版订阅。
- Azure Purview 帐户。 如果你没有帐户,请参阅创建 Azure Purview 帐户快速入门。
- 注册数据源,启用“数据使用管理”,并创建策略。 为此,请使用 Azure Purview 策略指南之一。 按照本教程中的示例,可以为 Azure SQL 数据库创建 DevOps 策略。
- 建立持有者令牌并调用数据平面 API。 若要了解如何操作,请参阅如何调用适用于 Azure Purview 数据平面的 REST API。 若要获得提取策略的授权,你需要是 Azure Purview 中根集合级别的策略创建者、数据源管理员或数据管护者。 若要分配这些角色,请参阅管理 Azure Purview 角色分配。
概述
可以通过完全拉取或增量拉取从 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
) 请求做出的响应中使用了三个顶级策略构造:Policy
、PolicySet
和 AttributeRule
。
策略
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
值:ExactMatcher
和GlobMatcher
。 如果未指定matcherId
,则默认值为GlobMatcher
。fromRule
:可选属性,指定需要评估的AttributeRule
的 ID,以便使用要在此谓词中进行比较的属性值填充请求上下文。attributeValueIncludes
:应与请求上下文属性值匹配的标量文本值。attributeValueIncludedIn
:应与请求上下文属性值匹配的文本值数组。attributeValueExcluded
:不应与请求上下文属性值匹配的标量文本值。attributeValueExcludedIn
:不应与请求上下文属性值匹配的文本值数组。
CNFCondition
必须满足 ANDofORs 语义的 AttributePredicates
数组。
DNFCondition
必须满足 ORofANDs 语义的 AttributePredicates
数组。
PreConditionRule
PreConditionRule
最多可以指定CNFCondition
、DNFCondition
或Condition
中的一个。- 所有指定的
CNFCondition
、DNFCondition
和Condition
都应计算为true
才能使PreConditionRule
满足当前请求。 - 如果不满足任何先决条件规则,则
PolicySet
或Policy
将被视为不适用于当前请求并且被跳过。
条件
- 使用
condition
可以指定复杂的谓词条件,这些谓词可以嵌套函数库中的函数。 - 在
decision compute time
处,condition
计算为true
或false
,并且还可以发出可选的约定。 - 如果
condition
计算为false
,则包含的DecisionRule
被视为不适用于当前请求。
后续步骤
Azure Purview 访问策略的概念指南: