Autenticazione di Spring Cloud in Azure

Questo articolo illustra i metodi di autenticazione di Spring Cloud Azure e consente di scegliere il tipo di credenziale appropriato per proteggere l'accesso alle risorse Azure.

Autenticazione e autorizzazione con Microsoft Entra ID

Usando Microsoft Entra ID, è possibile usare Azure controllo degli accessi in base al ruolo (Azure controllo degli accessi in base al ruolo) per concedere autorizzazioni a un'entità di sicurezza, che può essere un utente o un'entità servizio dell'applicazione. Quando un'entità di sicurezza (un utente o un'applicazione) tenta di accedere a una risorsa Azure, ad esempio una risorsa di Hub eventi, la richiesta deve essere autorizzata. Usando Microsoft Entra ID, l'accesso a una risorsa è un processo in due passaggi:

  1. Innanzitutto, autenticare l'identità dell'entità di sicurezza e restituire un token OAuth 2.0.
  2. Passare quindi il token come parte di una richiesta al servizio Azure per autorizzare l'accesso alla risorsa specificata.

Tipi di credenziali

Spring Cloud Azure consente di configurare tipi di credenziali diversi per l'autenticazione, tra cui DefaultAzureCredential, WorkloadIdentityCredentialManagedIdentityCredential, ClientSecretCredential, , AzureCliCredentiale altro ancora.

DefaultAzureCredential (Credenziali Predefinite di Azure)

DefaultAzureCredential è appropriato per la maggior parte degli scenari in cui l'applicazione deve essere eseguita nel cloud di Azure, perché combina le credenziali seguenti:

  • Credenziali comunemente usate per l'autenticazione durante la distribuzione.
  • Credenziali usate per l'autenticazione in un ambiente di sviluppo.

Nota

DefaultAzureCredentialsemplifica l'introduzione ai Azure SDK gestendo scenari comuni con comportamenti predefiniti ragionevoli. Se si desidera un maggiore controllo o le impostazioni predefinite non supportano lo scenario, usare altri tipi di credenziali.

DefaultAzureCredential tenta di eseguire l'autenticazione tramite i meccanismi seguenti in ordine:

Screenshot del flusso di autenticazione DefaultAzureCredential e dell'ordine delle credenziali.

  • Ambiente: DefaultAzureCredential tenta di leggere le informazioni sull'account specificate tramite le variabili di ambiente e usarle per l'autenticazione.
  • Identità gestita: se l'applicazione viene distribuita in un host Azure con identità gestita abilitata, DefaultAzureCredential tenta di eseguire l'autenticazione usando tale account.
  • Identità del carico di lavoro: se l'applicazione viene distribuita in una macchina virtuale (VM), DefaultAzureCredential tenta di eseguire l'autenticazione usando tale account.
  • Cache dei token condivisi: se è stata eseguita l'autenticazione tramite Visual Studio, DefaultAzureCredential prova a eseguire l'autenticazione usando tale account.
  • IntelliJ: se è stata eseguita l'autenticazione tramite Azure Toolkit for IntelliJ, DefaultAzureCredential prova a eseguire l'autenticazione usando tale account.
  • interfaccia della riga di comando di Azure: se è stato autenticato un account tramite il comando interfaccia della riga di comando di Azureaz login, DefaultAzureCredential prova a eseguire l'autenticazione usando tale account.
  • Azure PowerShell: se è stata eseguita l'autenticazione tramite Azure PowerShell, DefaultAzureCredential prova a eseguire l'autenticazione usando tale account.
  • Azure'interfaccia della riga di comando per sviluppatori: se è stata eseguita l'autenticazione tramite l'interfaccia della riga di comando di Azure Developer, DefaultAzureCredential prova a eseguire l'autenticazione usando tale account.

Mancia

Assicurarsi che l'entità di sicurezza disponga di autorizzazioni sufficienti per accedere alla risorsa di Azure. Per altre informazioni, vedere Autorizzare l'accesso con Microsoft Entra ID.

Nota

Poiché Spring Cloud Azure AutoConfigure 4.1.0, è necessario registrare un ThreadPoolTaskExecutor bean denominato springCloudAzureCredentialTaskExecutor per gestire tutti i thread creati da Azure Identity. Il nome di ogni thread gestito da questo pool di thread è preceduto da az-identity-. Questo ThreadPoolTaskExecutor bean è indipendente dal Executor bean fornito da Spring Boot.

Identità gestite

Una sfida comune è la gestione dei segreti e delle credenziali usate per proteggere la comunicazione tra diversi componenti che costituiscono una soluzione. Le identità gestite eliminano la necessità di gestire le credenziali. Le identità gestite forniscono un'identità per le applicazioni da usare per la connessione alle risorse che supportano l'autenticazione di Microsoft Entra. Le applicazioni possono usare l'identità gestita per ottenere Microsoft Entra token. Ad esempio, un'applicazione può usare un'identità gestita per accedere a risorse come Azure Key Vault in cui è possibile archiviare le credenziali in modo sicuro o per accedere agli account di archiviazione.

Usare l'identità gestita invece di usare stringa di connessione o chiave nell'applicazione perché è più sicura e salva i problemi di gestione dei segreti e delle credenziali. In questo caso, DefaultAzureCredential meglio è lo scenario di sviluppo in locale usando le informazioni sull'account archiviate in locale, quindi la distribuzione dell'applicazione in Azure Cloud e l'uso dell'identità gestita.

Tipi di identità gestiti

Esistono due tipi di identità gestite:

  • assegnata dal sistema: alcuni servizi di Azure consentono di abilitare un'identità gestita direttamente in un'istanza del servizio. Quando si abilita un'identità gestita assegnata dal sistema, si crea un'identità in Microsoft Entra associata al ciclo di vita dell'istanza del servizio. Quindi, quando si elimina la risorsa, Azure elimina automaticamente l'identità per te. Per impostazione predefinita, solo la risorsa di Azure può usare questa identità per richiedere token dall'ID Microsoft Entra.
  • Assegnata dall'utente: è anche possibile creare un'identità gestita come risorsa autonoma Azure. È possibile creare un'identità gestita assegnata dall'utente e assegnarla a una o più istanze di un servizio di Azure. Con le identità gestite assegnate dall'utente, è possibile gestire l'identità separatamente dalle risorse che lo usano.

Nota

Quando si usa un'identità gestita assegnata dall'utente, specificare l'ID client tramite spring.cloud.azure.credential.client-id o spring.cloud.azure.<azure-service>.credential.client-id. Non è necessaria la configurazione delle credenziali se si usa un'identità gestita assegnata dal sistema.

Mancia

Per accedere alla risorsa Azure, assicurarsi che l'entità di sicurezza disponga di autorizzazioni sufficienti. Per altre informazioni, vedere Autorizzare l'accesso con Microsoft Entra ID.

Per altre informazioni sull'identità gestita, vedere Che cosa sono le identità gestite per le risorse di Azure?.

Altri tipi di credenziali

Se si vuole un maggiore controllo di quello fornito da DefaultAzureCredentialo le impostazioni predefinite non supportano lo scenario, usare altri tipi di credenziali.

Eseguire l'autenticazione con Microsoft Entra ID

Per connettere le applicazioni alle risorse che supportano l'autenticazione Microsoft Entra, impostare le configurazioni seguenti con il prefisso spring.cloud.azure.credential o spring.cloud.azure.<azure-service>.credential.

Nella tabella seguente sono elencate le proprietà di autenticazione:

Proprietà Descrizione
client-id ID client da usare quando si esegue l'autenticazione dell'entità servizio con Azure.
client-secret Segreto client da usare quando si esegue l'autenticazione dell'entità servizio con Azure.
client-certificate-path Percorso di un file di certificato PEM da usare quando si esegue l'autenticazione dell'entità servizio con Azure.
client-certificate-password Password del file di certificato.
username Nome utente da usare quando si esegue l'autenticazione con nome utente/password con Azure.
password Password da usare quando si esegue l'autenticazione con nome utente/password con Azure.
managed-identity-enabled Indica se abilitare l'identità gestita.
token-credential-bean-name Nome del bean di tipo TokenCredential da usare quando si esegue l'autenticazione con Azure.

Mancia

Per l'elenco di tutte le proprietà di configurazione di Spring Cloud Azure, vedere proprietà di configurazione di Spring Cloud Azure.

L'applicazione cerca in diverse posizioni per trovare le credenziali disponibili. Ogni Azure SDK factory del generatore client adotta prima un bean personalizzato di tipo TokenCredential se si specifica la proprietà token-credential-bean-namee viene eseguito il fallback da usare DefaultAzureCredential se non si configurano le proprietà delle credenziali.

Eseguire l'autenticazione con un bean TokenCredential personalizzato

L'esempio seguente illustra come definire un bean personalizzato TokenCredential per eseguire l'autenticazione:

@Bean
TokenCredential myTokenCredential() {
    // Your concrete TokenCredential instance
}
spring.cloud.azure:
  credential:
    token-credential-bean-name: myTokenCredential

Eseguire l'autenticazione con un'identità gestita assegnata dal sistema

L'esempio seguente illustra come eseguire l'autenticazione usando un'identità gestita assegnata dal sistema:

spring.cloud.azure:
  credential:
    managed-identity-enabled: true

Eseguire l'autenticazione con un'identità gestita assegnata dall'utente

L'esempio seguente illustra come eseguire l'autenticazione usando un'identità gestita assegnata dall'utente:

spring.cloud.azure:
  credential:
    managed-identity-enabled: true
    client-id: ${AZURE_CLIENT_ID}

Eseguire l'autenticazione con un'entità servizio con il segreto client

L'esempio seguente illustra come eseguire l'autenticazione usando un'entità servizio con un segreto client:

spring.cloud.azure:
  credential:
    client-id: ${AZURE_CLIENT_ID}
    client-secret: ${AZURE_CLIENT_SECRET}
  profile:
    tenant-id: <tenant>

Nota

I valori consentiti per tenant-id sono: common, organizations, consumerso l'ID tenant. Per altre informazioni su questi valori, vedere la sezione Usato l'endpoint errato (account personali e dell'organizzazione) di Errore AADSTS50020 - L'account utente del provider di identità non esiste nel tenant. Per informazioni sulla conversione dell'app a tenant singolo, vedere Convertire l'app a tenant singolo in multi-tenant in Microsoft Entra ID.

Eseguire l'autenticazione usando un'entità servizio con certificato client

L'esempio seguente illustra come eseguire l'autenticazione usando un'entità servizio con un certificato PFX client:

spring.cloud.azure:
  credential:
    client-id: ${AZURE_CLIENT_ID}
    client-certificate-path: ${AZURE_CLIENT_CERTIFICATE_PATH}
    client-certificate-password: ${AZURE_CLIENT_CERTIFICATE_PASSWORD}
  profile:
    tenant-id: <tenant>

Nota

I valori consentiti per tenant-id sono: common, organizations, consumerso l'ID tenant. Per altre informazioni su questi valori, vedere la sezione Usato l'endpoint errato (account personali e dell'organizzazione) di Errore AADSTS50020 - L'account utente del provider di identità non esiste nel tenant. Per informazioni sulla conversione dell'app a tenant singolo, vedere Convertire l'app a tenant singolo in multi-tenant in Microsoft Entra ID.

L'esempio seguente illustra come eseguire l'autenticazione usando un'entità servizio con un certificato PEM client:

spring.cloud.azure:
  credential:
    client-id: ${AZURE_CLIENT_ID}
    client-certificate-path: ${AZURE_CLIENT_CERTIFICATE_PATH}
  profile:
    tenant-id: <tenant>

Nota

I valori consentiti per tenant-id sono: common, organizations, consumerso l'ID tenant. Per altre informazioni su questi valori, vedere la sezione Usato l'endpoint errato (account personali e dell'organizzazione) di Errore AADSTS50020 - L'account utente del provider di identità non esiste nel tenant. Per informazioni sulla conversione dell'app a tenant singolo, vedere Convertire l'app a tenant singolo in multi-tenant in Microsoft Entra ID.

Eseguire l'autenticazione usando credenziali utente

L'esempio seguente illustra come eseguire l'autenticazione usando credenziali utente:

spring.cloud.azure:
  credential:
    client-id: ${AZURE_CLIENT_ID}
    username: ${AZURE_USER_USERNAME}
    password: ${AZURE_USER_PASSWORD}

Autenticare un servizio usando credenziali diverse da altri utenti

Nell'esempio seguente viene illustrato come eseguire l'autenticazione con Key Vault usando un'entità servizio diversa. Questo esempio configura l'applicazione con due credenziali: un'identità gestita assegnata dal sistema e un'entità servizio. Il client segreto dell'insieme di credenziali delle chiavi usa l'entità servizio, ma tutti gli altri componenti usano invece l'identità gestita.

spring.cloud.azure:
  credential:
    managed-identity-enabled: true
  keyvault.secret:
    credential:
      client-id: ${AZURE_CLIENT_ID}
      client-secret: ${AZURE_CLIENT_SECRET}
    profile:
      tenant-id: <tenant>

Nota

I valori consentiti per tenant-id sono: common, organizations, consumerso l'ID tenant. Per altre informazioni su questi valori, vedere la sezione Usato l'endpoint errato (account personali e dell'organizzazione) di Errore AADSTS50020 - L'account utente del provider di identità non esiste nel tenant. Per informazioni sulla conversione dell'app a tenant singolo, vedere Convertire l'app a tenant singolo in multi-tenant in Microsoft Entra ID.

Autorizzare l'accesso con Microsoft Entra ID

Il passaggio di autorizzazione richiede l'assegnazione di uno o più ruoli Azure all'entità di sicurezza. I ruoli assegnati a un'entità di sicurezza determinano le autorizzazioni dell'entità di sicurezza.

Mancia

Per l'elenco di tutti i ruoli predefiniti di Azure, vedere ruoli predefiniti di Azure.

La tabella seguente elenca i ruoli predefiniti di Azure per autorizzare l'accesso ai servizi di Azure supportati in Spring Cloud Azure:

Ruolo Descrizione
proprietario dei dati di Configurazione app Consente l'accesso completo ai dati di Configurazione app.
lettore dati di configurazione app Consente l'accesso in lettura ai dati di Configurazione app.
proprietario dei dati di Hub eventi di Azure Consente l'accesso completo alle risorse di Hub eventi di Azure.
ricevitore dati di Hub eventi di Azure Consente di ricevere l'accesso alle risorse di Hub eventi di Azure.
Mittente dati di Hub eventi di Azure Consente l'accesso alle risorse di Hub eventi di Azure.
proprietario dei dati del bus di servizio di Azure Consente l'accesso completo alle risorse del bus di servizio di Azure.
ricevitore dati del bus di servizio di Azure Consente di ricevere l'accesso alle risorse del bus di servizio di Azure.
Mittente dati del bus di servizio di Azure Consente l'accesso alle risorse del bus di servizio di Azure.
proprietario dei dati dei BLOB di archiviazione Fornisce accesso completo ai contenitori e ai dati dei BLOB di Archiviazione di Azure, inclusa l'assegnazione del controllo di accesso POSIX.
lettore di dati BLOB di archiviazione Leggere ed elencare contenitori e BLOB di Archiviazione di Azure.
lettore di dati della coda di archiviazione Leggere ed elencare le code e i messaggi della coda di Archiviazione di Azure.
collaboratore alla cache Redis di Gestire le cache Redis.

Nota

Quando si usa Spring Cloud Azure Resource Manager per ottenere le stringhe di connessione per Hub eventi, bus di servizio e Coda di archiviazione o le proprietà di Cache per Redis, assegnare il ruolo Contributorpredefinito Azure . Cache Redis di Azure è speciale ed è anche possibile assegnare il ruolo Redis Cache Contributor per ottenere le proprietà Redis.

Nota

Un criterio di accesso Key Vault determina se un'entità di sicurezza specifica, ovvero un utente, un'applicazione o un gruppo di utenti, può eseguire operazioni diverse su segreti, chiavi e certificati Key Vault. È possibile assegnare i criteri di accesso usando il portale di Azure, il interfaccia della riga di comando di Azure o Azure PowerShell. Per altre informazioni, vedere Assegnare un criterio di accesso di Key Vault.

Importante

Azure Cosmos DB espone due definizioni di ruolo predefinite: Cosmos DB Built-in Data Reader e Cosmos DB Built-in Data Contributor. Tuttavia, il supporto del portale di Azure per la gestione dei ruoli non è ancora disponibile. Per altre informazioni sul modello di autorizzazione, sulle definizioni dei ruoli e sull'assegnazione di ruolo, vedere Configurare il controllo degli accessi in base al ruolo con l'ID Microsoft Entra per l'account Azure Cosmos DB.

Eseguire l'autenticazione con token di firma di accesso condiviso

È anche possibile configurare i servizi per l'autenticazione usando la firma di accesso condiviso. Utilizzare la spring.cloud.azure.<azure-service>.sas-token proprietà per configurare questa autenticazione. Ad esempio, usare spring.cloud.azure.storage.blob.sas-token per eseguire l'autenticazione al servizio BLOB di archiviazione.

Eseguire l'autenticazione tramite stringhe di connessione

Alcuni servizi Azure supportano stringhe di connessione per fornire informazioni di connessione e credenziali. Per connettersi a tali servizi Azure usando le stringhe di connessione, configurare spring.cloud.azure.<azure-service>.connection-string. Ad esempio, configurare spring.cloud.azure.eventhubs.connection-string per connettersi al servizio Hub eventi.