Share via


Autenticação externa 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 que acede a segredos armazenados num cofre de chaves do Azure.

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 lê Docker Hub credenciais armazenadas num cofre de chaves do Azure. As credenciais destinam-se a uma conta Docker Hub com permissões de escrita (push) para um repositório de Docker Hub privado. Para ler as credenciais, configure a tarefa com uma identidade gerida e atribua-lhe as permissões adequadas. A tarefa associada à identidade cria uma imagem e inicia sessão em Docker Hub para enviar a imagem para o repositório privado.

Este exemplo mostra os passos que utilizam 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 empresa pode publicar imagens num repositório privado no Docker Hub como parte de um processo de compilação.

Pré-requisitos

Precisa de um registo de contentor do Azure no qual execute a tarefa. Neste artigo, este registo tem o nome myregistry. Substitua pelo seu próprio nome de registo em passos posteriores.

Se ainda não tiver um registo de contentor do Azure, 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.

Também precisa de um repositório privado no Docker Hub e de uma conta Docker Hub com permissões para escrever no repositório. Neste exemplo, este repositório tem o nome hubuser/hubrepo.

Criar um cofre de chaves e armazenar segredos

Primeiro, se for necessário, crie um grupo de recursos com o nome myResourceGroup na localização eastus com o seguinte comando az group create :

az group create --name myResourceGroup --location eastus

Utilize o comando az keyvault create para criar um cofre de chaves. Certifique-se de que especifica um nome de cofre de chaves exclusivo.

az keyvault create --name mykeyvault --resource-group myResourceGroup --location eastus

Armazene as credenciais de Docker Hub necessárias no cofre de chaves com o comando az keyvault secret set. Nestes comandos, os valores são transmitidos em variáveis de ambiente:

# Store Docker Hub user name
az keyvault secret set \
  --name UserName \
  --value $USERNAME \
  --vault-name mykeyvault

# Store Docker Hub password
az keyvault secret set \
  --name Password \
  --value $PASSWORD \
  --vault-name mykeyvault

Num cenário real, os segredos seriam provavelmente definidos e mantidos num processo separado.

Definir passos de tarefa no ficheiro YAML

Os passos para esta tarefa de exemplo são definidos num ficheiro YAML. Crie um ficheiro com o nome dockerhubtask.yaml num diretório de trabalho local e cole os seguintes conteúdos. Certifique-se de que substitui o nome do cofre de chaves no ficheiro pelo nome do cofre de chaves.

version: v1.1.0
# Replace mykeyvault with the name of your key vault
secrets:
  - id: username
    keyvault: https://mykeyvault.vault.azure.net/secrets/UserName
  - id: password
    keyvault: https://mykeyvault.vault.azure.net/secrets/Password
steps:
# Log in to Docker Hub
  - cmd: bash echo '{{.Secrets.password}}' | docker login --username '{{.Secrets.username}}' --password-stdin 
# Build image
  - build: -t {{.Values.PrivateRepo}}:$ID https://github.com/Azure-Samples/acr-tasks.git -f hello-world.dockerfile
# Push image to private repo in Docker Hub
  - push:
    - {{.Values.PrivateRepo}}:$ID

Os passos da tarefa fazem o seguinte:

  • Gerir credenciais secretas para autenticar com Docker Hub.
  • Autentique com Docker Hub ao transmitir os segredos para o docker login comando .
  • Crie uma imagem com um dockerfile de exemplo no repositório Azure-Samples/acr-tasks .
  • Envie a imagem para o repositório de Docker Hub privado.

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

Os passos nesta secção criam uma tarefa e ativam 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, o ID do principal e o ID de 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 dockerhubtask 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 dockerhubtask.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 \
  --name dockerhubtask \
  --registry myregistry \
  --context /dev/null \
  --file dockerhubtask.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 acesso de identidade ao cofre de chaves

Execute o seguinte comando az keyvault set-policy para definir uma política de acesso no cofre de chaves. O exemplo seguinte permite que a identidade leia segredos do cofre de chaves.

