使用 Azure Policy 分配托管标识(预览版)

Azure Policy 有助于强制执行组织标准并进行大规模的合规性评估。 通过其合规性仪表板,Azure Policy 提供了一个聚合视图,可帮助管理员评估环境的整体状态。 你可以向下钻取到“按资源”、“按策略”粒度。 它还通过对现有资源的批量修正以及对新资源的自动修正,帮助资源符合规范。 Azure Policy 的常见用例包括实施治理来满足以下方面的要求:

  • 资源一致性
  • 法规符合性
  • 安全性
  • 成本
  • 管理

Azure 环境中已经提供了这些常见用例的策略定义来帮助你入门。

Azure 监视代理需要受监视 Azure 虚拟机 (VM) 上的托管标识。 本文档介绍了 Microsoft 提供的内置 Azure Policy 的行为,该策略有助于确保将这些场景所需的托管标识大规模分配给 VM。

虽然可以使用系统分配的托管标识,但在大规模使用时(例如,对于订阅中的所有 VM),它会导致在 Microsoft Entra ID 中创建(和删除)大量标识。 为了避免这种标识变动,建议使用用户分配的托管标识,这些标识只需创建一次即可在多个 VM 之间共享。

策略定义和详细信息

执行时,策略将执行以下操作:

  1. 根据策略范围内的 VM,在订阅和每个 Azure 区域中创建一个新的内置用户分配托管标识(如果不存在)。
  2. 创建后,将一个锁放在用户分配的托管标识上,这样它就不会被意外删除。
  3. 根据策略范围内的 VM,将内置的用户分配托管标识分配到订阅和区域中的虚拟机。

注意

如果虚拟机已正好分配有 1 个用户分配的托管标识,则策略会跳过此 VM 来分配内置标识。 这是为了确保策略分配不会中断依赖于 IMDS 上令牌终结点的默认行为的应用程序。

有两种使用该策略的方案:

  • 让策略创建并使用“内置”的用户分配托管标识。
  • 自带用户分配的托管标识。

策略采用以下输入参数:

  • Bring-Your-Own-UAMI? - 策略是否应新建用户分配的托管标识(如果不存在)?
    • 如果设置为 true,则必须指定:
      • 托管标识的名称。
      • 包含托管标识的资源组。
    • 如果此参数设置为 false,则不需要其他输入。
      • 策略将在名为“built-in-identity-rg”的资源组中创建名为“built-in-identity”的所需用户分配托管标识。
  • Restrict-Bring-Your-Own-UAMI-To-Subscription? - 将 Bring-Your-Own-UAMI 参数设置为 true 时,策略是否应使用集中式用户分配的托管标识,还是为每个订阅使用一个标识?
    • 如果此参数设置为 true,则不需要其他输入。
      • 该策略将为每个订阅使用用户分配的托管标识。
    • 如果设置为 false,策略将使用单个集中用户分配的托管标识,该标识将应用于策略分配涵盖的所有订阅。 必须指定以下内容:
      • 用户分配的托管标识资源 ID

使用策略

创建策略分配

可将策略定义分配给 Azure 中的不同范围 - 在管理组订阅或特定资源组。 由于需要一直强制实施策略,因此会使用与策略分配对象关联的托管标识执行分配操作。 策略分配对象支持系统分配的托管标识和用户分配的托管标识。 例如,Joe 可以创建名为 PolicyAssignmentMI 的用户分配托管标识。 内置策略在具有策略分配范围内资源的每个订阅和每个区域中创建用户分配的托管标识。 策略创建的用户分配托管标识具有以下 resourceId 格式:

/subscriptions/your-subscription-id/resourceGroups/built-in-identity-rg/providers/Microsoft.ManagedIdentity/userAssignedIdentities/built-in-identity-{location}

例如:

/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/built-in-identity-rg/providers/Microsoft.ManagedIdentity/userAssignedIdentities/built-in-identity-ChinaNorth

所需的授权

若要使 PolicyAssignmentMI 托管标识能够在指定范围内分配内置策略,它需要以下权限(表示为 Azure RBAC(Azure 基于角色的访问控制)角色分配):

主体 角色/操作 范围 目的
PolicyAssigmentMI 托管的标识操作员 /subscription/subscription-id/resourceGroups/built-in-identity
OR
Bring-your-own-User-assinged-Managed identity
将内置标识分配给 VM 时是必需的。
PolicyAssigmentMI 参与者 /subscription/subscription-id> 创建包含订阅中内置托管标识的资源组时是必需的。
PolicyAssigmentMI 托管的标识参与者 /subscription/subscription-id/resourceGroups/built-in-identity 新建用户分配的托管标识时是必需的。
PolicyAssigmentMI 用户访问管理员 /subscription/subscription-id/resourceGroups/built-in-identity
OR
Bring-your-own-User-assigned-Managed identity
对策略创建的用户分配托管标识设置锁时是必需的。

由于策略分配对象必须提前具有此权限,因此,对于此方案,PolicyAssignmentMI 不能是系统分配的托管标识。 执行策略分配任务的用户必须提前使用上述角色分配为 PolicyAssignmentMI 预先授权。

如你所见,所需的最小特权角色是订阅范围内的“参与者”。

已知问题

如果有另一个部署要更改分配给 VM 的标识,那么随之可能产生的争用条件可能会导致意外结果。

如果有两个或更多个并行部署更新同一个虚拟机,并且它们都更改虚拟机的标识配置,则有可能在特定的争用条件下,所有预期的标识都不会分配给计算机。 例如,如果本文档中的策略正在更新某个 VM 的托管标识,同时另一个进程也在对托管标识部分进行更改,则不能保证所有预期的标识都正确分配给该 VM。

后续步骤