Condividi tramite


Autenticazione al Registro Azure Container con entità servizio

È possibile usare un'entità servizio Microsoft Entra per fornire l'accesso push, pull o altro al registro contenitori. Se si usa un'entità servizio, è possibile fornire l'accesso ai servizi e alle applicazioni "headless".

Che cos'è un'entità servizio?

Le entità servizio di Microsoft Entra ID forniscono accesso alle risorse Azure all'interno della sottoscrizione. Un'entità servizio può essere considerata come un'identità utente per un servizio, in cui il "servizio" è qualsiasi applicazione, servizio o piattaforma che deve accedere alle risorse. È possibile configurare un'entità servizio con diritti di accesso limitati solo alle risorse specificate. Configurare quindi l'applicazione o il servizio in modo che usi le credenziali dell'entità servizio per accedere a tali risorse.

Nel contesto del Registro Azure Container è possibile creare un'entità servizio Microsoft Entra con autorizzazioni pull, push e pull o con altre autorizzazioni per il registro privato in Azure. Per l'elenco completo, vedere Azure Container Registry roles and permissions (Ruoli e autorizzazioni del Registro Azure Container).

Perché usare un'entità servizio?

Usando un'entità servizio Microsoft Entra, è possibile fornire un accesso limitato al registro di sistema del contenitore privato. Creare diverse entità servizio per ogni applicazione o servizio, ciascuna con diritti di accesso personalizzati al registro. Poiché è possibile evitare di condividere le credenziali tra servizi e applicazioni, è possibile ruotare le credenziali o revocare l'accesso solamente all'entità servizio (e quindi all'applicazione) scelta.

Ad esempio, configurare l'applicazione Web in modo che usi un'entità servizio che le fornisce solo l'accesso pull all'immagine, mentre il sistema di compilazione usa un'entità servizio che gli fornisce entrambi gli accessi push e pull. Se lo sviluppo dell'applicazione cambia proprietario, è possibile ruotare le credenziali dell'entità servizio senza alcun impatto sul sistema di compilazione.

Quando usare un'entità servizio

Usare un'entità servizio per fornire accesso al registro negli scenari headless, Ovvero per qualsiasi applicazione, servizio o script che deve eseguire le operazioni di push o pull delle immagini del contenitore in modo automatico. Ad esempio:

  • Eseguire il pull: distribuire contenitori da un registro a sistemi di orchestrazione, inclusi Kubernetes, DC/OS e Docker Swarm. È anche possibile eseguire il pull da registri contenitori a servizi di Azure correlati, ad esempio servizio app, Batch, Service Fabric e altri ancora.

    Suggerimento

    Un'entità servizio è consigliata in diversi scenari Kubernetes per eseguire il pull delle immagini da un registro contenitori di Azure. Con il servizio Azure Kubernetes è inoltre possibile usare un meccanismo automatizzato per l'autenticazione con un registro di destinazione abilitando l'identità gestita del cluster.

    • Eseguire il push: creare immagini dei contenitori ed eseguirne il push in un registro usando soluzioni di integrazione e distribuzione continua, come Azure Pipelines o Jenkins.

Per l'accesso individuale al registro, ad esempio quando si esegue il pull manuale di un'immagine contenitore alla workstation di sviluppo, è consigliabile usare la propria identità Microsoft Entra per l'accesso al registro (ad esempio con az acr login).

Creare un'entità servizio

Per creare un'entità servizio con accesso al registro contenitori, eseguire lo script seguente in Azure Cloud Shell o in un'installazione locale dell'interfaccia della riga di comando di Azure. Lo script viene formattato per la shell Bash.

Prima di eseguire lo script, aggiornare la variabile ACR_NAME con il nome del registro contenitori. Il valore SERVICE_PRINCIPAL_NAME deve essere univoco all'interno del tenant di Microsoft Entra. Se si riceve un errore "'http://acr-service-principal' already exists.", specificare un nome diverso per l'entità servizio.

È facoltativamente possibile modificare il valore --role nel comando az ad sp create-for-rbac se si vogliono concedere autorizzazioni diverse. Per un elenco completo dei ruoli, vedere ACR roles and permissions (Ruoli e autorizzazioni del registro Azure Container).

Dopo aver eseguito lo script, prendere nota dell'ID e della password dell'entità servizio. Dopo aver ottenuto le credenziali, è possibile configurare le applicazioni e i servizi per l'autenticazione nel registro contenitori come entità servizio.

#!/bin/bash
# This script requires Azure CLI version 2.25.0 or later. Check version with `az --version`.

# Modify for your environment.
# ACR_NAME: The name of your Azure Container Registry
# SERVICE_PRINCIPAL_NAME: Must be unique within your AD tenant
ACR_NAME=$containerRegistry
SERVICE_PRINCIPAL_NAME=$servicePrincipal

# Obtain the full registry ID
ACR_REGISTRY_ID=$(az acr show --name $ACR_NAME --query "id" --output tsv)
# echo $registryId

# Create the service principal with rights scoped to the registry.
# Default permissions are for docker pull access. Modify the '--role'
# argument value as desired:
# acrpull:     pull only
# acrpush:     push and pull
# owner:       push, pull, and assign roles
PASSWORD=$(az ad sp create-for-rbac --name $SERVICE_PRINCIPAL_NAME --scopes $ACR_REGISTRY_ID --role acrpull --query "password" --output tsv)
USER_NAME=$(az ad sp list --display-name $SERVICE_PRINCIPAL_NAME --query "[].appId" --output tsv)

# Output the service principal's credentials; use these in your services and
# applications to authenticate to the container registry.
echo "Service principal ID: $USER_NAME"
echo "Service principal password: $PASSWORD"

Usare un'entità servizio esistente

