Autenticazione esterna in un'attività del Registro Azure Container con un'identità gestita da Azure
In un'attività del Registro Azure Container è possibile abilitare un'identità gestita per le risorse di Azure. L'attività può usare l'identità per accedere ad altre risorse di Azure, senza la necessità di specificare o gestire credenziali.
Questo articolo illustra come abilitare un'identità gestita in un'attività che accede a segreti archiviati in un insieme di credenziali delle chiavi di Azure.
Per creare le risorse di Azure, questo articolo richiede che venga eseguita l'interfaccia della riga di comando di Azure versione 2.0.68 o successiva. Eseguire az --version
per trovare la versione. Se è necessario eseguire l'installazione o l'aggiornamento, vedere Installare l'interfaccia della riga di comando di Azure.
Panoramica dello scenario
L'attività di esempio legge le credenziali dell'hub Docker archiviate in un insieme di credenziali delle chiavi di Azure. Le credenziali sono associate a un account dell'hub Docker con autorizzazioni di scrittura (push) in un repository dell'hub Docker privato. Per leggere le credenziali, configurare l'attività con un'identità gestita e assegnarle le autorizzazioni appropriate. L'attività associata all'identità compila un'immagine e accede all'hub Docker per eseguire il push dell'immagine nel repository privato.
Questo esempio illustra i passaggi con un'identità gestita assegnata dall'utente o dal sistema. La scelta dell'identità dipende dalle esigenze della propria organizzazione.
In uno scenario reale, un'azienda potrebbe pubblicare immagini in un repository privato nell'hub Docker come parte di un processo di compilazione.
Prerequisiti
Si necessiterà di un registro Azure Container in cui eseguire l'attività. In questo articolo questo registro è denominato myregistry. Sostituire i nomi dei registri con i propri valori nei passaggi successivi.
Se non si dispone già un registro Azure Container, vedere Avvio rapido: creare un registro contenitori privato usando l'interfaccia della riga di comando di Azure. Non è ancora necessario eseguire il push delle immagini nel registro.
SI necessita anche di un repository privato nell'hub Docker e un account dell'hub Docker con le autorizzazioni per la scrittura nel repository. In questo esempio, questo repository è denominato hubuser/hubrepo.
Creare un insieme di credenziali delle chiavi e archiviare segreti
Per iniziare, creare (se necessario) un gruppo di risorse denominato myResourceGroup nell'area eastus con il comando az group create seguente:
az group create --name myResourceGroup --location eastus
Per creare un insieme di credenziali delle chiavi usare il comando az keyvault create. Assicurarsi di specificare un nome univoco per l'insieme di credenziali delle chiavi.
az keyvault create --name mykeyvault --resource-group myResourceGroup --location eastus
Archiviare le credenziali dell'hub Docker necessarie nell'insieme di credenziali delle chiavi usando il comando az keyvault secret set. In questi comandi, i valori vengono passati in variabili di 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
In uno scenario reale, è probabile che i segreti vengano impostati e gestiti in un processo diverso.
Definire i passaggi dell'attività nel file YAML
I passaggi per questa attività di esempio vengono definiti in un file YAML. Creare un file denominato dockerhubtask.yaml
in una directory di lavoro locale e incollare il contenuto seguente. Assicurarsi di sostituire il nome dell'insieme di credenziali delle chiavi nel file con il nome del proprio insieme di credenziali delle chiavi.
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
I passaggi dell'attività eseguono le operazioni seguenti:
- Gestiscono le credenziali segrete per l'autenticazione con Docker Hub.
- Eseguono l'autenticazione con l'hub Docker passando i segreti al comando
docker login
. - Creano un'immagine usando un Dockerfile di esempio nel repository Azure-Samples/acr-tasks.
- Eseguono il push dell'immagine nel repository privato dell'hub Docker.
Opzione 1: creare un'attività con l'identità assegnata dall'utente
I passaggi di questa sezione creano un'attività e abilitano un'identità assegnata dall'utente. Se si vuole invece abilitare un'identità assegnata dal sistema, vedere Opzione 2: Creare un'attività con identità assegnata dal sistema.
Creare un'identità assegnata dall'utente
Creare un'identità denominata myACRTasksId nella sottoscrizione usando il comando az identity create. È possibile usare lo stesso gruppo di risorse usato in precedenza per creare il registro contenitori oppure uno diverso.
az identity create \
--resource-group myResourceGroup \
--name myACRTasksId
Per configurare l'identità nei passaggi seguenti, usare il comando az identity show per archiviare l'ID risorsa, l'ID entità e l'ID client in variabili.
# 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)
Crea attività
Creare l'attività dockerhubtask eseguendo il comando az acr task create seguente. L'attività viene eseguita senza un contesto del codice sorgente e il comando fa riferimento al file dockerhubtask.yaml
nella directory di lavoro. Il parametro --assign-identity
passa l'ID risorsa dell'identità assegnata dall'utente.
az acr task create \
--name dockerhubtask \
--registry myregistry \
--context /dev/null \
--file dockerhubtask.yaml \
--assign-identity $resourceID
Nell'output del comando la sezione identity
mostra che nell'attività è impostata l'identità di tipo UserAssigned
:
[...]
"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"
}
[...]
Concedere l'accesso all'identità all'insieme di credenziali delle chiavi
Eseguire il comando az keyvault set-policy seguente per impostare un criterio di accesso nell'insieme di credenziali delle chiavi. L'esempio seguente consente all'identità di leggere segreti dall'insieme di credenziali delle chiavi.
az keyvault set-policy --name mykeyvault \
--resource-group myResourceGroup \
--object-id $principalID \
--secret-permissions get
Procedere con l’Esecuzione manuale dell'attività.
Opzione 2: creare un'attività con identità assegnata dal sistema
I passaggi di questa sezione creano un'attività e abilitano un'identità assegnata dal sistema. Se invece si vuole abilitare un'identità assegnata dall'utente, vedere Opzione 1: Creare un'attività con identità assegnata dall'utente.
Crea attività
Creare l'attività dockerhubtask eseguendo il comando az acr task create seguente. L'attività viene eseguita senza un contesto del codice sorgente e il comando fa riferimento al file dockerhubtask.yaml
nella directory di lavoro. Il parametro --assign-identity
senza valori abilita l'identità gestita assegnata dal sistema nell'attività.
az acr task create \
--name dockerhubtask \
--registry myregistry \
--context /dev/null \
--file dockerhubtask.yaml \
--assign-identity
Nell'output del comando la sezione identity
mostra che nell'attività è impostata l'identità di tipo SystemAssigned
. principalId
è l'ID entità dell'identità dell'attività:
[...]
"identity": {
"principalId": "xxxxxxxx-2703-42f9-97d0-xxxxxxxxxxxx",
"tenantId": "xxxxxxxx-86f1-41af-91ab-xxxxxxxxxxxx",
"type": "SystemAssigned",
"userAssignedIdentities": null
},
"location": "eastus",
[...]
Usare il comando az acr task show per archiviare il valore di principalId in una variabile, da usare nei comandi successivi. Sostituire il nome dell'attività e del registro con i propri valori nel comando seguente:
principalID=$(az acr task show \
--name <task_name> --registry <registry_name> \
--query identity.principalId --output tsv)
Concedere l'accesso all'identità all'insieme di credenziali delle chiavi
Eseguire il comando az keyvault set-policy seguente per impostare un criterio di accesso nell'insieme di credenziali delle chiavi. L'esempio seguente consente all'identità di leggere segreti dall'insieme di credenziali delle chiavi.
az keyvault set-policy --name mykeyvault \
--resource-group myResourceGroup \
--object-id $principalID \
--secret-permissions get
Eseguire manualmente l'attività
Per verificare che l'attività in cui è stata abilitata un'identità gestita venga eseguita correttamente, attivarla manualmente con il comando az acr task run. Il parametro --set
viene usato per passare il nome del repository privato all'attività. In questo esempio, il nome del repository segnaposto è hubuser/hubrepo.
az acr task run --name dockerhubtask --registry myregistry --set PrivateRepo=hubuser/hubrepo
Quando l'attività viene eseguita correttamente, l'output mostra l'autenticazione riuscita nell'hub Docker e l'immagine viene compilata ed eseguita correttamente nel repository privato:
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
Per verificare che il push dell'immagine sia stato eseguito, verificare la presenza del tag (cf24
in questo esempio) nel repository privato dell'hub Docker.