Azure Policy 分配结构

Azure Policy 使用策略分配来定义为哪些资源分配了哪些策略或计划。 在分配时,策略分配可以确定该组资源的参数值,因此,可以重复使用能够处理相同资源属性并满足不同合规需求的策略定义。

注意

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

使用 JavaScript 对象表示法 (JSON) 创建策略分配。 策略分配包含以下各项的元素:

例如,以下 JSON 显示包含动态参数的、处于 DoNotEnforce 模式的策略分配:

{
    "properties": {
        "displayName": "Enforce resource naming rules",
        "description": "Force resource names to begin with DeptA and end with -LC",
        "metadata": {
            "assignedBy": "Cloud Center of Excellence"
        },
        "enforcementMode": "DoNotEnforce",
        "notScopes": [],
        "policyDefinitionId": "/subscriptions/{mySubscriptionID}/providers/Microsoft.Authorization/policyDefinitions/ResourceNaming",
        "nonComplianceMessages": [
            {
                "message": "Resource names must start with 'DeptA' and end with '-LC'."
            }
        ],
        "parameters": {
            "prefix": {
                "value": "DeptA"
            },
            "suffix": {
                "value": "-LC"
            }
        },
        "identity": {
            "type": "SystemAssigned"
        },
        "resourceSelectors": [],
        "overrides": []
    }
}

所有 Azure Policy 示例均位于 Azure Policy 示例中。

显示名称和说明

使用 displayNamedescription 来标识策略分配,并提供它与特定资源集配合使用时的上下文。 displayName 的最大长度为 128 个字符,description 的最大长度为 512 个字符。

元数据

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

常见元数据属性

  • assignedBy(字符串):创建分配的安全主体的友好名称。

  • createdBy(字符串):创建分配的安全主体的 GUID。

  • createdOn(字符串):分配创建时间的通用 ISO 8601 日期时间格式。

  • parameterScopes(对象):键值对的集合,其中密钥与 strongType 配置的参数名称匹配,值定义门户中使用的资源范围,以通过匹配 strongType 提供来可用资源的列表。 如果范围不同于分配范围,门户将设置此值。 如果已设置,则在门户中编辑策略分配后,会自动将参数的作用域设置为此值。 但是,该作用域不会锁定到值,并且可以更改为其他作用域。

    下面的示例 parameterScopes 是针对名为 backupPolicyIdstrongType 参数,用于在门户中编辑分配时设置资源选择的范围。

    "metadata": {
        "parameterScopes": {
            "backupPolicyId": "/subscriptions/{SubscriptionID}/resourcegroups/{ResourceGroupName}"
        }
    }
    
  • updatedBy(字符串):更新分配的安全主体的友好名称(如果有)。

  • updatedOn(字符串):分配更新时间的通用 ISO 8601 日期时间格式(如果有)。

  • evidenceStorages(对象):建议的默认存储帐户,该帐户应该用于保存证明具有 manual 效果的策略分配的证据。 displayName 属性是存储帐户的名称。 evidenceStorageAccountID 属性是存储帐户的资源 ID。 evidenceBlobContainer 属性是计划在其中存储证据的 Blob 容器名称。

    {
      "properties": {
        "displayName": "A contingency plan should be in place to ensure operational continuity for each Azure subscription.",
        "policyDefinitionId": "/providers/Microsoft.Authorization/policyDefinitions/{definitionId}",
        "metadata": {
          "evidenceStorages": [
            {
              "displayName": "Default evidence storage",
              "evidenceStorageAccountId": "/subscriptions/{subscriptionId}/resourceGroups/{rg-name}/providers/Microsoft.Storage/storageAccounts/{storage-account-name}",
              "evidenceBlobContainer": "evidence-container"
            }
          ]
        }
      }
    }
    

资源选择器

可选的 resourceSelectors 属性使你能够根据资源位置、资源类型或资源是否具有位置等因素逐步推出策略分配,从而推进安全部署做法 (SDP)。 使用资源选择器时,Azure Policy 将仅评估适用于资源选择器中制定的规范的资源。 还可以利用资源选择器以相同的方式缩小豁免范围。

在以下示例场景中,仅当资源的位置为“中国东部”或“中国北部”时,才会评估新策略分配。

