Proteggere token di aggiornamento On-Behalf-Of di OAuth 2.0 per i servizi Web

ClI di Azure
Azure DevOps
Funzioni di Azure
Insieme di credenziali chiave di Azure
Azure Pipelines

Quando si sviluppano servizi Web, potrebbe essere necessario ottenere i token usando il flusso OBO (OAuth 2.0 On-Behalf-Of). Il flusso OBO viene usato quando un'applicazione richiama un servizio o un'API Web, che a sua volta deve chiamare un altro servizio o un'altra API Web. Propaga l'identità utente delegato e le autorizzazioni attraverso la catena di richieste. Quando un'applicazione deve usare token di accesso e aggiornamento a tempo indeterminato, in genere in scenari di accesso offline, è fondamentale che i token di aggiornamento vengano archiviati in modo sicuro.

Avviso

Considerare attentamente il rischio e la responsabilità coinvolti nell'archiviazione di tutti i token di sicurezza, poiché questi token possono concedere a un attore malintenzionato l'accesso alle risorse protette dall'ID Microsoft Entra dell'organizzazione. Una violazione della sicurezza di un'applicazione destinata agli account in qualsiasi directory organizzativa (qualsiasi directory Microsoft Entra - Multi-tenant) può essere particolarmente disastrosa.

L'archiviazione dei token di accesso comporta rischi per la sicurezza ancora più elevati, perché i token di accesso possono accedere alle risorse. L'approccio consigliato, pertanto, non è archiviare i token di accesso, ma ottenerli solo nel momento in cui sono necessari. È opportuno quindi archiviare in modo sicuro solo i token di aggiornamento, con lo stesso rigore che si adotterebbe per i token di accesso.

Se necessario, è possibile revocare i token di aggiornamento nel caso in cui risultino compromessi.

Potenziali casi d'uso

Questa soluzione usa Azure Key Vault, Funzioni di Azure e Azure DevOps per aggiornare e archiviare in modo sicuro i token di aggiornamento OBO.

Architettura

Diagramma che mostra i processi di aggiornamento della chiave e del token.

Scaricare un file di Visio di questa architettura.

Flusso di dati

  • Azure Key Vault contiene chiavi di crittografia dei segreti per ogni tenant di Microsoft Entra ID .
  • Una funzione di Funzioni di Azure attivata da un timer ottiene da Key Vault la chiave privata più recente. Un'altra funzione di Funzioni di Azure recupera il token di aggiornamento da Microsoft Identity Platform e lo salva con la versione più recente della chiave privata.
  • Un database archivia la chiave crittografata e i dati opachi più recenti.
  • Una pipeline di recapito continuo di Azure DevOps gestisce e sincronizza i processi di rotazione delle chiavi private e di aggiornamento dei token.

Azure Pipelines consente di aggiungere facilmente la propria strategia di rotazione delle chiavi se si usa già Pipelines per la gestione dell'infrastruttura come codice (IaC) o dei processi di integrazione continua e recapito continuo. Non è necessario usare Azure Pipelines, purché si limitino i percorsi inerenti all'impostazione e al recupero delle chiavi private.

È opportuno tuttavia applicare i criteri seguenti per consentire all'entità servizio dedicata alla connessione del servizio Azure DevOps di impostare le chiavi private in Key Vault. Sostituire le variabili <Key Vault Name> e <Service Connection Principal> con i valori specifici del proprio ambiente.

az keyvault set-policy --name $<Key Vault Name> --spn $<Service Connection Principal> --secret-permissions set

Dopo aver configurato Azure Pipelines per la creazione e l'aggiornamento delle chiavi, è possibile pianificare l'esecuzione periodica della pipeline. La pipeline aggiorna la chiave segreta di Key Vault in modo da sincronizzarla con la rotazione delle chiavi e salva il token crittografato con la nuova versione della chiave privata. Per altre informazioni, vedere Configurare le pianificazioni per le pipeline.

Identità gestita

Per un servizio di Azure come Funzioni di Azure, il modo migliore per accedere a Key Vault è quello di usare l'identità gestita del servizio. È possibile concedere l'accesso tramite il portale di Azure, l'interfaccia della riga di comando di Azure o un modello di Azure Resource Manager per scenari IaC.

Azure portal

Nel portale di Azure aggiungere i criteri di accesso di Key Vault per consentire all'ID oggetto dell'identità gestita di Funzioni di Azure di ottenere e impostare le chiavi private. Per altre informazioni, vedere Aggiungere un'identità assegnata dal sistema e Usare i riferimenti di Key Vault per il servizio app e Funzioni di Azure.

Screenshot che mostra come abilitare l'identità gestita nel portale di Azure.

Interfaccia della riga di comando di Azure

Per impostare i criteri di Azure Key Vault, è possibile usare anche l'interfaccia della riga di comando di Azure:

