Partilhar via


Autenticação externa 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 que acessa segredos armazenados em um cofre de chaves do Azure.

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 lê as credenciais do Docker Hub armazenadas em um cofre de chaves do Azure. As credenciais são para uma conta do Docker Hub com permissões de gravação (push) em um repositório privado do Docker Hub. Para ler as credenciais, configure a tarefa com uma identidade gerenciada e atribua as permissões apropriadas a ela. A tarefa associada à identidade cria uma imagem e entra no Docker Hub para enviar a imagem para o repositório privado.

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 empresa pode publicar imagens em um repositório privado no Docker Hub como parte de um processo de compilação.

Pré-requisitos

Você precisa de um registro de contêiner do Azure no qual você executa a tarefa. Neste artigo, este registo chama-se myregistry. Substitua pelo seu próprio nome de registo em passos posteriores.

Se você ainda não tiver um registro de contêiner do Azure, 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.

Você também precisa de um repositório privado no Docker Hub e uma conta do Docker Hub com permissões para gravar no repositório. Neste exemplo, esse repositório é chamado hubuser/hubrepo.

Crie um cofre de chaves e armazene segredos

Primeiro, se você precisar, crie um grupo de recursos chamado myResourceGroup no local eastus com o seguinte comando az group create:

az group create --name myResourceGroup --location eastus

Use o comando az keyvault create para criar um cofre de chaves. Certifique-se de especificar um nome exclusivo do cofre de chaves.

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

Armazene as credenciais necessárias do Docker Hub no cofre de chaves usando o comando az keyvault secret set . Nestes comandos, os valores são passados 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

Em um cenário do mundo real, os segredos provavelmente seriam definidos e mantidos em um processo separado.

Definir etapas de tarefa no arquivo YAML

As etapas para esta tarefa de exemplo são definidas em um arquivo YAML. Crie um arquivo nomeado dockerhubtask.yaml em um diretório de trabalho local e cole o seguinte conteúdo. Certifique-se de substituir o nome do cofre de chaves no arquivo 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

As etapas da tarefa fazem o seguinte:

  • Gerencie credenciais secretas para autenticação com o Docker Hub.
  • Autentique-se com o Docker Hub passando os segredos para o docker login comando.
  • Crie uma imagem usando um Dockerfile de exemplo no repositório Azure-Samples/acr-tasks .
  • Envie a imagem para o repositório privado do Docker Hub.

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 dockerhubtask 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 dockerhubtask.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 \
  --name dockerhubtask \
  --registry myregistry \
  --context /dev/null \
  --file dockerhubtask.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 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 a seguir 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

Prossiga para Executar manualmente a 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 dockerhubtask 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 dockerhubtask.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 \
  --name dockerhubtask \
  --registry myregistry \
  --context /dev/null \
  --file dockerhubtask.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 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 a seguir 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 você habilitou uma identidade gerenciada é executada com êxito, acione manualmente a tarefa com o comando az acr task run . O --set parâmetro é usado para passar o nome do repositório privado para a tarefa. Neste exemplo, o nome do repositório de espaço reservado é 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 no Docker Hub, e a imagem é criada com êxito e enviada 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 por push, verifique a tag (cf24 neste exemplo) no repositório privado do Docker Hub.

Próximos passos