Azure Policy 定义结构基础知识

Azure Policy 定义描述了资源符合性条件以及在满足某个条件时所产生的效果。 条件将资源属性字段与所需值进行比较。 资源属性字段是通过别名进行访问的。 如果资源属性字段为数组,则可使用特殊的数组别名从所有数组成员中选择值,并将条件应用于每个值。 如需了解更多,请参见条件

通过使用策略分配,可以控制成本和管理资源。 例如,可指定仅允许特定类型的虚拟机。 也可要求资源使用特定的标记。 某个范围内的分配适用于该范围及以下范围内的所有资源。 如果将策略分配应用到资源组,则会将其应用到该资源组中的所有资源。

使用 JSON 创建包含以下元素的策略定义:

  • displayName
  • description
  • mode
  • metadata
  • parameters
  • policyRule
    • 逻辑计算
    • effect

例如,以下 JSON 说明限制资源部署位置的策略:

{
  "properties": {
    "displayName": "Allowed locations",
    "description": "This policy enables you to restrict the locations your organization can specify when deploying resources.",
    "mode": "Indexed",
    "metadata": {
      "version": "1.0.0",
      "category": "Locations"
    },
    "parameters": {
      "allowedLocations": {
        "type": "array",
        "metadata": {
          "description": "The list of locations that can be specified when deploying resources",
          "strongType": "location",
          "displayName": "Allowed locations"
        },
        "defaultValue": [
          "chinanorth2"
        ]
      }
    },
    "policyRule": {
      "if": {
        "not": {
          "field": "location",
          "in": "[parameters('allowedLocations')]"
        }
      },
      "then": {
        "effect": "deny"
      }
    }
  }
}

有关详细信息,请转到策略定义架构。 Azure Policy 内置和模式位于 Azure Policy 示例

显示名称和说明

请使用 displayNamedescription 来标识策略定义,并提供定义使用上下文。 displayName 的最大长度为 128 个字符,description 的最大长度为 512 个字符。

注意

在创建或更新策略定义期间,idtypename 由 JSON 外部属性定义,在 JSON 文件中不是必需的。 通过 SDK 获取策略定义将返回 idtypename 属性作为 JSON 的一部分,但每个属性都是与策略定义相关的只读信息。

策略类型

尽管无法设置 policyType 属性,但 SDK 返回了三个值且在门户中可见:

  • Builtin:Microsoft 提供和维护这些策略定义。

  • Custom:客户创建的所有策略定义都具有此值。

模型

mode 的配置要取决于策略是针对 Azure 资源管理器属性还是资源提供程序属性。

资源管理器模式

mode 决定要为策略定义评估的资源类型。 支持的模式包括:

  • all:评估资源组、订阅和所有资源类型
  • indexed:仅评估支持标记和位置的资源类型

例如,资源 Microsoft.Network/routeTables 支持标记和位置,并在这两种模式中进行评估。 但是,无法标记资源 Microsoft.Network/routeTables/routes,也不会在 indexed 模式下对其进行评估。

大多数情况下,建议将 mode 设置为 all。 通过门户创建的所有策略定义使用 all 模式。 如果使用 PowerShell 或 Azure CLI,则可以手动指定 mode 参数。 如果策略定义不包含 mode 值,则在 Azure PowerShell 中默认为 all,在 Azure CLI 中默认为 nullnull 模式等同于使用 indexed 来支持后向兼容性。

在创建强制执行标记或位置的策略时,应该使用 indexed。 虽然并不是必需的,但是它会阻止不支持标记和位置的资源,使其不会在符合性结果中显示为不兼容。 有一个例外情况,就是资源组和订阅。 策略定义若在资源组或订阅上强制执行位置或标记,则应将 mode 设为 all,并明确以 Microsoft.Resources/subscriptions/resourceGroupsMicrosoft.Resources/subscriptions 类型为目标。 有关示例,请参阅模式:标记 - 示例 #1。 有关支持标记的资源列表,请参阅有关 Azure 资源的标记支持

资源提供程序模式

完全支持以下资源提供程序模式:

目前支持以下资源提供程序模式(预览版)

  • Microsoft.DataFactory.Data 用于使用 Azure Policy 拒绝未在允许列表中指定的 Azure 数据工厂出站流量域名。 此资源提供程序模式仅强制实施,在公共预览版中不报告合规性情况。

注意

除非明确声明,否则资源提供程序模式仅支持内置策略定义,且不支持在组件级别进行豁免。

Metadata

metadata 可选属性用于存储关于策略定义的信息。 客户可在 metadata 中定义对其组织有用的任何属性和值。 但是,Azure 策略和内置策略有一些相同属性。每个 metadata 属性有 1024 个字符的限制。

常见元数据属性

  • version(字符串):跟踪有关策略定义的内容版本的详细信息。
  • category(字符串):确定在 Azure 门户中的哪个类别下显示策略定义。
  • preview(布尔):如果策略定义为“预览”,则为 True 或 False 标记。
  • deprecated(布尔):如果策略定义被标记为“已弃用”,则为 True 或 False 标记
  • portalReview(字符串):决定是否应在门户中查看参数,而不考虑必需的输入。

定义位置

创建计划或策略时,需要指定定义位置。 定义位置必须是管理组或订阅。 此位置决定了计划或策略的分配范围。 资源必须是用于分配的目标定义位置的层次结构中的直系成员或子代。

如果定义位置是:

  • 订阅 - 策略定义只能分配到该订阅内的资源。
  • 管理组 - 策略定义只能分配到子管理组和子订阅内的资源。 如果你计划将此策略定义应用于多个订阅,该位置必须是包含每个订阅的管理组。

有关详细信息,请参阅了解 Azure Policy 中的范围

后续步骤