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 Microsoft Entra ID forniscono l'accesso alle risorse di Azure all'interno della sottoscrizione. È possibile considerare un'entità servizio come un'identità utente per un servizio, in cui "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 di Registro Azure Container è possibile creare un'entità servizio Microsoft Entra con autorizzazioni pull, push e pull o 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 l'accesso con ambito al registro contenitori privato. Creare entità servizio diverse per ognuna delle applicazioni o dei servizi, ognuna con diritti di accesso personalizzati per il 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 per l'uso di un'entità servizio che fornisce solo l'accesso alle immagini pull , mentre il sistema di compilazione usa un'entità servizio che lo fornisce sia pushpull che l'accesso. Se lo sviluppo dell'applicazione cambia mano, è possibile ruotare le credenziali dell'entità servizio senza influire sul sistema di compilazione.

Quando usare un'entità servizio

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

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

    Suggerimento

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

    • Push: creare immagini del contenitore ed eseguirne il push in un registro usando soluzioni di integrazione e distribuzione continue come Azure Pipelines o Jenkins.

Per l'accesso individuale a un registro, ad esempio quando si esegue manualmente il pull di un'immagine del contenitore nella workstation di sviluppo, è consigliabile usare un'identità Microsoft Entra personalizzata per l'accesso al Registro di sistema, 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 SERVICE_PRINCIPAL_NAME valore 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

È possibile trovare gli script di esempio precedenti per l'interfaccia della riga di comando di Azure in GitHub, nonché le versioni per Azure PowerShell:

Eseguire l'autenticazione con l'entità servizio

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

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

Il valore Username 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 da 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.

Usare con l'account di accesso docker

È possibile eseguire docker login usando un'entità servizio. Nell'esempio seguente l'ID applicazione dell'entità servizio viene passato nella variabile $SP_APP_IDdi ambiente 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.

Usare 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 di immagini da 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 eseguire l'autenticazione con il Registro di sistema:

az acr login --name myregistry

L'interfaccia della riga di comando usa il token creato durante l'esecuzione 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 in un ID (tenant) Di Microsoft Entra a un servizio o a un'app in un'altra. 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 multi-tenant (entità servizio) 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 per eseguire l'autenticazione usando la nuova entità servizio

Per alcuni passaggi, 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 validità di un anno. È possibile estendere la validità oltre un anno oppure specificare la data di scadenza desiderata usando il az ad sp credential reset comando .

Passaggi successivi