你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

修正 Azure Policy 中的不符合资源

不符合具有 deployIfNotExists 或 modify 效果的策略的资源可以通过修正进入合规状态。 修正是通过修正任务来完成的,这些任务在现有资源和订阅上部署 deployIfNotExists 模板或已分配策略的 modify 操作,无论该分配是在管理组、订阅、资源组还是单个资源上。 本文介绍了使用 Azure Policy 了解并完成修正所需执行的步骤。

修正访问控制的工作原理

如果 Azure Policy 在评估 deployIfNotExists 策略时启动模板部署,或在评估 modify 策略时修改资源,则使用与策略分配关联的托管标识来执行这些操作。 策略分配使用托管标识进行 Azure 资源授权。 你可以使用由策略服务创建的系统分配的托管标识,也可以使用由用户提供的用户分配的标识。 需要为托管标识分配修正资源所需的最小基于角色的访问控制 (RBAC) 角色。 如果托管标识缺少角色,则在分配策略或计划期间将在门户中显示错误。 使用门户时,一旦启动分配,Azure Policy 将自动授予托管标识所列的角色。 使用 Azure 软件开发工具包 (SDK) 时,必须手动向托管标识授予角色。 托管标识的位置不会影响它对 Azure Policy 的操作。

注意

更改策略定义不会自动更新分配或关联的托管标识。

可以通过以下步骤配置修正安全性:

配置策略定义

作为先决条件,策略定义必须定义 deployIfNotExists 和 modify 成功部署所包含模板的内容所需的角色。 内置策略定义不需要执行任何操作,因为这些角色已预先填充。 对于自定义策略定义,在 details 属性下,添加 roleDefinitionIds 属性。 此属性是与环境中的角色相匹配的一组字符串。 有关完整示例,请参阅 deployIfNotExists 示例modify 示例

"details": {
    ...
    "roleDefinitionIds": [
        "/subscriptions/{subscriptionId}/providers/Microsoft.Authorization/roleDefinitions/{roleGUID}",
        "/providers/Microsoft.Authorization/roleDefinitions/{builtinroleGUID}"
    ]
}

roleDefinitionIds 属性使用完整的资源标识符,并且不会使用角色的短 roleName。 若要获取环境中“参与者”角色的 ID,请使用以下 Azure CLI 代码:

az role definition list --name "Contributor"

重要

在策略定义中定义 roleDefinitionIds 或手动将权限分配给托管标识时,应将权限限制在尽可能小的范围内。 若要了解更多最佳做法,请参阅托管标识最佳做法建议

配置托管标识

每个 Azure Policy 分配只能与一个托管标识相关联。 但是,可以为托管标识分配多个角色。 配置分为两个步骤:首先创建系统分配的托管标识或用户分配的托管标识,然后向其授予必要的角色。

注意

通过门户创建托管标识时,将自动向托管标识授予角色。 如果稍后在策略定义中编辑 roleDefinitionIds,则必须手动授予新权限,即使在门户中也是如此。

创建托管标识

使用门户创建分配时,Azure Policy 会生成系统分配的托管标识并向它授予 roleDefinitionIds 中定义的角色。 也可以指定接收相同角色分配的用户分配的托管标识。

Screenshot of a policy assignment creating a system-assigned managed identity in East US with Log Analytics Contributor permissions.

在门户中设置系统分配的托管标识:

  1. 在“创建/编辑分配”视图的“修正”选项卡上的“托管标识类型”下,确保选中“系统分配的托管标识”。

  2. 指定托管标识所在的位置。

  3. 不要为系统分配的托管标识分配范围,因为该范围将从分配范围继承而来。

在门户中设置用户分配的托管标识:

  1. 在“创建/编辑分配”视图的“修正”选项卡上的“托管标识类型”下,确保选中“用户分配的托管标识”。

  2. 指定托管标识的托管范围。 托管标识的范围不一定要等于分配的范围,但必须在同一租户中。

  3. 在“现有用户分配的标识”下,选择“托管标识”。

通过定义的角色向托管标识授予权限

重要

如果托管标识不具备执行所需修正任务所需的权限,则只能通过门户自动为其授予权限。 如果通过门户创建托管标识,则可以跳过此步骤。

对于所有其他方法,必须通过添加角色向分配的托管标识手动授予访问权限,否则修正部署将失败。

需要手动权限的示例方案:

  • 如果分配是通过 Azure 软件开发工具包 (SDK) 创建的
  • 如果 deployIfNotExists 或 modify 修改的资源在策略分配的范围之外
  • 如果模板访问策略分配范围之外的资源的属性

可以通过以下两种方法使用门户向分配的托管标识授予定义的角色:使用访问控制 (IAM),或通过编辑策略或计划分配并选择“保存”。