{
    "properties": {
        "policyDefinitionId": "/subscriptions/{subId}/providers/Microsoft.Authorization/policyDefinitions/ResourceLimit",
        "definitionVersion": "1.1",
        "resourceSelectors": [
            {
                "name": "SDPRegions",
                "selectors": [
                    {
                        "kind": "resourceLocation",
                        "in": [ "chinaeast", "chinanorth" ]
                    }
                ]
            }
        ]
    },
    "systemData": { ... },
    "id": "/subscriptions/{subId}/providers/Microsoft.Authorization/policyAssignments/ResourceLimit",
    "type": "Microsoft.Authorization/policyAssignments",
    "name": "ResourceLimit"
}

准备好扩展策略的评估范围时,只需修改分配。 以下示例显示了我们的策略分配,其中另外两个 Azure 区域已添加到 SDPRegions 选择器。 注意,在此示例中,SDP 表示“安全部署做法”:

{
    "properties": {
        "policyDefinitionId": "/subscriptions/{subId}/providers/Microsoft.Authorization/policyDefinitions/ResourceLimit",
        "definitionVersion": "1.1",
        "resourceSelectors": [
            {
                "name": "SDPRegions",
                "selectors": [
                    {
                        "kind": "resourceLocation",
                        "in": [ "chinaeast", "chinaeast2", "chinanorth", "chinanorth2" ]
                    }
                ]
            }
        ]
    },
    "systemData": { ... },
    "id": "/subscriptions/{subId}/providers/Microsoft.Authorization/policyAssignments/ResourceLimit",
    "type": "Microsoft.Authorization/policyAssignments",
    "name": "ResourceLimit"
}

资源选择器具有以下属性:

  • name:资源选择器的名称。

  • selectors:(可选)用于确定哪部分资源适用于策略分配的因素应进行合规性评估。

    • kind:选择器的属性,用于描述哪些特征将缩小评估的资源集。 每种只能在一个资源选择器中使用一次。 允许值包括:

      • resourceLocation:此属性用于根据资源类型选择资源。 不能在同一资源选择器中作为 resourceWithoutLocation 使用。

      • resourceType:此属性用于根据资源类型选择资源。

      • resourceWithoutLocation:此属性用于选择没有位置的订阅级资源。 当前仅支持 subscriptionLevelResources。 不能在同一资源选择器中作为 resourceLocation 使用。

    • in:特定 kind 的允许值列表。 无法与 notIn 一起使用。 最多可包含 50 个值。

    • notIn:不允许的特定 kind 值列表。 无法与 in 一起使用。 最多可包含 50 个值。

资源选择器可以包含多个选择器。 若要适用于资源选择器,资源必须满足其所有选择器指定的要求。 此外,可在一个分配中指定 10 个资源选择器。 当范围内的资源满足其中任一资源选择器时,将对其进行评估。

覆盖

可选的 overrides 属性可以更改策略定义的效果,而无需修改基础策略定义或在策略定义中使用参数化效果。

替代的最常见用例是具有大量关联策略定义的策略计划。 在这种情况下,管理多个策略效果可能耗费大量管理精力,尤其是在需要不时更新效果的情况下。 替代可用于同时更新计划内多个策略定义的效果。

我们分析一个示例。 假设你有一个名为 CostManagement 的策略计划,其中包含具有 policyDefinitionReferenceIdcorpVMSizePolicy 的自定义策略定义和一个 audit 效果。 假设你想要分配 CostManagement 计划,但还不想查看此针对此策略报告的合规情况。 此策略的“审核”效果可通过计划分配上的替代替换为“已禁用”,如以下示例所示:

{
    "properties": {
        "policyDefinitionId": "/subscriptions/{subId}/providers/Microsoft.Authorization/policySetDefinitions/CostManagement",
        "overrides": [
            {
                "kind": "policyEffect",
                "value": "disabled",
                "selectors": [
                    {
                        "kind": "policyDefinitionReferenceId",
                        "in": [ "corpVMSizePolicy" ]
                    }
                ]
            }
        ]
    },
    "systemData": { ... },
    "id": "/subscriptions/{subId}/providers/Microsoft.Authorization/policyAssignments/CostManagement",
    "type": "Microsoft.Authorization/policyAssignments",
    "name": "CostManagement"
}

