Compartilhar via

在 ACR 任务中使用 Azure 托管标识

ACR 任务 中为 Azure 资源启用 托管身份,这样任务就可以访问其他 Azure 资源,而无需提供或管理凭据。 例如,使用托管标识可让某个任务步骤将容器映像提取或推送到其他注册表。

本文介绍如何使用Azure CLI在 ACR 任务上启用用户分配或系统分配的托管标识。 可以使用Azure CLI的本地安装。 若要在本地使用 Azure CLI,需要安装 2.0.68 或更高版本。 运行 az --version 即可查找版本。 如果需要安装或升级,请参阅 Install Azure CLI

为了进行说明,本文中的示例命令使用 az acr task create 创建一个基本映像生成任务,该任务启用了托管标识。 有关使用托管标识从 ACR 任务访问受保护资源的示例方案,请参阅:

为什么使用托管标识?

Azure资源的托管标识为选定的Azure服务在Microsoft Entra ID中提供自动管理的标识。 可以使用托管标识配置 ACR 任务,以便任务可以访问其他受保护的Azure资源,而无需在任务步骤中传递凭据。

托管身份有两种类型:

  • 用户分配的标识:可将其分配给多个资源,并保留任意长的时间。

  • 系统分配的标识:特定资源(例如 ACR 任务)的唯一标识,其保留时间与该资源的生存期相同。

可以在 ACR 任务中启用上述一种或两种标识。 可以为身份授予对其他资源的访问权限,就像对任何安全主体所做的那样。 任务运行时,将使用标识来访问任何需要访问权限的任务步骤中的资源。

使用托管标识的步骤

请遵循以下高层次步骤将托管标识与 ACR 任务配合使用。

1.(可选)创建用户分配的标识

如果计划使用用户分配的标识,请使用现有标识,或使用Azure CLI或其他Azure工具创建标识。 例如,使用 az identity create 命令。

如果你打算只使用系统分配的标识,请跳过此步骤。 你将在创建 ACR 任务时创建系统分配的标识。

2. 在 ACR 任务中启用身份

创建 ACR 任务时,可以选择性地启用用户分配的标识和/或系统分配的标识。 例如,在Azure CLI中运行 --assign-identity 命令时,传递 参数。

若要启用系统分配的标识,请传递不带任何值或带 --assign-identity 值的 assign-identity [system]。 以下示例命令从公共GitHub存储库创建 Linux 任务,该存储库生成 hello-world 映像并启用系统分配的托管标识:

az acr task create \
    --image hello-world:{{.Run.ID}} \
    --name hello-world --registry MyRegistry \
    --context https://github.com/Azure-Samples/acr-build-helloworld-node.git#main \
    --file Dockerfile \
    --commit-trigger-enabled false \
    --assign-identity

若要启用用户分配的标识,请传递带有标识资源 ID 值的 --assign-identity 以下示例命令从公共GitHub存储库创建 Linux 任务,该存储库生成 hello-world 映像并启用用户分配的托管标识:

az acr task create \
    --image hello-world:{{.Run.ID}} \
    --name hello-world --registry MyRegistry \
    --context https://github.com/Azure-Samples/acr-build-helloworld-node.git#main \
    --file Dockerfile \
    --commit-trigger-enabled false
    --assign-identity <resourceID>

可以运行 az identity show 命令来获取标识的资源 ID。 资源组 myResourceGroup 中 ID myUserAssignedIdentity 对应的资源 ID 格式如下:

"/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourcegroups/myResourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myUserAssignedIdentity"

注释

如果您使用启用了 ABAC 的源注册表,必须显式附加和设置托管标识,该标识将由任务使用,通过使用新--source-acr-auth-id标志与启用了 ABAC 的源注册表进行身份验证。 之后,必须执行单独的角色分配(具有可选 ABAC 条件),才能向已启用 ABAC 的源注册表授予此标识权限。

有关详细信息,请参阅 在 ACR 任务、快速任务、快速生成和快速运行上启用 ABAC 的效果

3.授予标识权限以访问其他Azure资源

根据任务的要求,授予标识权限以访问其他Azure资源。 示例包括:

  • 将托管标识分配给 Azure 中的目标容器注册表,并赋予其拉取、推送或其他权限。 有关注册表角色的完整列表,请参阅 Azure Container Registry Entra 权限和角色概述
  • 为托管标识分配角色以读取“Azure 密钥保管库”中的密钥。

使用 Azure CLI 或其他Azure工具管理对资源的基于角色的访问。 例如,运行 az role assignment create 命令为标识分配对资源的角色。

以下示例将为托管身份分配从容器注册表中拉取的权限。 此命令指定了该任务标识的主体 ID 以及目标注册表的资源 ID

在角色分配中使用的正确角色取决于注册表是否已启用 ABAC

ROLE="Container Registry Repository Reader" # For ABAC-enabled registries. For non-ABAC registries, use AcrPull.
az role assignment create \
  --assignee <principalID> \
  --scope <registryID> \
  --role "$ROLE"

4.(可选)将凭据添加到任务

如果你的任务需要使用凭据来拉取映像或将其推送到另一个自定义注册表,或者访问其他资源,请向该任务添加凭据。 运行 az acr task credential add 命令来添加凭据,传递 --use-identity 参数来指示此标识可以访问凭据。

例如,若要添加系统分配标识的凭据,以便使用 Azure 容器注册表targetregistry进行身份验证,请传递 use-identity [system]

az acr task credential add \
    --name helloworld \
    --registry myregistry \
    --login-server targetregistry.azurecr.cn \
    --use-identity [system]

若要添加用户分配的标识的凭据以便在注册表 targetregistry 中进行身份验证,请传递带有标识use-identity 值的 。 例如:

az acr task credential add \
    --name helloworld \
    --registry myregistry \
    --login-server targetregistry.azurecr.cn \
    --use-identity <clientID>

可以运行 az identity show 命令来获取标识的客户端 ID。 客户端 ID 是采用 xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx 格式的 GUID。

5.运行任务

使用托管身份配置任务后,运行该任务。 例如,若要测试本文中创建的任务之一,请使用 az acr task run 命令手动触发该任务。 如果配置了其他自动化任务触发器,则该任务会在自动触发时运行。

后续步骤

本文已介绍如何在 ACR 任务中启用和使用用户分配的或系统分配的托管标识。 有关使用托管标识从 ACR 任务访问受保护资源的方案,请参阅: