Azure Policy 豁免结构

Azure Policy 例外功能用于免除资源层次结构或单个资源对计划或定义的评估。 免除的资源计入总体符合性,但不能被评估或具有暂时豁免。 有关详细信息,请参阅了解 Azure Policy 中的适用性。 Azure Policy 豁免还适用于以下资源管理器模式:Microsoft.Kubernetes.Data、Microsoft.KeyVault.Data。

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

策略例外创建为资源层次结构上的子对象,或创建为被授予例外的单个资源。 无法在资源提供程序模式组件级别创建豁免。 如果删除豁免所应用到的父资源,则也会删除豁免。

例如,以下 JSON 在名为 resourceShouldBeCompliantInit 的计划分配的资源的“豁免”类别中显示了策略例外。 该资源仅受到计划中两个策略定义的豁免,即 customOrgPolicy 自定义策略定义( policyDefinitionReferenceId: requiredTags) 和允许的位置内置策略定义 ( policyDefinitionReferenceId : allowedLocations):

{
    "id": "/subscriptions/{subId}/resourceGroups/ExemptRG/providers/Microsoft.Authorization/policyExemptions/resourceIsNotApplicable",
    "apiVersion": "2020-07-01-preview",
    "name": "resourceIsNotApplicable",
    "type": "Microsoft.Authorization/policyExemptions",
    "properties": {
        "displayName": "This resource is scheduled for deletion",
        "description": "This resources is planned to be deleted by end of quarter and has been granted a waiver to the policy.",
        "metadata": {
            "requestedBy": "Storage team",
            "approvedBy": "IA",
            "approvedOn": "2020-07-26T08:02:32.0000000Z",
            "ticketRef": "4baf214c-8d54-4646-be3f-eb6ec7b9bc4f"
        },
        "policyAssignmentId": "/subscriptions/{mySubscriptionID}/providers/Microsoft.Authorization/policyAssignments/resourceShouldBeCompliantInit",
        "policyDefinitionReferenceIds": [
            "requiredTags",
            "allowedLocations"
        ],
        "exemptionCategory": "waiver",
        "expiresOn": "2020-12-31T23:59:00.0000000Z",
        "assignmentScopeValidation": "Default"
    }
}

显示名称和说明

使用“显示名称”和“说明”来标识策略例外,并提供其与特定资源配合使用时的上下文 。 displayName 的最大长度为 128 个字符,description 的最大长度为 512 个字符。

元数据

通过“元数据”属性,可以创建存储相关信息所需的任何子属性。 在示例中,属性“requestedBy”、“approvedBy”、“approvedOn”和“ticketRef”包含客户值,以提供有关免除请求者、批准者、批准时间,以及该请求的内部跟踪工单的信息。 这些“元数据”属性是示例,但不是必需的,且“元数据”不仅限于这些子属性 。

策略分配 ID

此字段必须是策略分配或计划分配的完整路径名称。 policyAssignmentId 是字符串,而不是数组。 此属性定义父级资源层次结构或单个资源是从哪个分配免除的。

策略定义 ID

如果 policyAssignmentId 用于计划分配,则 policyDefinitionReferenceIds 属性可用于指定主题资源可豁免计划中的哪些策略定义。 由于可以从一个或多个包含的策略定义中免除资源,因此此属性是一个数组。 这些值必须与 policyDefinitions.policyDefinitionReferenceId 字段中的计划定义中的值相匹配。

例外类别

存在两个例外类别,用于组例外:

  • 缓解:由于通过另一种方法满足了策略意图,因此授予了豁免。
  • 豁免:由于暂时接受资源的不合规状态,因此授予了豁免。 使用此类别的另一个原因是,对于某些资源或资源层次结构,应将其从计划中的一个或多个定义中排除,但不应将其从整个计划中排除。

过期时间

若要设置不再从分配中豁免资源层次结构或单个资源的时间,请设置 expiresOn 属性。 此可选属性必须采用通用 ISO 8601 日期/时间格式 yyyy-MM-ddTHH:mm:ss.fffffffZ

注意

达到 expiresOn 日期后,策略例外不会被删除。 该对象会保留用于记录,但不再受到免除。

