Automatizzare la rotazione di un segreto per le risorse che hanno due set di credenziali di autenticazione

Sebbene il modo migliore per eseguire l'autenticazione ai servizi di Azure preveda l'utilizzo di un'identità gestita, esistono alcuni scenari in cui questa alternativa non è disponibile. In questi casi, si usano chiavi di accesso o password. Le chiavi di accesso e le password devono essere ruotate di frequente.

Questa esercitazione illustra come automatizzare la rotazione periodica dei segreti per i database e i servizi che usano due set di credenziali di autenticazione. In particolare, illustra come ruotare le chiavi dell'account di Archiviazione di Azure archiviate in Azure Key Vault come segreti. Si userà una funzione attivata da una notifica di Griglia di eventi di Azure.

Nota

Per i servizi dell'account di archiviazione, è consigliabile usare Microsoft Entra ID per autorizzare le richieste. Per ulteriori informazioni, vedere Autorizzare l'accesso ai BLOB usando Microsoft Entra ID. Esistono servizi che richiedono stringhe di connessione dell'account di archiviazione con chiavi di accesso. Questa soluzione è consigliabile per uno scenario di questo tipo.

Ecco la soluzione di rotazione descritta in questa esercitazione:

Diagram that shows the rotation solution.

In questa soluzione Azure Key Vault archivia le chiavi di accesso individuali dell'account di archiviazione come versioni dello stesso segreto, alternando tra la chiave primaria e quella secondaria nelle versioni successive. Quando una chiave di accesso viene archiviata nella versione più recente del segreto, la chiave alternativa viene rigenerata e aggiunta a Key Vault come nuova versione più recente del segreto. La soluzione fornisce l'intero ciclo di rotazione dell'applicazione da aggiornare alla chiave rigenerata più recente.

  1. Trenta giorni prima della data di scadenza di un segreto, Key Vault pubblica l'evento in scadenza in Griglia di eventi.
  2. Griglia di eventi controlla le sottoscrizioni di eventi e, tramite POST HTTP, chiama l'endpoint dell'app per le funzioni che ha sottoscritto l'evento.
  3. L'app per le funzioni identifica la chiave alternativa (diversa da quella più recente) e chiama l'account di archiviazione per rigenerarla.
  4. L'app per le funzioni aggiunge la nuova chiave rigenerata ad Azure Key Vault come nuova versione del segreto.

Prerequisiti

  • Una sottoscrizione di Azure. Crearne una gratuitamente.
  • Azure Cloud Shell. Questa esercitazione usa il portale Cloud Shell con l'ambiente PowerShell
  • Azure Key Vault.
  • Due account di archiviazione di Azure.

Nota

La rotazione della chiave dell'account di archiviazione condivisa revoca la firma di accesso condiviso (SAS) a livello di account generata in base a tale chiave. Dopo la rotazione delle chiavi dell'account di archiviazione, è necessario rigenerare i token di firma di accesso condiviso a livello di account per evitare interruzioni delle applicazioni.

Se non si hanno a disposizione un insieme di credenziali delle chiavi e account di archiviazione, è possibile usare questo collegamento di distribuzione:

Link that's labelled Deploy to Azure.

  1. In Gruppo di risorse selezionare Crea nuovo. Assegnare al gruppo il nome vault rotation e quindi selezionare OK.

  2. Selezionare Rivedi e crea.

  3. Seleziona Crea.

    Screenshot that shows how to create a resource group.

A questo punto si hanno un insieme di credenziali delle chiavi e due account di archiviazione. È possibile verificare questa configurazione nell'interfaccia della riga di comando di Azure o Azure PowerShell eseguendo questo comando:

az resource list -o table -g vaultrotation

Il risultato dovrebbe essere simile all'output seguente:

Name                     ResourceGroup         Location    Type                               Status
-----------------------  --------------------  ----------  ---------------------------------  --------
vaultrotation-kv         vaultrotation      westus      Microsoft.KeyVault/vaults
vaultrotationstorage     vaultrotation      westus      Microsoft.Storage/storageAccounts
vaultrotationstorage2    vaultrotation      westus      Microsoft.Storage/storageAccounts

Creare e distribuire la funzione di rotazione delle chiavi

Verrà ora creata un'app per le funzioni con un'identità gestita dal sistema, oltre ad altri componenti necessari. Si distribuirà inoltre la funzione di rotazione per le chiavi degli account di archiviazione.

