Partilhar via


Autenticação entre registros em uma tarefa ACR usando uma identidade gerenciada pelo Azure

Em uma tarefa ACR, você pode habilitar uma identidade gerenciada para recursos do Azure. A tarefa pode usar a identidade para acessar outros recursos do Azure, sem a necessidade de fornecer ou gerenciar credenciais.

Neste artigo, você aprenderá a habilitar uma identidade gerenciada em uma tarefa para extrair uma imagem de um registro diferente daquele usado para executar a tarefa.

Para criar os recursos do Azure, este artigo requer que você execute a CLI do Azure versão 2.0.68 ou posterior. Executar az --version para localizar a versão. Se precisar de instalar ou atualizar, veja Install Azure CLI (Instalar o Azure CLI).

Descrição geral do cenário

A tarefa de exemplo extrai uma imagem base de outro registro de contêiner do Azure para criar e enviar por push uma imagem de aplicativo. Para extrair a imagem base, configure a tarefa com uma identidade gerenciada e atribua as permissões apropriadas a ela.

Este exemplo mostra etapas usando uma identidade gerenciada atribuída pelo usuário ou pelo sistema. A sua escolha de identidade depende das necessidades da sua organização.

Em um cenário do mundo real, uma organização pode manter um conjunto de imagens base usadas por todas as equipes de desenvolvimento para criar seus aplicativos. Essas imagens base são armazenadas em um registro corporativo, com cada equipe de desenvolvimento tendo apenas direitos de pull.

Pré-requisitos

Para este artigo, você precisa de dois registros de contêiner do Azure:

  • Use o primeiro registro para criar e executar tarefas ACR. Neste artigo, este registo chama-se myregistry.
  • O segundo registro hospeda uma imagem base usada para a tarefa de criar uma imagem. Neste artigo, o segundo registro é chamado mybaseregistry.

Substitua por seus próprios nomes de registro em etapas posteriores.

Se você ainda não tiver os registros de contêiner do Azure necessários, consulte Guia de início rápido: criar um registro de contêiner privado usando a CLI do Azure. Você não precisa enviar imagens para o registro ainda.

Preparar o registo base

Para fins de demonstração, como uma operação única, execute [az acr import][az-acr-import] para importar uma imagem de Node.js pública do Docker Hub para seu registro base. Na prática, outra equipe ou processo na organização pode manter imagens no registro base.

az acr import --name mybaseregistry \
  --source docker.io/library/node:15-alpine \
  --image baseimages/node:15-alpine 

Definir etapas de tarefa no arquivo YAML

As etapas para este exemplo de tarefa de várias etapas são definidas em um arquivo YAML. Crie um arquivo nomeado helloworldtask.yaml em seu diretório de trabalho local e cole o conteúdo a seguir. Atualize o valor de na etapa de compilação com o nome do REGISTRY_NAME servidor do seu registro base.

version: v1.1.0
steps:
# Replace mybaseregistry with the name of your registry containing the base image
  - build: -t $Registry/hello-world:$ID  https://github.com/Azure-Samples/acr-build-helloworld-node.git#main -f Dockerfile-app --build-arg REGISTRY_NAME=mybaseregistry.azurecr.io
  - push: ["$Registry/hello-world:$ID"]

A etapa de compilação usa o Dockerfile-app arquivo no repositório Azure-Samples/acr-build-helloworld-node para criar uma imagem. O --build-arg faz referência ao registro base para extrair a imagem base. Quando criada com êxito, a imagem é enviada por push para o registro usado para executar a tarefa.

Opção 1: Criar tarefa com identidade atribuída pelo usuário

As etapas nesta seção criam uma tarefa e habilitam uma identidade atribuída pelo usuário. Se você quiser habilitar uma identidade atribuída ao sistema, consulte Opção 2: Criar tarefa com identidade atribuída ao sistema.

Criar uma identidade atribuída pelo utilizador

Crie uma identidade chamada myACRTasksId em sua assinatura usando o comando az identity create . Você pode usar o mesmo grupo de recursos usado anteriormente para criar um registro de contêiner ou um diferente.

az identity create \
  --resource-group myResourceGroup \
  --name myACRTasksId

Para configurar a identidade atribuída pelo usuário nas etapas a seguir, use o comando az identity show para armazenar o ID de recurso, o ID principal e o ID do cliente da identidade em variáveis.