az keyvault set-policy --name $<Key Vault Name> --spn $<Service Connection Principal> --secret-permissions set
az keyvault set-policy --name $<Key Vault Name> --spn $<Managed Identity Principal> --secret-permissions get

Modello ARM

Il modello ARM seguente consente a Funzioni di Azure di accedere ad Azure Key Vault. Sostituire le variabili *** con i valori specifici del proprio ambiente.

{
  "type": "Microsoft.KeyVault/vaults",
  "apiVersion": "2019-09-01",
  "name": "***",
  "location": "***",
  "properties": {
    "sku": {
      "family": "A",
      "name": "standard"
    },
    "tenantId": "***",
    "enableSoftDelete": true,
    "enabledForDeployment": false,
    "enabledForTemplateDeployment": false,
    "enabledForDiskEncryption": false,
    "accessPolicies": [
      {
        "tenantId": "***",
        "objectId": "<Managed Identity Principal>",
        "permissions": {
          "secrets": [
            "get"
          ]
        }
      },
      {
        "tenantId": "***",
        "objectId": "<Service Connection Principal>",
        "permissions": {
          "secrets": [
            "set"
          ]
        }
      }
    ]
  }
}

Archiviazione dei token

È possibile usare qualsiasi database per archiviare i token in formato crittografato. Il diagramma seguente illustra la sequenza di archiviazione dei token di aggiornamento in un database:

Diagramma che mostra la sequenza di aggiunta di token.

La sequenza ha due funzioni: userId() e secretId(). È possibile definire queste funzioni come una qualsiasi combinazione di token.oid, token.tid e token.sub. Per altre informazioni, vedere Utilizzo di id_token.

Con la chiave crittografica archiviata come chiave privata, è possibile cercare in Azure Key Vault la versione più recente della chiave.

Utilizzo dei token

L'utilizzo di una chiave è molto semplice. La sequenza seguente esegue una query sulla chiave in base alla versione più recente della chiave stessa.

Diagramma che mostra la sequenza di utilizzo del token archiviato.

L'aggiornamento del token è ortogonale alla funzione DoWork e Funzioni di Azure può quindi eseguire DoWork e l'aggiornamento dei token in modo asincrono usando Durable Functions. Per altre informazioni sulle funzioni attivate da HTTP con Durable Functions, vedere Funzionalità HTTP.

Non è consigliabile usare Azure Key Vault nella pipeline delle richieste HTTP ed è quindi opportuno memorizzare le risposte nella cache ogni volta che risulta è ragionevole. In questo esempio, è opportuno memorizzare nella cache la risposta di Key Vault alla chiamata getSecret(secretId, secretVersion).

Rotazione delle chiavi e aggiornamento dei token

È possibile ruotare la chiave privata nello stesso momento in cui si aggiorna il token di aggiornamento, in modo che il token più recente venga crittografato con la versione più recente della chiave di crittografia privata. Questo processo usa il supporto integrato di Funzioni di Azure per i trigger timer. Per altre informazioni, vedere Trigger timer per Funzioni di Azure.

Il diagramma di sequenza seguente illustra il processo di sincronizzazione dell'aggiornamento dei token con la rotazione delle chiavi:

Diagramma che mostra la sequenza di sincronizzazione dell'aggiornamento del token con rotazione delle chiavi.

Controllo degli utenti e degli accessi

Microsoft Identity Platform offre la possibilità di revocare i token di aggiornamento in caso di compromissione. Vedere Revoca dei token e Revoke-AzureADUserAllRefreshToken.

Nota

I moduli Azure AD e MSOnline PowerShell sono deprecati a partire dal 30 marzo 2024. Per maggiori informazioni, leggere l'aggiornamento sulla deprecazione. Dopo questa data, il supporto per questi moduli è limitato all'assistenza alla migrazione a Microsoft Graph PowerShell SDK e alle correzioni di sicurezza. I moduli deprecati continueranno a funzionare fino al 30 marzo 2025.

È consigliabile eseguire la migrazione a Microsoft Graph PowerShell per interagire con Microsoft Entra ID (in precedenza Azure AD). Per domande comuni sulla migrazione, consultare le Domande frequenti sulla migrazione. Nota: le versioni 1.0.x di MSOnline potrebbero subire interruzioni dopo il 30 giugno 2024.

Per rimuovere un utente dall'ID Microsoft Entra, è sufficiente rimuovere il record dell'utente. Per rimuovere l'autorizzazione di accesso alle applicazioni a livello di utente, rimuovere la parte refreshToken dei dati dell'utente.

Per rimuovere l'autorizzazione di accesso per un gruppo di utenti, ad esempio per tutti gli utenti presenti in un tenant di destinazione, è possibile usare Azure Pipelines per eliminare la chiave privata del gruppo basata su secretId().

Collaboratori

Questo articolo viene gestito da Microsoft. Originariamente è stato scritto dai seguenti contributori.

Autore principale:

Passaggi successivi