若要将角色添加到分配的托管标识,请按照下列步骤操作:

  1. 在 Azure 门户中选择“所有服务”,然后搜索并选择“策略”,启动 Azure Policy 服务 。

  2. 选择“Azure Policy”页左侧的“分配”。

  3. 找到具有托管标识的分配,并选择相应名称。

  4. 在编辑页上查找“Assignment ID”属性。 分配 ID 将类似于:

    /subscriptions/{subscriptionId}/resourceGroups/PolicyTarget/providers/Microsoft.Authorization/policyAssignments/2802056bfc094dfb95d4d7a5
    

    托管标识的名称是分配资源 ID 的最后一部分,本例为 2802056bfc094dfb95d4d7a5。 复制分配资源 ID 的这一部分。

  5. 导航到需要手动添加角色定义的资源或资源父容器(资源组、订阅、管理组)。

  6. 选择资源页中的“访问控制 (IAM)”链接,然后选择访问控制页顶部的“+ 添加角色分配” 。

  7. 从策略定义中选择与 roleDefinitionIds 匹配的合适角色。 将“分配访问权限至”设置保留为默认设置“Azure AD 用户、组或应用程序”。 在“选择”框中,粘贴或键入先前找到的分配资源 ID 部分。 完成搜索后,选择具有相同名称的对象来选择 ID,然后选择“保存”。

创建修正任务

在 Azure 门户中选择“所有服务”,然后搜索并选择“策略”,启动 Azure Policy 服务。

Screenshot of searching for Policy in All Services.

步骤 1:启动修正任务创建

可通过三种方法使用门户创建修正任务。

选项 1:从“修正”页创建修正任务

  1. 选择“Azure Policy”页左侧的“修正”。

    Screenshot of the Remediation node on the Policy page.

  2. 所有 deployIfNotExists 和 modify 策略分配都显示在“要修正的策略”选项卡上。选择资源不合规的一项以打开“新建修正任务”页面。

  3. 按照以下步骤指定修正任务详细信息

选项 2:从不合规的策略分配创建修正任务

  1. 选择“Azure Policy”页左侧的“合规性”。

  2. 选择包含 deployIfNotExists 或 modify 效果的不合规策略或计划分配。

  3. 选择页面顶部的“创建修正任务”按钮以打开“新建修正任务”页。

  4. 按照以下步骤指定修正任务详细信息

选项 3:在策略分配期间创建修正任务

如果要分配的策略或计划定义具有 deployIfNotExists 或 modify 效果,向导的“修正”选项卡会提供“创建修正任务”选项,该选项在策略分配的同时创建修正任务。

注意

这是创建修正任务的最简化的方法,支持在订阅上分配的策略。 对于在管理组上分配的策略,评估确定资源合规性后,应使用选项 1选项 2 创建修正任务。

  1. 在门户中的分配向导中,导航到“修正”选项卡。选中“创建修正任务”复选框。

  2. 如果从计划分配启动修正任务,请从下拉列表中选择要修正的策略。

  3. 配置托管标识并填写向导的其余部分。 创建分配时,将创建修正任务。

步骤 2:指定修正任务详细信息

仅当使用选项 1选项 2 启动修正任务创建时,此步骤才适用。

  1. 如果从计划分配启动修正任务,请从下拉列表中选择要修正的策略。 一次可以通过单个修正任务修正一个 deployIfNotExists 或 modify 策略。

  2. (可选)在该页上修改修正设置。 有关每个设置控制的内容的信息,请参阅修正任务结构

  3. 在相同页上,通过使用“范围”省略号从分配策略的位置选取子资源(包括下面的单个资源对象)来筛选要修正的资源。 此外,使用“位置”下拉列表来进一步筛选资源。

    Screenshot of the Remediate node and the grid of resources to remediate.

  4. 筛选资源后,通过选择“修正”来启动修正任务。 “策略符合性”页将打开到“修正任务”选项卡,以显示任务进度的状态。 由修正任务创建的部署将立即开始。

    Screenshot of the Remediation tasks tab and progress of existing remediation tasks.

步骤 3:跟踪修正任务进度

  1. 导航到“修正”页上的“修正任务”选项卡。 单击修正任务可查看有关所用筛选、当前状态和正在修正的资源列表的详细信息。

  2. 从“修正任务”详细信息页中,右键单击资源以查看修正任务的部署或资源。 在该行的末尾,选择“相关事件”以查看错误消息等详细信息。

    Screenshot of the context menu for a resource on the Remediate task tab.

通过“修正任务”部署的资源被添加到“策略分配详细信息”页面上的“已部署资源”选项卡中。

后续步骤