# Get resource ID of the user-assigned identity
resourceID=$(az identity show \
  --resource-group myResourceGroup \
  --name myACRTasksId \
  --query id --output tsv)

# Get principal ID of the task's user-assigned identity
principalID=$(az identity show \
  --resource-group myResourceGroup \
  --name myACRTasksId \
  --query principalId --output tsv)

# Get client ID of the user-assigned identity
clientID=$(az identity show \
  --resource-group myResourceGroup \
  --name myACRTasksId \
  --query clientId --output tsv)

Criar tarefa

Crie a tarefa helloworldtask executando o seguinte comando az acr task create . A tarefa é executada sem um contexto de código-fonte e o comando faz referência ao arquivo helloworldtask.yaml no diretório de trabalho. O --assign-identity parâmetro passa a ID do recurso da identidade atribuída pelo usuário.

az acr task create \
  --registry myregistry \
  --name helloworldtask \
  --context /dev/null \
  --file helloworldtask.yaml \
  --assign-identity $resourceID

Na saída do comando, a identity seção mostra que a identidade do tipo UserAssigned está definida na tarefa:

[...]
"identity": {
    "principalId": null,
    "tenantId": null,
    "type": "UserAssigned",
    "userAssignedIdentities": {
      "/subscriptions/xxxxxxxx-d12e-4760-9ab6-xxxxxxxxxxxx/resourcegroups/myResourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myACRTasksId": {
        "clientId": "xxxxxxxx-f17e-4768-bb4e-xxxxxxxxxxxx",
        "principalId": "xxxxxxxx-1335-433d-bb6c-xxxxxxxxxxxx"
      }
[...]

Conceder permissões de pull de identidade ao registro base

Nesta seção, conceda à identidade gerenciada permissões para extrair do registro base, mybaseregistry.

Use o comando az acr show para obter o ID do recurso do registro base e armazená-lo em uma variável:

baseregID=$(az acr show --name mybaseregistry --query id --output tsv)

Use o comando az role assignment create para atribuir a identidade da acrpull função ao registro base. Esta função tem permissões apenas para extrair imagens do registo.

az role assignment create \
  --assignee $principalID \
  --scope $baseregID \
  --role acrpull

Prossiga para Adicionar credenciais do Registro de destino à tarefa.

Opção 2: Criar tarefa com identidade atribuída ao sistema

As etapas nesta seção criam uma tarefa e habilitam uma identidade atribuída ao sistema. Se você quiser habilitar uma identidade atribuída pelo usuário, consulte Opção 1: Criar tarefa com identidade atribuída pelo usuário.

Criar tarefa

Crie a tarefa helloworldtask executando o seguinte comando az acr task create . A tarefa é executada sem um contexto de código-fonte e o comando faz referência ao arquivo helloworldtask.yaml no diretório de trabalho. O --assign-identity parâmetro sem valor habilita a identidade atribuída pelo sistema na tarefa.

az acr task create \
  --registry myregistry \
  --name helloworldtask \
  --context /dev/null \
  --file helloworldtask.yaml \
  --assign-identity 

Na saída do comando, a identity seção mostra que uma identidade do tipo SystemAssigned é definida na tarefa. O principalId é o ID principal da identidade da tarefa:

[...]
  "identity": {
    "principalId": "xxxxxxxx-2703-42f9-97d0-xxxxxxxxxxxx",
    "tenantId": "xxxxxxxx-86f1-41af-91ab-xxxxxxxxxxxx",
    "type": "SystemAssigned",
    "userAssignedIdentities": null
  },
  "location": "eastus",
[...]

Use o comando az acr task show para armazenar o principalId em uma variável, para usar em comandos posteriores. Substitua o nome da sua tarefa e o seu registo no seguinte comando:

principalID=$(az acr task show \
  --name <task_name> --registry <registry_name> \
  --query identity.principalId --output tsv)

Conceder permissões de pull de identidade ao registro base

Nesta seção, conceda à identidade gerenciada permissões para extrair do registro base, mybaseregistry.

Use o comando az acr show para obter o ID do recurso do registro base e armazená-lo em uma variável:

baseregID=$(az acr show --name mybaseregistry --query id --output tsv)

Use o comando az role assignment create para atribuir a identidade da acrpull função ao registro base. Esta função tem permissões apenas para extrair imagens do registo.

az role assignment create \
  --assignee $principalID \
  --scope $baseregID \
  --role acrpull

Adicionar credenciais do Registro de destino à tarefa

Agora use o comando az acr task credential add para permitir que a tarefa se autentique com o registro base usando as credenciais da identidade. Execute o comando correspondente ao tipo de identidade gerenciada que você habilitou na tarefa. Se você habilitou uma identidade atribuída pelo usuário, passe --use-identity com a ID do cliente da identidade. Se você habilitou uma identidade atribuída ao sistema, passe --use-identity [system].

# Add credentials for user-assigned identity to the task
az acr task credential add \
  --name helloworldtask \
  --registry myregistry \
  --login-server mybaseregistry.azurecr.io \
  --use-identity $clientID

# Add credentials for system-assigned identity to the task
az acr task credential add \
  --name helloworldtask \
  --registry myregistry \
  --login-server mybaseregistry.azurecr.io \
  --use-identity [system]

Executar manualmente a tarefa

Para verificar se a tarefa na qual você habilitou uma identidade gerenciada é executada com êxito, acione manualmente a tarefa com o comando az acr task run .

az acr task run \
  --name helloworldtask \
  --registry myregistry

Se a tarefa for executada com êxito, a saída será semelhante a:

Queued a run with ID: cf10
Waiting for an agent...
2019/06/14 22:47:32 Using acb_vol_dbfbe232-fd76-4ca3-bd4a-687e84cb4ce2 as the home volume
2019/06/14 22:47:39 Creating Docker network: acb_default_network, driver: 'bridge'
2019/06/14 22:47:40 Successfully set up Docker network: acb_default_network
2019/06/14 22:47:40 Setting up Docker configuration...
2019/06/14 22:47:41 Successfully set up Docker configuration
2019/06/14 22:47:41 Logging in to registry: myregistry.azurecr.io
2019/06/14 22:47:42 Successfully logged into myregistry.azurecr.io
2019/06/14 22:47:42 Logging in to registry: mybaseregistry.azurecr.io
2019/06/14 22:47:43 Successfully logged into mybaseregistry.azurecr.io
2019/06/14 22:47:43 Executing step ID: acb_step_0. Timeout(sec): 600, Working directory: '', Network: 'acb_default_network'
2019/06/14 22:47:43 Scanning for dependencies...
2019/06/14 22:47:45 Successfully scanned dependencies
2019/06/14 22:47:45 Launching container with name: acb_step_0
Sending build context to Docker daemon   25.6kB
Step 1/6 : ARG REGISTRY_NAME
Step 2/6 : FROM ${REGISTRY_NAME}/baseimages/node:15-alpine
15-alpine: Pulling from baseimages/node
[...]
Successfully built 41b49a112663
Successfully tagged myregistry.azurecr.io/hello-world:cf10
2019/06/14 22:47:56 Successfully executed container: acb_step_0
2019/06/14 22:47:56 Executing step ID: acb_step_1. Timeout(sec): 600, Working directory: '', Network: 'acb_default_network'
2019/06/14 22:47:56 Pushing image: myregistry.azurecr.io/hello-world:cf10, attempt 1
The push refers to repository [myregistry.azurecr.io/hello-world]
[...]
2019/06/14 22:48:00 Step ID: acb_step_1 marked as successful (elapsed time in seconds: 2.517011)
2019/06/14 22:48:00 The following dependencies were found:
2019/06/14 22:48:00
- image:
    registry: myregistry.azurecr.io
    repository: hello-world
    tag: cf10
    digest: sha256:611cf6e3ae3cb99b23fadcd89fa144e18aa1b1c9171ad4a0da4b62b31b4e38d1
  runtime-dependency:
    registry: mybaseregistry.azurecr.io
    repository: baseimages/node
    tag: 15-alpine
    digest: sha256:e8e92cffd464fce3be9a3eefd1b65dc9cbe2484da31c11e813a4effc6105c00f
  git:
    git-head-revision: 0f988779c97fe0bfc7f2f74b88531617f4421643

Run ID: cf10 was successful after 32s

Execute o comando az acr repository show-tags para verificar se a imagem foi criada e enviada com sucesso para myregistry:

az acr repository show-tags --name myregistry --repository hello-world --output tsv

Saída de exemplo:

cf10

Próximos passos