La funzione di rotazione dell'app per le funzioni richiede i componenti e la configurazione seguenti:

  • Un piano di servizio app di Azure
  • Un account di archiviazione per gestire i trigger dell'app per le funzioni
  • Un criterio di accesso ai segreti in Key Vault
  • Il ruolo del servizio dell'operatore della chiave dell'account di archiviazione assegnato all'app per le funzioni in modo che possa accedere alle chiavi di accesso degli account di archiviazione
  • Una funzione di rotazione delle chiavi con un trigger di eventi e un trigger HTTP (rotazione su richiesta)
  • Una sottoscrizione di eventi di Griglia di eventi per l'evento SecretNearExpiry
  1. Selezionare il collegamento alla distribuzione modelli di Azure:

    Azure template deployment link.

  2. Nell'elenco Gruppo di risorse selezionare vaultrotation.

  3. Nella casella Storage Account RG (Gruppo di risorse dell'account di archiviazione) immettere il nome del gruppo di risorse in cui si trova l'account di archiviazione. Mantenere il valore predefinito [resourceGroup().name] se l'account di archiviazione si trova già nello stesso gruppo di risorse in cui si distribuirà la funzione di rotazione delle chiavi.

  4. Nella casella Nome account di archiviazione immettere il nome dell'account di archiviazione che contiene le chiavi di accesso da ruotare. Mantenere il valore predefinito [concat(resourceGroup().name, 'storage')] se si usa l'account di archiviazione creato nei prerequisiti.

  5. Nella casella Key Vault RG (Gruppo di risorse dell'insieme di credenziali delle chiavi) immettere il nome del gruppo di risorse in cui si trova l'insieme di credenziali delle chiavi. Mantenere il valore predefinito [resourceGroup().name] se l'insieme di credenziali delle chiavi si trova già nello stesso gruppo di risorse in cui si distribuirà la funzione di rotazione delle chiavi.

  6. Nella casella Nome insieme di credenziali delle chiavi immettere il nome dell'insieme di credenziali delle chiavi. Mantenere il valore predefinito [concat(resourceGroup().name, '-kv')] se si usa l'insieme di credenziali delle chiavi creato nei prerequisites.

  7. Nella casella App Service Plan Type (Tipo di piano del servizio app) selezionare Piano di hosting. L'opzione Piano Premium è necessaria solo se l'insieme di credenziali delle chiavi è protetto da firewall.

  8. Nella casella Nome dell'app per le funzioni immettere il nome dell'app per le funzioni.

  9. Nella casella Nome del segreto immettere il nome del segreto in cui verranno archiviate le chiavi di accesso.

  10. Nella casella URL del repository immettere la posizione del codice della funzione in GitHub. In questa esercitazione è possibile usare https://github.com/Azure-Samples/KeyVault-Rotation-StorageAccountKey-PowerShell.git.

  11. Selezionare Rivedi e crea.

  12. Seleziona Crea.

    Screenshot that shows how to create and deploy function.

Dopo aver completato la procedura precedente, si avranno un account di archiviazione, una server farm, un'app per le funzioni e informazioni dettagliate sull'applicazione. Una volta completata la distribuzione, verrà visualizzata questa pagina:

Screenshot that shows the Your deployment is complete page.

Nota

In caso di errore, è possibile selezionare Ridistribuisci per completare la distribuzione dei componenti.

È possibile trovare modelli di distribuzione e codice per la funzione di rotazione in Esempi di Azure.

Aggiungere le chiavi di accesso dell'account di archiviazione a Key Vault

Impostare prima di tutto il criterio di accesso per concedere all'entità utente le autorizzazioni per gestire i segreti:

az keyvault set-policy --upn <email-address-of-user> --name vaultrotation-kv --secret-permissions set delete get list

A questo punto è possibile creare un nuovo segreto con una chiave di accesso dell'account di archiviazione come valore. Saranno anche necessari l'ID della risorsa dell'account di archiviazione, il periodo di validità del segreto e l'ID chiave da aggiungere al segreto, in modo che la funzione di rotazione possa rigenerare la chiave nell'account di archiviazione.

Determinare l'ID risorsa dell'account di archiviazione. Il valore è disponibile nella proprietà id.

az storage account show -n vaultrotationstorage

Elencare le chiavi di accesso dell'account di archiviazione in modo da recuperarne i valori:

az storage account keys list -n vaultrotationstorage

Aggiungere un segreto all'insieme di credenziali delle chiavi con periodo di validità per 60 giorni, ID risorsa dell'account di archiviazione e per dimostrazione per attivare la rotazione impostando immediatamente la data di scadenza su domani. Eseguire questo comando usando i valori recuperati per key1Value e storageAccountResourceId:

$tomorrowDate = (get-date).AddDays(+1).ToString("yyyy-MM-ddTHH:mm:ssZ")
az keyvault secret set --name storageKey --vault-name vaultrotation-kv --value <key1Value> --tags "CredentialId=key1" "ProviderAddress=<storageAccountResourceId>" "ValidityPeriodDays=60" --expires $tomorrowDate

Questo segreto attiverà l'evento SecretNearExpiry entro diversi minuti. Questo evento a sua volta attiverà la funzione per ruotare il segreto con la scadenza impostata su 60 giorni. In tale configurazione, l'evento 'SecretNearExpiry' verrà attivato ogni 30 giorni (30 giorni prima della scadenza) e la funzione di rotazione alternerà la rotazione tra key1 e key2.

È possibile verificare che le chiavi di accesso siano state rigenerate recuperando la chiave dell'account di archiviazione e il segreto di Key Vault e confrontandoli.

Usare questo comando per ottenere le informazioni sul segreto:

az keyvault secret show --vault-name vaultrotation-kv --name storageKey

Si noti che CredentialId è stato aggiornato al valore di keyName alternativo e che value è stato rigenerato:

Screenshot that shows the output of the A Z keyvault secret show command for the first storage account.

Recuperare le chiavi di accesso per confrontare i valori:

az storage account keys list -n vaultrotationstorage 

Si noti che value della chiave è uguale al segreto nell'insieme di credenziali delle chiavi:

Screenshot that shows the output of the A Z storage account keys list command for the first storage account.

Usare la funzione di rotazione esistente per più account di archiviazione

È possibile riutilizzare la stessa app per le funzioni per ruotare le chiavi di più account di archiviazione.

Per aggiungere chiavi di account di archiviazione a una funzione esistente per la rotazione, è necessario:

  • Il ruolo del servizio dell'operatore della chiave dell'account di archiviazione assegnato all'app per le funzioni in modo che possa accedere alle chiavi di accesso dell'account di archiviazione.
  • Una sottoscrizione di eventi di Griglia di eventi per l'evento SecretNearExpiry.
  1. Selezionare il collegamento alla distribuzione modelli di Azure:

    Azure template deployment link.

  2. Nell'elenco Gruppo di risorse selezionare vaultrotation.

  3. Nella casella Storage Account RG (Gruppo di risorse dell'account di archiviazione) immettere il nome del gruppo di risorse in cui si trova l'account di archiviazione. Mantenere il valore predefinito [resourceGroup().name] se l'account di archiviazione si trova già nello stesso gruppo di risorse in cui si distribuirà la funzione di rotazione delle chiavi.

  4. Nella casella Nome account di archiviazione immettere il nome dell'account di archiviazione che contiene le chiavi di accesso da ruotare.

  5. Nella casella Key Vault RG (Gruppo di risorse dell'insieme di credenziali delle chiavi) immettere il nome del gruppo di risorse in cui si trova l'insieme di credenziali delle chiavi. Mantenere il valore predefinito [resourceGroup().name] se l'insieme di credenziali delle chiavi si trova già nello stesso gruppo di risorse in cui si distribuirà la funzione di rotazione delle chiavi.

  6. Nella casella Nome insieme di credenziali delle chiavi immettere il nome dell'insieme di credenziali delle chiavi.

  7. Nella casella Nome dell'app per le funzioni immettere il nome dell'app per le funzioni.

  8. Nella casella Nome del segreto immettere il nome del segreto in cui verranno archiviate le chiavi di accesso.

  9. Selezionare Rivedi e crea.

  10. Seleziona Crea.

    Screenshot that shows how to create an additional storage account.

Aggiungere la chiave di accesso dell'account di archiviazione ai segreti Key Vault

Determinare l'ID risorsa dell'account di archiviazione. Il valore è disponibile nella proprietà id.

az storage account show -n vaultrotationstorage2

Elencare le chiavi di accesso dell'account di archiviazione in modo da recuperare i valori della chiave 2:

az storage account keys list -n vaultrotationstorage2

Aggiungere un segreto all'insieme di credenziali delle chiavi con periodo di validità per 60 giorni, ID risorsa dell'account di archiviazione e per dimostrazione per attivare la rotazione impostando immediatamente la data di scadenza su domani. Eseguire questo comando usando i valori recuperati per key2Value e storageAccountResourceId:

$tomorrowDate = (Get-Date).AddDays(+1).ToString('yyyy-MM-ddTHH:mm:ssZ')
az keyvault secret set --name storageKey2 --vault-name vaultrotation-kv --value <key2Value> --tags "CredentialId=key2" "ProviderAddress=<storageAccountResourceId>" "ValidityPeriodDays=60" --expires $tomorrowDate

Usare questo comando per ottenere le informazioni sul segreto:

az keyvault secret show --vault-name vaultrotation-kv --name storageKey2

Si noti che CredentialId è stato aggiornato al valore di keyName alternativo e che value è stato rigenerato:

Screenshot that shows the output of the A Z keyvault secret show command for the second storage account.

Recuperare le chiavi di accesso per confrontare i valori:

az storage account keys list -n vaultrotationstorage 

Si noti che value della chiave è uguale al segreto nell'insieme di credenziali delle chiavi:

Screenshot that shows the output of the A Z storage account keys list command for the second storage account.

Disabilitare la rotazione per il segreto

È possibile disabilitare la rotazione di un segreto semplicemente eliminando la sottoscrizione di Griglia di eventi per tale segreto. Usare il cmdlet Remove-AzEventGridSubscription di PowerShell o il comando az event grid event--subscription delete dell’interfaccia della riga di comando di Azure.

Funzioni di rotazione di Key Vault per due set di credenziali

Modello di funzioni di rotazione per due set di credenziali e diverse funzioni pronte per l'uso:

Nota

Queste funzioni di rotazione elencate sopra sono state create da un membro della community e non da Microsoft. Le funzioni della community non sono supportate in alcun programma o servizio di supporto Microsoft e sono rese disponibili così come sono senza garanzia di alcun tipo.

Passaggi successivi