资源选择器

豁免支持可选属性resourceSelectors。 该属性在豁免中的作用方式与在分配中的作用方式相同,允许根据资源类型、资源位置或资源是否有存储位置,以受控方式将例外逐步推出或回滚到某些资源子集中。 有关如何使用资源选择器的详细信息,请参阅分配结构。 下面是利用资源选择器的豁免示例 JSON。 在该示例中,仅chinaeast2中的资源可不进行策略分配:

{
    "properties": {
        "policyAssignmentId": "/subscriptions/{subId}/providers/Microsoft.Authorization/policyAssignments/CostManagement",
        "policyDefinitionReferenceIds": [
            "limitSku", "limitType"
        ],
        "exemptionCategory": "Waiver",
        "resourceSelectors": [
            {
                "name": "TemporaryMitigation",
                "selectors": [
                    {
                        "kind": "resourceLocation",
                        "in": [ "chinaeast2" ]
                    }
                ]
            }
        ]
    },
    "systemData": { ... },
    "id": "/subscriptions/{subId}/resourceGroups/demoCluster/providers/Microsoft.Authorization/policyExemptions/DemoExpensiveVM",
    "type": "Microsoft.Authorization/policyExemptions",
    "name": "DemoExpensiveVM"
}

可在示例的 resourceLocation 列表中添加或移除区域。 资源选择器可使豁免的创建和管理位置和方式更灵活。

分配范围验证(预览版)

在大多数情况下,会验证豁免范围,以确保其位于策略分配范围之内或之下。 可选assignmentScopeValidation属性允许豁免绕过此验证,并在分配范围之外创建。 这在需要将订阅从一个管理组 (MG) 移动到另一个管理组时适用,但由于订阅的资源属性问题,该移动会被策略阻止。 在此方案中,可为当前 MG 中的订阅创建豁免,从目标 MG 上的策略分配中免除其资源。 这样,当订阅移动到目标 MG 中时,该操作不会被阻止,因为资源已豁免相关策略分配。 该属性的使用方式如下所示:

{
    "properties": {
        "policyAssignmentId": "/providers/Microsoft.Management/managementGroups/{mgB}/providers/Microsoft.Authorization/policyAssignments/CostManagement",
        "policyDefinitionReferenceIds": [
            "limitSku", "limitType"
        ],
        "exemptionCategory": "Waiver",
        "assignmentScopeValidation": "DoNotValidate",
    },
    "systemData": { ... },
    "id": "/subscriptions/{subIdA}/providers/Microsoft.Authorization/policyExemptions/DemoExpensiveVM",
    "type": "Microsoft.Authorization/policyExemptions",
    "name": "DemoExpensiveVM"
}

assignmentScopeValidation的允许值为DefaultDoNotValidate。 如未指定,将发生默认验证过程。

所需的权限

管理策略例外对象所需的 Azure RBAC 权限位于 Microsoft.Authorization/policyExemptions 操作组中。 内置角色资源策略参与者安全管理员都具有 readwrite 权限,策略见解数据编写者(预览版)具有 read 权限。

鉴于授予免除的影响,免除具有额外的安全措施。 除了要求对资源层次结构或单个资源进行 Microsoft.Authorization/policyExemptions/write 操作外,例外的创建者还必须在目标分配上具有 exempt/Action 谓词。

豁免创建和管理

对于存在时间限制或具体的方案(其中仍应对资源或资源层次结构进行跟踪,否则将对其进行评估,但有特定原因不应评估其合规性),建议使用排除。 例如,如果环境分配了内置定义 Storage accounts should disable public network access (ID: b2982f36-99f2-4db5-8eff-283140c09693),效果设置为审核。 在合规性评估时,资源“StorageAcc1”不符合要求,但 StorageAcc1 必须出于业务目的启用公共网络访问。 此时,应提交请求以创建面向 StorageAcc1 的豁免资源。 创建豁免后,StorageAcc1 将在合规性评审中显示为豁免

定期重新访问豁免,以确保所有符合条件的项目都得到适当豁免,并及时移除任何不再有资格豁免的项目。 此时,也可以删除已过期的豁免资源。

后续步骤