Usare un'identità gestita di Azure per eseguire l'autenticazione a un Registro Azure Container

Usare un'identità gestita per le risorse di Azure per eseguire l'autenticazione a un Registro Azure Container da un'altra risorsa di Azure, senza dover fornire o gestire le credenziali del registro. Ad esempio, configurare un'identità gestita assegnata dall'utente o dal sistema in una macchina virtuale Linux per accedere alle immagini del contenitore dal registro contenitori, con la stessa facilità con cui si usa un registro pubblico. In alternativa, configurare un cluster servizio Azure Kubernetes per usare la relativa identità gestita per eseguire il pull delle immagini del contenitore da Registro Azure Container per le distribuzioni di pod.

L'articolo fornisce altre informazioni sulle identità gestite e spiega come:

  • Abilitare un'identità assegnata dall'utente o dal sistema in una macchina virtuale di Azure
  • Concedere all'identità l'accesso al Registro Azure Container
  • Usare l'identità gestita per accedere al registro e per eseguire il pull di un'immagine del contenitore

Per creare risorse di Azure, questo articolo richiede che sia eseguita l'interfaccia della riga di comando di Azure versione 2.0.55 o successive. 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.

Per configurare un registro contenitori ed eseguire il push di un'immagine del contenitore su di esso, è necessario disporre anche di un Docker installato localmente. Docker offre pacchetti che consentono di configurare facilmente Docker in qualsiasi sistema macOS, Windows o Linux.

Perché usare un'identità gestita?

Se non si ha familiarità con la funzionalità delle identità gestite per le risorse di Azure, vedere questa panoramica.

Dopo aver configurato le risorse di Azure selezionate con un'identità gestita, assegnare all'identità l'accesso desiderato a un'altra risorsa, proprio come qualsiasi entità di sicurezza. Ad esempio, assegnare a un'identità gestita un ruolo con pull, push e pull o altre autorizzazioni a un registro privato in Azure. Per un elenco completo dei ruoli del Registro di sistema, vedere Registro Azure Container ruoli e autorizzazioni. È possibile concedere a un'identità l'accesso a una o più risorse.

Usare quindi l'identità per eseguire l'autenticazione a qualsiasi servizio che supporti l'autenticazione di Microsoft Entra, senza credenziali nel codice. Scegliere come eseguire l'autenticazione usando l'identità gestita, a seconda dello scenario. Per usare l'identità per accedere a un Registro Azure Container da una macchina virtuale, eseguire l'autenticazione con Azure Resource Manager.

Creare un registro contenitori

Se non si ha già un Registro Azure Container, creare un registro ed eseguire il push di un'immagine del contenitore di esempio su di esso. Per la procedura, vedere Avvio rapido: Creare un registro contenitori privato usando l'interfaccia della riga di comando di Azure.

Questo articolo presuppone che l'immagine del contenitore aci-helloworld:v1 sia archiviata nel registro. Gli esempi usano il nome di registro myContainerRegistry. Sostituirlo con i nomi del proprio registro e della propria immagine nei passaggi successivi.

Creare una macchina virtuale abilitata per Docker

Creare una macchina virtuale Ubuntu abilitata per Docker. È inoltre necessario installare l'interfaccia della riga di comando di Azure nella macchina virtuale. Se si dispone già di una macchina virtuale di Azure, ignorare questo passaggio per creare la macchina virtuale.

Distribuire una macchina virtuale di Azure Ubuntu predefinita con az vm create. L'esempio seguente crea una macchina virtuale denominata myDockerVM nel gruppo di risorse esistente denominato myResourceGroup:

az vm create \
    --resource-group myResourceGroup \
    --name myDockerVM \
    --image Ubuntu2204 \
    --admin-username azureuser \
    --generate-ssh-keys

Per creare la macchina virtuale sono necessari alcuni minuti. Dopo aver eseguito il comando, prendere nota del publicIpAddress visualizzato dall'interfaccia della riga di comando di Azure. Usare questo indirizzo per stabilire connessioni SSH alla macchina virtuale.

Installare Docker nella macchina virtuale

Una volta che la macchina virtuale è in esecuzione, stabilire una connessione SSH alla macchina virtuale. Sostituire publicIpAddress con l'indirizzo IP pubblico della macchina virtuale.

ssh azureuser@publicIpAddress

Eseguire il comando seguente per installare Docker nella macchina virtuale:

sudo apt update
sudo apt install docker.io -y

Dopo l'installazione, eseguire il comando seguente per verificare la corretta esecuzione di Docker nella macchina virtuale:

sudo docker run -it mcr.microsoft.com/hello-world
Hello from Docker!
This message shows that your installation appears to be working correctly.
[...]

Installare l'interfaccia della riga di comando di Azure

Seguire i passaggi descritti in Installare l'interfaccia della riga di comando di Azure con APT per installare l'interfaccia della riga di comando di Azure nella macchina virtuale Ubuntu. Per questo articolo, assicurarsi di installare la versione 2.0.55 o successive.

Chiudere la sessione SSH.

Esempio 1: Accesso con un'identità assegnata dall'utente

Creare un'identità

Creare un'identità nella sottoscrizione usando il comando az identity create. È possibile usare lo stesso gruppo di risorse usato in precedenza per creare il registro contenitori o la macchina virtuale, o un altro gruppo di risorse.

az identity create --resource-group myResourceGroup --name myACRId

Per configurare l'identità nei passaggi seguenti, usare il comando az identity show per archiviare l'ID risorsa dell'identità e l'ID dell'entità servizio nelle variabili.

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

