Azure Policy enrollment structure (Preview)

Azure Policy 注册会将选定的资源层级或单个资源添加到配置为注册强制模式的策略分配的执行路径中。 注册资源由分配评估,并在资源创建或更新过程中执行策略效果。 那些在分配范围内但未注册的资源仍然会生成合规记录,但政策效果不会被执行。 这种方法适用于你想从有限的范围开始,验证执行效果,然后逐步增加更多子范围时。

你需要使用 JavaScript 对象表示法(JSON)来创建策略注册。 保单登记包含以下要素:

策略注册作为资源层级中的子对象创建,或是被注册的单个资源。 注册可以在应注册资源范围或更高范围内创建。 如果注册的分配是针对某个倡议,注册还可以引用倡议中的某些策略定义子集。

例如,以下 JSON 显示了一项名为 resourceShouldBeCompliantInit的分配订阅的策略注册。 该注册适用于倡议中的两个政策定义,即requiredTagsallowedLocations政策定义参考ID:

{
  "id": "/subscriptions/{subId}/providers/Microsoft.Authorization/policyEnrollments/resourceShouldBeCompliant",
  "apiVersion": "2025-02-01-preview",
  "name": "resourceShouldBeCompliant",
  "type": "Microsoft.Authorization/policyEnrollments",
  "properties": {
    "displayName": "Enroll subscription in resource compliance policy",
    "description": "Enrolls the subscription into the resource compliance initiative assignment.",
    "policyAssignmentId": "/subscriptions/{mySubscriptionID}/providers/Microsoft.Authorization/policyAssignments/resourceShouldBeCompliantInit",
    "policyDefinitionReferenceIds": [
      "requiredTags",
      "allowedLocations"
    ],
    "assignmentScopeValidation": "Default"
  }
}

创建保单注册

您可以使用 Azure CLI、ARM 模板、Bicep 或 Terraform 搭配 AzAPI 提供者来创建和管理策略注册。 你提到的策略分配必须已经存在,并且必须配置为 注册强制模式

显示名称和说明

你使用 displayNamedescription 来识别政策注册,并为其与具体资源或范围的使用提供上下文。 displayName 的最大长度为 128 个字符, 的最大长度为 512 个字符。description

策略分配 ID

此字段必须是策略分配或计划分配的完整路径名称。 引用的分配必须使用 Enroll 执行模式来创建或更新政策注册。 policyAssignmentId 是字符串,而不是数组。 该属性定义了哪种分配对父资源层级或单个资源施加强制执行。

策略定义参考ID

如果 是 policyAssignmentId 针对倡议分配, policyDefinitionReferenceIds 属性可能用于指定注册适用于哪些策略定义。 由于资源可能被注册在一个或多个包含的策略定义中,该属性是一个 数组。 这些值必须与 policyDefinitions.policyDefinitionReferenceId 字段中的计划定义中的值相匹配。

资源选择器

注册支持可选财产 resourceSelectors。 该属性允许基于资源类型、资源位置或资源是否有位置,以受控的方式逐步推广或回滚对特定资源子集的 注册 。 有关如何使用资源选择器的详细信息,请参阅分配结构。 以下 JSON 是一个使用资源选择器的注册示例。 在此示例中,只有 和 chinaeast2 中的chinanorth2资源被纳入策略分配:

{
  "properties": {
    "policyAssignmentId": "/subscriptions/{subId}/providers/Microsoft.Authorization/policyAssignments/ResourceLimit",
    "resourceSelectors": [
      {
        "name": "SDPRegions",
        "selectors": [
          {
            "kind": "resourceLocation",
            "in": [
              "chinaeast2",
              "chinanorth2"
            ]
          }
        ]
      }
    ]
  },
  "systemData": { ...
  },
  "id": "/subscriptions/{subId}/providers/Microsoft.Authorization/policyEnrollments/ResourceLimitEnrollment",
  "type": "Microsoft.Authorization/policyEnrollments",
  "name": "ResourceLimitEnrollment"
}

以下资源选择器 kinds 在策略注册对象中得到支持:

  • resourceLocation:该属性用于根据位置选择资源。 不能在同一资源选择器中作为 resourceWithoutLocation 使用。
  • resourceType:此属性用于根据资源类型选择资源。
  • resourceWithoutLocation:此属性用于选择没有位置的订阅级资源。 当前仅支持 subscriptionLevelResources。 不能在同一资源选择器中作为 resourceLocation 使用。
  • in:特定 kind 的允许值列表。 无法与 notIn 一起使用。 最多可包含 50 个值。
  • notIn:不允许的特定 kind 值列表。 无法与 in 一起使用。 最多可包含 50 个值。

资源选择器可以包含多个 selectors。 若要适用于资源选择器,资源必须满足其所有选择器指定的要求。 此外,单次注册最多可指定10 resourceSelectors 名。 当范围内资源满足任一资源选择条件时,才被注册。

赋值范围验证

控制是否允许在不同范围内创建作业的注册。 以下示例中显示了此属性的使用:

{
  "properties": {
    "policyAssignmentId": "/providers/Microsoft.Management/managementGroups/{mgName}/providers/Microsoft.Authorization/policyAssignments/CostManagement",
    "policyDefinitionReferenceIds": [
      "limitSku",
      "limitType"
    ],
    "assignmentScopeValidation": "DoNotValidate"
  },
  "systemData": { ...
  },
  "id": "/subscriptions/{subId}/providers/Microsoft.Authorization/policyEnrollments/DemoExpensiveVM",
  "type": "Microsoft.Authorization/policyEnrollments",
  "name": "DemoExpensiveVM"
}

允许的 assignmentScopeValidation 值是 DefaultDoNotValidate。 如未指定,则执行默认验证过程。

更新注册

目前,策略注册只支持在执行assignmentScopeValidation操作时更新 resourceSelectorsPATCH 属性。

{
  "properties": {
    "assignmentScopeValidation": "Default",
    "resourceSelectors": [
      {
        "name": "SDPRegions",
        "selectors": [
          {
            "kind": "resourceLocation",
            "in": [
              "chinaeast2",
              "chinanorth2"
            ]
          }
        ]
      }
    ]
  }
}

删除策略注册

删除一份保单注册会移除该注册资源。 删除注册并不会删除注册所引用的底层策略分配,且会继续按其注册范围分配。

列表保单注册情况

当你在某个范围列出政策注册时,默认响应会包括适用于该范围的任何部分的注册。 响应可以包括来自父范围的注册和子范围的注册。

使用列表过滤器控制响应是否包含继承的注册,还是仅包含在请求范围内创建的注册。

当你想了解范围的有效注册人数时,可以使用 atScope() 。 该过滤器返回请求范围和父范围的策略注册。

az policy enrollment list \
  --scope "/subscriptions/{subscriptionId}" \
  --filter "atScope()"

当你只想管理直接在请求范围内创建的注册资源时,可以使用 atExactScope()

az policy enrollment list \
  --scope "/subscriptions/{subscriptionId}" \
  --filter "atExactScope()"

例如,如果一个订阅在订阅范围创建了三个注册,并且从父管理组继承了四个,atScope() 会返回全部七个注册。 atExactScope() 只返回在订阅范围内创建的三个注册。

Filter Description
atScope() 退货政策注册在请求范围和父范围。
atExactScope() 退货政策注册仅限于要求范围。

后续步骤