Share via


Autenticação entre registos numa tarefa do ACR com uma identidade gerida pelo Azure

Numa tarefa do ACR, pode ativar uma identidade gerida para recursos do Azure. A tarefa pode utilizar a identidade para aceder a outros recursos do Azure, sem ter de fornecer ou gerir credenciais.

Neste artigo, vai aprender a ativar uma identidade gerida numa tarefa para extrair uma imagem de um registo diferente da utilizada para executar a tarefa.

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

Scenario overview (Descrição geral do cenário)

A tarefa de exemplo extrai uma imagem de base de outro registo de contentor do Azure para criar e emitir uma imagem de aplicação. Para solicitar a imagem de base, configure a tarefa com uma identidade gerida e atribua-lhe as permissões adequadas.

Este exemplo mostra os passos com uma identidade gerida atribuída pelo utilizador ou atribuída pelo sistema. A sua escolha de identidade depende das necessidades da sua organização.

Num cenário real, uma organização pode manter um conjunto de imagens de base utilizadas por todas as equipas de desenvolvimento para criar as suas aplicações. Estas imagens de base são armazenadas num registo empresarial, com cada equipa de desenvolvimento a ter apenas direitos de solicitação.

Pré-requisitos

Para este artigo, precisa de dois registos de contentores do Azure:

  • Utilize o primeiro registo para criar e executar tarefas do ACR. Neste artigo, este registo tem o nome myregistry.
  • O segundo registo aloja uma imagem base utilizada para a tarefa criar uma imagem. Neste artigo, o segundo registo tem o nome mybaseregistry.

Substitua pelos seus próprios nomes de registo em passos posteriores.

Se ainda não tiver os registos de contentores do Azure necessários, veja Início Rápido: Criar um registo de contentor privado com a CLI do Azure. Ainda não precisa de enviar imagens para o registo.

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 de Docker Hub para o seu registo base. Na prática, outra equipa ou processo na organização pode manter imagens no registo base.

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

Definir passos de tarefa no ficheiro YAML

Os passos para esta tarefa de vários passos de exemplo são definidos num ficheiro YAML. Crie um ficheiro com o nome helloworldtask.yaml no seu diretório de trabalho local e cole os seguintes conteúdos. Atualize o valor de no passo de REGISTRY_NAME compilação com o nome do servidor do seu registo 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"]

O passo de compilação utiliza o Dockerfile-app ficheiro no repositório Azure-Samples/acr-build-helloworld-node para criar uma imagem. O --build-arg referencia o registo base para solicitar a imagem de base. Quando criada com êxito, a imagem é enviada para o registo utilizado para executar a tarefa.

Opção 1: Criar tarefa com a identidade atribuída pelo utilizador

Os passos nesta secção criam uma tarefa e permitem uma identidade atribuída pelo utilizador. Se quiser ativar uma identidade atribuída pelo sistema, consulte o artigo Opção 2: Criar tarefa com a identidade atribuída pelo sistema.

Criar uma identidade atribuída pelo utilizador

Crie uma identidade com o nome myACRTasksId na sua subscrição com o comando az identity create . Pode utilizar o mesmo grupo de recursos que utilizou anteriormente para criar um registo de contentor ou outro.

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

Para configurar a identidade atribuída pelo utilizador nos passos seguintes, utilize o comando az identity show para armazenar o ID de recurso da identidade, o ID principal e o ID de cliente 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 ao executar o seguinte comando az acr task create . A tarefa é executada sem um contexto de código fonte e o comando referencia o ficheiro helloworldtask.yaml no diretório de trabalho. O --assign-identity parâmetro transmite o ID de recurso da identidade atribuída pelo utilizador.

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

Na saída do comando, a identity secçã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 solicitação de identidade ao registo base

Nesta secção, atribua as permissões de identidade gerida para solicitar do registo base mybaseregistry.

Utilize o comando az acr show para obter o ID de recurso do registo base e armazená-lo numa variável:

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

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

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

Avance para Adicionar credenciais de registo de destino à tarefa.

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

Os passos nesta secção criam uma tarefa e permitem uma identidade atribuída pelo sistema. Se quiser ativar uma identidade atribuída pelo utilizador, consulte o artigo Opção 1: Criar tarefa com a identidade atribuída pelo utilizador.

Criar tarefa

Crie a tarefa helloworldtask ao executar o seguinte comando az acr task create . A tarefa é executada sem um contexto de código fonte e o comando referencia o ficheiro helloworldtask.yaml no diretório de trabalho. O --assign-identity parâmetro sem valor ativa 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 secção mostra que uma identidade do tipo SystemAssigned está 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",
[...]

Utilize o comando az acr task show para armazenar o principalId numa variável, para utilizar em comandos posteriores. Substitua o nome da tarefa e o registo no seguinte comando:

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

Conceder permissões de solicitação de identidade ao registo base

Nesta secção, atribua as permissões de identidade gerida para solicitar do registo base mybaseregistry.

Utilize o comando az acr show para obter o ID de recurso do registo base e armazená-lo numa variável:

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

Utilize o comando az role assignment create para atribuir a identidade a acrpull função ao registo 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 de registo de destino à tarefa

Agora, utilize o comando az acr task credential add para permitir que a tarefa seja autenticada com o registo base com as credenciais da identidade. Execute o comando correspondente ao tipo de identidade gerida que ativou na tarefa. Se tiver ativado uma identidade atribuída pelo utilizador, transmita --use-identity com o ID de cliente da identidade. Se tiver ativado uma identidade atribuída pelo sistema, transmita --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 ativou uma identidade gerida é 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 é 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 foi enviada com êxito para a myregistry:

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

Exemplo de saída:

cf10

Passos seguintes