# Get service principal ID of the user-assigned identity
spID=$(az identity show --resource-group myResourceGroup --name myACRId --query principalId --output tsv)

Poiché è necessario l'ID dell'identità in un passaggio successivo quando si accede all'interfaccia della riga di comando dalla macchina virtuale, mostrare il valore:

echo $userID

L'ID è nel formato:

/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxx/resourcegroups/myResourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myACRId

Configurare la macchina virtuale con l'identità

Il comando az vm identity assign seguente configura la macchina virtuale Docker con l'identità assegnata dall'utente:

az vm identity assign --resource-group myResourceGroup --name myDockerVM --identities $userID

Concedere all'identità l'accesso al registro contenitori

Configurare ora l'identità per accedere al registro contenitori. Innanzitutto usare il comando az acr show per ottenere l'ID risorsa del registro:

resourceID=$(az acr show --resource-group myResourceGroup --name myContainerRegistry --query id --output tsv)

Usare il comando az role assignment create per assegnare il ruolo AcrPull all'identità. Questo ruolo offre autorizzazioni pull al registro. Per fornire autorizzazioni pull e push, assegnare il ruolo AcrPush.

az role assignment create --assignee $spID --scope $resourceID --role acrpull

Usare l'identità per accedere al registro

SSH nella macchina virtuale Docker che è configurato con l'identità. Eseguire i comandi seguenti dell'interfaccia della riga di comando di Azure, tramite l'interfaccia della riga di comando di Azure installata nella macchina virtuale.

Prima di tutto, eseguire l'autenticazione all'interfaccia della riga di comando di Azure con az login usando l'identità configurata nella macchina virtuale. Per <userID>, sostituire l'ID dell'identità recuperato in un passaggio precedente.

az login --identity --username <userID>

Eseguire quindi l'autenticazione nel Registro di sistema con az acr login. Quando si usa questo comando, l'interfaccia della riga di comando usa il token di Active Directory creato durante l'esecuzione di az login per l'autenticazione della sessione con il registro contenitori. (A seconda della configurazione della macchina virtuale, potrebbe essere necessario eseguire questo comando e i comandi di Docker con sudo.)

az acr login --name myContainerRegistry

Dovrebbe essere visualizzato il messaggio Login succeeded. È quindi possibile eseguire i comandi docker senza fornire credenziali. Ad esempio, eseguire docker pull per eseguire il pull dell'immagine aci-helloworld:v1, specificando il nome del server di accesso del registro. Il nome del server di accesso è costituito dal nome del registro contenitori (solo lettere minuscole) seguito da .azurecr.io, ad esempio mycontainerregistry.azurecr.io.

docker pull mycontainerregistry.azurecr.io/aci-helloworld:v1

Esempio 2: Accesso con un'identità assegnata dal sistema

Configurare la macchina virtuale con un'identità gestita dal sistema

Il comando az vm identity assign seguente configura la macchina virtuale Docker con un'identità assegnata dal sistema:

az vm identity assign --resource-group myResourceGroup --name myDockerVM

Usare il comando az vm show per impostare una variabile sul valore di principalId (l'ID dell'entità servizio) dell'identità della macchina virtuale per usarla nei passaggi successivi.

spID=$(az vm show --resource-group myResourceGroup --name myDockerVM --query identity.principalId --out tsv)

Concedere all'identità l'accesso al registro contenitori

Configurare ora l'identità per accedere al registro contenitori. Innanzitutto usare il comando az acr show per ottenere l'ID risorsa del registro:

resourceID=$(az acr show --resource-group myResourceGroup --name myContainerRegistry --query id --output tsv)

Usare il comando az role assignment create per assegnare il ruolo AcrPull all'identità. Questo ruolo offre autorizzazioni pull al registro. Per fornire autorizzazioni pull e push, assegnare il ruolo AcrPush.

az role assignment create --assignee $spID --scope $resourceID --role acrpull

Usare l'identità per accedere al registro

SSH nella macchina virtuale Docker che è configurato con l'identità. Eseguire i comandi seguenti dell'interfaccia della riga di comando di Azure, tramite l'interfaccia della riga di comando di Azure installata nella macchina virtuale.

Prima di tutto, autenticare l'interfaccia della riga di comando di Azure con az login usando l'identità assegnata dal sistema nella macchina virtuale.

az login --identity

Eseguire quindi l'autenticazione nel Registro di sistema con az acr login. Quando si usa questo comando, l'interfaccia della riga di comando usa il token di Active Directory creato durante l'esecuzione di az login per l'autenticazione della sessione con il registro contenitori. (A seconda della configurazione della macchina virtuale, potrebbe essere necessario eseguire questo comando e i comandi di Docker con sudo.)

az acr login --name myContainerRegistry

Dovrebbe essere visualizzato il messaggio Login succeeded. È quindi possibile eseguire i comandi docker senza fornire credenziali. Ad esempio, eseguire docker pull per eseguire il pull dell'immagine aci-helloworld:v1, specificando il nome del server di accesso del registro. Il nome del server di accesso è costituito dal nome del registro contenitori (solo lettere minuscole) seguito da .azurecr.io, ad esempio mycontainerregistry.azurecr.io.

docker pull mycontainerregistry.azurecr.io/aci-helloworld:v1

Passaggi successivi

In questo articolo sono state fornite altre informazioni sull'uso delle identità gestite con il Registro Azure Container e su come:

  • Abilitare un'identità assegnata dall'utente o dal sistema in una macchina virtuale di Azure
  • Concedere all'identità l'accesso al Registro Azure Container
  • Usare l'identità gestita per accedere al registro e per eseguire il pull di un'immagine del contenitore