替代值具有以下属性:

  • kind:赋值将替代的属性。 支持的类型为policyEffect

  • value:替代现有值的新值。 支持的值为效果

  • selectors: (可选)用于确定替代适用的策略分配范围的属性。

    • kind:选择器的属性,用于描述哪些特征将缩小替代的范围。 允许的kind: policyEffect值为:

      • policyDefinitionReferenceId:指定计划分配中的哪些策略定义适用于效果替代。
    • in:特定 kind 的允许值列表。 无法与 notIn 一起使用。 最多可包含 50 个值。

    • notIn:不允许的特定 kind 值列表。 无法与 in 一起使用。 最多可包含 50 个值。

注意,通过在 policyDefinitionReferenceId 数组中指定多个值,一个替代可以替换多个策略的效果。 一个替代可用于最多 50 个 policyDefinitionReferenceId,一次策略分配最多可以包含 10 个替代,它们按指定顺序进行评估。 创建分配之前,将根据策略规则和参数允许值列表验证替代中选择的效果(如果效果已参数化)。

强制模式

enforcementMode 属性使客户能够测试对现有资源应用某个策略后的结果,而无需启动策略效果,或触发 Azure 活动日志中的条目。

此方案通常称为“What If”,与安全部署做法相符。 enforcementMode 不同于 Disabled 效果,后者会彻底阻止资源评估的发生。

此属性具有以下值:

Mode JSON 值 类型 手动修正 活动日志条目 说明
Enabled 默认 string 在创建或更新资源期间强制实施策略效果。
已禁用 DoNotEnforce string 在创建或更新资源期间不强制实施策略效果。

如果未在策略或计划定义中指定 enforcementMode,则使用值 Default。 即使 enforcementMode 设置为 DoNotEnforce,也可以针对 deployIfNotExists 策略启动修正任务

排除的范围

分配的范围包括所有子资源容器和子资源。 如果子资源容器或子资源不应应用定义,则可以通过设置 notScopes 将每个项从计算中排除。 此属性是一个数组,用于从计算中排除一个或多个资源容器或资源。 notScopes 可以在创建初始赋值后添加或更新。

注意

排除的资源与免除的资源不同。 有关详细信息,请参阅了解 Azure Policy 中的范围

策略定义 ID

此字段必须是策略定义或计划定义的完整路径名称。 policyDefinitionId 是字符串,而不是数组。 每次评估策略分配时,都将检索已分配的策略定义或计划的最新内容。 如果经常要一起分配多个策略,我们建议改用计划

不符合性消息

若要设置描述资源为何不符合策略或计划定义的自定义消息,请在分配定义中设置 nonComplianceMessages。 此节点是一个 message 条目的数组。 此自定义消息是对不符合性默认错误消息的补充,并且是可选的。

重要

只有使用资源管理器模式定义的定义或计划才支持针对不合规的自定义消息。

"nonComplianceMessages": [
    {
        "message": "Default message"
    }
]

如果分配是针对某个计划的,则可以为该计划中的每个策略定义配置不同的消息。 消息使用在计划定义中配置的 policyDefinitionReferenceId 值。 有关详细信息,请参阅策略定义属性

"nonComplianceMessages": [
    {
        "message": "Default message"
    },
    {
        "message": "Message for just this policy definition by reference ID",
        "policyDefinitionReferenceId": "10420126870854049575"
    }
]

parameters

此策略分配段为策略定义或计划定义中定义的参数提供值。 通过这种设计,可对不同的资源重复使用某个策略或计划定义,但需要检查不同的业务价值或成果。

"parameters": {
    "prefix": {
        "value": "DeptA"
    },
    "suffix": {
        "value": "-LC"
    }
}

在此示例中,事先在策略定义中定义的参数为 prefixsuffix。 此特定策略分配将 prefix 设置为 DeptA,将 suffix 设置为 -LC。 可对不同部门的一组不同参数重复使用同一个策略定义,以降低策略定义的重复性和复杂性,同时提供灵活性。

标识

对于效果设置为 deployIfNotExist 或 modify 的策略分配,需要具有标识属性才能对不合规的资源进行修正。 使用标识时,用户还必须指定分配的位置。

注意

单个策略分配只能与一个由系统或由用户分配的托管标识相关联。 但是,如有必要,可为该标识分配多个角色。

# System-assigned identity
 "identity": {
    "type": "SystemAssigned"
  }
# User-assigned identity
  "identity": {
    "type": "UserAssigned",
    "userAssignedIdentities": {
      "/subscriptions/SubscriptionID/resourceGroups/testResourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/test-identity": {}
    }
  },

后续步骤