Per concedere al registro l'accesso a un'entità servizio esistente, è necessario assegnare un nuovo ruolo all'entità servizio. Come per la creazione di una nuova entità servizio, è possibile concedere, tra gli altri, l'accesso pull, push e pull e proprietario.

Lo script seguente usa il comando az role assignment create per concedere le autorizzazioni pull a un'entità servizio specificata nella variabile SERVICE_PRINCIPAL_ID. Modificare il valore --role se si vuole concedere un livello di accesso diverso.

#!/bin/bash
# Modify for your environment. The ACR_NAME is the name of your Azure Container
# Registry, and the SERVICE_PRINCIPAL_ID is the service principal's 'appId' or
# one of its 'servicePrincipalNames' values.
ACR_NAME=$containerRegistry
SERVICE_PRINCIPAL_ID=$servicePrincipal

# Populate value required for subsequent command args
ACR_REGISTRY_ID=$(az acr show --name $ACR_NAME --query id --output tsv)

# Assign the desired role to the service principal. Modify the '--role' argument
# value as desired:
# acrpull:     pull only
# acrpush:     push and pull
# owner:       push, pull, and assign roles
az role assignment create --assignee $SERVICE_PRINCIPAL_ID --scope $ACR_REGISTRY_ID --role acrpull

Script di esempio

Gli script di esempio precedenti per l'interfaccia della riga di comando di Azure sono disponibili in GitHub, così come le versioni per Azure PowerShell:

Eseguire l'autenticazione con l'entità servizio

Dopo aver garantito a un'entità servizio l'accesso al registro contenitori, è possibile configurarne le credenziali per l'accesso a servizi e applicazioni "headless" oppure immetterle usando il comando docker login. Usare i valori seguenti:

  • Nome utente: ID applicazione (client) dell'entità servizio
  • Password: password (segreto client) dell’entità servizio

Il valore Nome utente ha il formato xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx.

Suggerimento

È possibile rigenerare la password (segreto client) di un'entità servizio eseguendo il comando az ad sp credential reset.

Usare le credenziali con i servizi di Azure

È possibile usare le credenziali dell'entità servizio di qualsiasi servizio di Azure che esegue l'autenticazione con un Registro Azure Container. Usare le credenziali dell'entità servizio al posto delle credenziali di amministratore del Registro di sistema per diversi scenari.

Uso con l'accesso Docker

È possibile eseguire docker login usando un'entità servizio. Nell'esempio seguente, l'ID applicazione dell'entità servizio viene passato nella variabile di ambiente $SP_APP_ID e la password nella variabile $SP_PASSWD. Per le procedure consigliate per gestire le credenziali Docker, vedere le informazioni di riferimento sul comando docker login.

# Log in to Docker with service principal credentials
docker login myregistry.azurecr.io --username $SP_APP_ID --password $SP_PASSWD

Dopo l'accesso, Docker memorizza nella cache le credenziali.

Uso con il certificato

Se è stato aggiunto un certificato all'entità servizio, è possibile accedere all'interfaccia della riga di comando di Azure con l'autenticazione basata su certificati e quindi usare il comando az acr login per accedere a un registro. L'uso di un certificato come segreto invece di una password offre sicurezza aggiuntiva quando si usa l'interfaccia della riga di comando.

È possibile creare un certificato autofirmato quando si crea un'entità servizio. In alternativa, aggiungere uno o più certificati a un'entità servizio esistente. Ad esempio, se si usa uno degli script di questo articolo per creare o aggiornare un'entità servizio con diritti per eseguire il pull o il push delle immagini di un registro, aggiungere un certificato usando il comando az ad sp credential reset.

Per usare l'entità servizio con il certificato per accedere all'interfaccia della riga di comando di Azure, il certificato deve essere in formato PEM e includere la chiave privata. Se il certificato non è nel formato richiesto, usare uno strumento come openssl per convertirlo. Quando si esegue az login per accedere all'interfaccia della riga di comando usando l'entità servizio, specificare anche l'ID applicazione dell'entità servizio e l'ID tenant di Active Directory. L'esempio seguente mostra questi valori come variabili di ambiente:

az login --service-principal --username $SP_APP_ID --tenant $SP_TENANT_ID  --password /path/to/cert/pem/file

Eseguire quindi az acr login per autenticarsi con il Registro di sistema:

az acr login --name myregistry

L'interfaccia della riga di comando usa il token creato durante l'esecuzione di az login per autenticare la sessione con il Registro di sistema.

Creare un'entità servizio per scenari tra tenant

Un'entità servizio può essere usata anche negli scenari di Azure che richiedono il pull di immagini da un registro contenitori di un ID (tenant) Microsoft Entra a un servizio o a un'app di un altro. Ad esempio, un'organizzazione potrebbe eseguire un'app nel tenant A che deve eseguire il pull di un'immagine da un registro contenitori condiviso nel tenant B.

Per creare un'entità servizio in grado di eseguire l'autenticazione con un registro contenitori in uno scenario tra tenant:

  • Creare un'app (entità servizio) multi-tenant nel tenant A
  • Effettuare il provisioning dell'app nel tenant B
  • Concedere all'entità servizio le autorizzazioni di pull dal Registro di sistema nel tenant B
  • Aggiornare il servizio o l'app nel tenant A in modo che effettui l'autenticazione usando la nuova entità servizio

Per la procedura di esempio, vedere Eseguire il pull di immagini da un registro contenitori a un cluster del servizio Azure Kubernetes in un tenant di Active Directory diverso.

Rinnovo dell'entità servizio

L'entità servizio viene creata con una validità di un anno. È possibile estendere la validità oltre un anno, oppure specificare la data di scadenza desiderata usando il comando az ad sp credential reset.

Passaggi successivi