Autenticazione di app ospitate in Azure in risorse di Azure con Azure SDK per Python
Quando si ospita un'app in Azure usando servizi come servizio app Azure, Azure Macchine virtuali o Istanze di Azure Container, l'approccio consigliato per autenticare un'app per le risorse di Azure è con identità gestita.
Un'identità gestita fornisce un'identità per l'app in modo che possa connettersi ad altre risorse di Azure senza la necessità di usare una chiave privata o un altro segreto dell'applicazione. Internamente, Azure conosce l'identità dell'app e le risorse a cui è consentito connettersi. Azure usa queste informazioni per ottenere automaticamente i token di Microsoft Entra per consentire all'app di connettersi ad altre risorse di Azure, senza dover gestire i segreti dell'applicazione.
Nota
Le app in esecuzione in servizio Azure Kubernetes (servizio Azure Kubernetes) possono usare un'identità del carico di lavoro per l'autenticazione con le risorse di Azure. Nel servizio Azure Kubernetes un'identità del carico di lavoro rappresenta una relazione di trust tra un'identità gestita e un account del servizio Kubernetes. Se un'applicazione distribuita nel servizio Azure Kubernetes è configurata con un account del servizio Kubernetes in una relazione di questo tipo, DefaultAzureCredential
autentica l'app in Azure usando l'identità gestita. L'autenticazione tramite un'identità del carico di lavoro è descritta in Usare ID dei carichi di lavoro di Microsoft Entra con servizio Azure Kubernetes. Per informazioni su come configurare l'identità del carico di lavoro, vedere Distribuire e configurare l'identità del carico di lavoro in un cluster del servizio Azure Kubernetes (servizio Azure Kubernetes).
Tipi di identità gestita
Sono disponibili due tipi di identità gestite:
- Identità gestite assegnate dal sistema: questo tipo di identità gestita viene fornito da una risorsa di Azure e associato direttamente alla stessa. Quando si abilita l'identità gestita in una risorsa di Azure, si ottiene un'identità gestita assegnata dal sistema per tale risorsa. Un'identità gestita assegnata dal sistema è associata al ciclo di vita della risorsa di Azure a cui è associata. Quando la risorsa viene eliminata, Azure elimina automaticamente anche l'identità. Poiché è necessario abilitare l'identità gestita per la risorsa di Azure che ospita il codice, questo approccio è il tipo più semplice di identità gestita da usare.
- Identità gestite assegnate dall'utente : è anche possibile creare un'identità gestita come risorsa di Azure autonoma. Questo approccio viene usato più di frequente quando la soluzione ha più carichi di lavoro eseguiti su più risorse di Azure che devono tutti condividere la stessa identità e le stesse autorizzazioni. Ad esempio, se la soluzione include componenti eseguiti in più istanze di macchine virtuali e servizio app che necessitano dell'accesso allo stesso set di risorse di Azure, un'identità gestita assegnata dall'utente usata in tali risorse ha senso.
Questo articolo illustra i passaggi per abilitare e usare un'identità gestita assegnata dal sistema per un'app. Se è necessario usare un'identità gestita assegnata dall'utente, vedere l'articolo Gestire le identità gestite assegnate dall'utente per informazioni su come creare un'identità gestita assegnata dall'utente.
1 - Abilitare l'identità gestita nella risorsa di Azure che ospita l'app
Il primo passaggio consiste nell'abilitare l'identità gestita nella risorsa di Azure che ospita l'app. Ad esempio, se si ospita un'applicazione Django usando app Azure Service, è necessario abilitare l'identità gestita per l'app Web servizio app che ospita l'app. Se si usa una macchina virtuale per ospitare l'app, si abiliterà la macchina virtuale all'uso dell'identità gestita.
È possibile abilitare l'uso dell'identità gestita per una risorsa di Azure usando il portale di Azure o l'interfaccia della riga di comando di Azure.
I comandi dell'interfaccia della riga di comando di Azure possono essere eseguiti in Azure Cloud Shell o in una workstation con l'interfaccia della riga di comando di Azure installata.
I comandi dell'interfaccia della riga di comando di Azure usati per abilitare l'identità gestita per una risorsa di Azure sono nel formato az <command-group> identity --resource-group <resource-group-name> --name <resource-name>
. Di seguito sono riportati comandi specifici per i servizi di Azure più usati.
az webapp identity assign --resource-group <resource-group-name> -name <web-app-name>
L'output sarà simile al seguente.
{
"principalId": "aaaaaaaa-bbbb-cccc-1111-222222222222",
"tenantId": "aaaabbbb-0000-cccc-1111-dddd2222eeee",
"type": "SystemAssigned",
"userAssignedIdentities": null
}
Il valore principalId
è l'ID univoco dell'identità gestita. Conservare una copia di questo output perché questi valori saranno necessari nel passaggio successivo.
2 - Assegnare ruoli all'identità gestita
Come passaggio successivo occorre determinare i ruoli (autorizzazioni) necessari per l'app e assegnare l'identità gestita a tali ruoli in Azure. A un'identità gestita è possibile assegnare ruoli a livello di risorsa, gruppo di risorse o sottoscrizione. Questo esempio illustra come assegnare ruoli nell'ambito del gruppo di risorse perché la maggior parte delle applicazioni raggruppa tutte le risorse di Azure in un singolo gruppo di risorse.
A un'identità gestita viene assegnato un ruolo in Azure usando il comando az role assignment create. Per l'assegnatario, usare l'oggetto principalId
copiato nel passaggio 1.
az role assignment create --assignee <managedIdentityprincipalId> \
--scope /subscriptions/<subscriptionId>/resourceGroups/<resourceGroupName> \
--role "<roleName>"
Per ottenere i nomi di ruolo a cui è possibile assegnare un'entità servizio, usare il comando az role definition list.
az role definition list \
--query "sort_by([].{roleName:roleName, description:description}, &roleName)" \
--output table
Ad esempio, per consentire l'identità gestita con l'ID di aaaaaaaa-bbbb-cccc-1111-222222222222
lettura, scrittura ed eliminazione dell'accesso a Archiviazione di Azure contenitori BLOB e dati in tutti gli account di archiviazione nel gruppo di risorse msdocs-python-sdk-auth-example nella sottoscrizione con ID aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e
, si assegnerebbe l'entità servizio dell'applicazione al ruolo Collaboratore ai dati dei BLOB di archiviazione usando il comando seguente.
az role assignment create --assignee aaaaaaaa-bbbb-cccc-1111-222222222222 \
--scope /subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/msdocs-python-sdk-auth-example \
--role "Storage Blob Data Contributor"
Per informazioni sull'assegnazione delle autorizzazioni a livello di risorsa o sottoscrizione tramite l'interfaccia della riga di comando di Azure, vedere l'articolo Assegnare ruoli di Azure usando l'interfaccia della riga di comando di Azure.
3 - Implementare DefaultAzureCredential nell'applicazione
Quando il codice è in esecuzione in Azure e l'identità gestita è stata abilitata nella risorsa di Azure che ospita l'app, determina DefaultAzureCredential
le credenziali da usare nell'ordine seguente:
- Controllare l'ambiente per un'entità servizio come definito dalle variabili
AZURE_CLIENT_ID
di ambiente ,AZURE_TENANT_ID
eAZURE_CLIENT_SECRET
o oAZURE_CLIENT_CERTIFICATE_PATH
(facoltativamente)AZURE_CLIENT_CERTIFICATE_PASSWORD
. - Controllare i parametri delle parole chiave per un'identità gestita assegnata dall'utente. È possibile passare un'identità gestita assegnata dall'utente specificandone l'ID
managed_identity_client_id
client nel parametro . - Controllare la
AZURE_CLIENT_ID
variabile di ambiente per l'ID client di un'identità gestita assegnata dall'utente. - Usare l'identità gestita assegnata dal sistema per la risorsa di Azure, se abilitata.
È possibile escludere le identità gestite dalle credenziali impostando il parametro True
della exclude_managed_identity_credential
parola chiave .
In questo articolo viene usata l'identità gestita assegnata dal sistema per un'app Web del servizio app Azure, quindi non è necessario configurare un'identità gestita nell'ambiente o passarla come parametro. I passaggi seguenti illustrano come usare DefaultAzureCredential
.
Prima di tutto, aggiungere il azure.identity
pacchetto all'applicazione.
pip install azure-identity
Successivamente, per qualsiasi codice Python che crea un oggetto client Azure SDK nell'app, è necessario:
- Importare la
DefaultAzureCredential
classe dalazure.identity
modulo. - Creare un oggetto
DefaultAzureCredential
. - Passare l'oggetto al costruttore dell'oggetto
DefaultAzureCredential
client di Azure SDK.
Un esempio di questi passaggi è illustrato nel segmento di codice seguente.
from azure.identity import DefaultAzureCredential
from azure.storage.blob import BlobServiceClient
# Acquire a credential object
token_credential = DefaultAzureCredential()
blob_service_client = BlobServiceClient(
account_url="https://<my_account_name>.blob.core.windows.net",
credential=token_credential)
Come descritto nell'articolo Panoramica dell'autenticazione di Azure SDK per Python, DefaultAzureCredential
supporta più metodi di autenticazione e determina il metodo di autenticazione usato in fase di esecuzione. Il vantaggio di questo approccio è che l'app può usare metodi di autenticazione diversi in ambienti diversi senza implementare codice specifico dell'ambiente. Quando il codice precedente viene eseguito nella workstation durante lo sviluppo locale, DefaultAzureCredential
userà un'entità servizio dell'applicazione, come determinato dalle impostazioni di ambiente o dalle credenziali dello strumento di sviluppo per l'autenticazione con altre risorse di Azure. Di conseguenza, lo stesso codice può essere usato per autenticare l'app nelle risorse di Azure durante lo sviluppo locale e quando viene distribuito in Azure.