az keyvault set-policy --name mykeyvault \
  --resource-group myResourceGroup \
  --object-id $principalID \
  --secret-permissions get

Avance para Executar manualmente a tarefa.

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

Os passos nesta secção criam uma tarefa e ativam 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 dockerhubtask 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 dockerhubtask.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 \
  --name dockerhubtask \
  --registry myregistry \
  --context /dev/null \
  --file dockerhubtask.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 do registo pelo seguinte comando:

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

Conceder acesso de identidade ao cofre de chaves

Execute o seguinte comando az keyvault set-policy para definir uma política de acesso no cofre de chaves. O exemplo seguinte permite que a identidade leia segredos do cofre de chaves.

az keyvault set-policy --name mykeyvault \
  --resource-group myResourceGroup \
  --object-id $principalID \
  --secret-permissions get

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 . O --set parâmetro é utilizado para transmitir o nome do repositório privado para a tarefa. Neste exemplo, o nome do repositório do marcador de posição é hubuser/hubrepo.

az acr task run --name dockerhubtask --registry myregistry --set PrivateRepo=hubuser/hubrepo

Quando a tarefa é executada com êxito, a saída mostra a autenticação bem-sucedida para Docker Hub e a imagem é compilada e enviada com êxito para o repositório privado:

Queued a run with ID: cf24
Waiting for an agent...
2019/06/20 18:05:55 Using acb_vol_b1edae11-30de-4f2b-a9c7-7d743e811101 as the home volume
2019/06/20 18:05:58 Creating Docker network: acb_default_network, driver: 'bridge'
2019/06/20 18:05:58 Successfully set up Docker network: acb_default_network
2019/06/20 18:05:58 Setting up Docker configuration...
2019/06/20 18:05:59 Successfully set up Docker configuration
2019/06/20 18:05:59 Logging in to registry: myregistry.azurecr.io
2019/06/20 18:06:00 Successfully logged into myregistry.azurecr.io
2019/06/20 18:06:00 Executing step ID: acb_step_0. Timeout(sec): 600, Working directory: '', Network: 'acb_default_network'
2019/06/20 18:06:00 Launching container with name: acb_step_0
[...]
Login Succeeded
2019/06/20 18:06:02 Successfully executed container: acb_step_0
2019/06/20 18:06:02 Executing step ID: acb_step_1. Timeout(sec): 600, Working directory: '', Network: 'acb_default_network'
2019/06/20 18:06:02 Scanning for dependencies...
2019/06/20 18:06:04 Successfully scanned dependencies
2019/06/20 18:06:04 Launching container with name: acb_step_1
Sending build context to Docker daemon    129kB
[...]
2019/06/20 18:06:07 Successfully pushed image: hubuser/hubrepo:cf24
2019/06/20 18:06:07 Step ID: acb_step_0 marked as successful (elapsed time in seconds: 2.064353)
2019/06/20 18:06:07 Step ID: acb_step_1 marked as successful (elapsed time in seconds: 2.594061)
2019/06/20 18:06:07 Populating digests for step ID: acb_step_1...
2019/06/20 18:06:09 Successfully populated digests for step ID: acb_step_1
2019/06/20 18:06:09 Step ID: acb_step_2 marked as successful (elapsed time in seconds: 2.743923)
2019/06/20 18:06:09 The following dependencies were found:
2019/06/20 18:06:09
- image:
    registry: registry.hub.docker.com
    repository: hubuser/hubrepo
    tag: cf24
    digest: sha256:92c7f9c92844bbbb5d0a101b22f7c2a7949e40f8ea90c8b3bc396879d95e899a
  runtime-dependency:
    registry: registry.hub.docker.com
    repository: library/hello-world
    tag: latest
    digest: sha256:0e11c388b664df8a27a901dce21eb89f11d8292f7fca1b3e3c4321bf7897bffe
  git:
    git-head-revision: b0ffa6043dd893a4c75644c5fed384c82ebb5f9e

Run ID: cf24 was successful after 15s

Para confirmar se a imagem foi enviada, verifique a etiqueta (cf24neste exemplo) no repositório de Docker Hub privado.

Passos seguintes