Gestire i segreti nel modello di ARM leggendo da Azure Key Vault
Il termine infrastruttura come codice (IaC, Infrastructure as Code) si riferisce alla descrizione dei requisiti dell'infrastruttura come file di testo leggibili. I modelli di Azure Resource Manager (ARM) sono un forma di infrastruttura come codice.
Proprio come il codice dell'applicazione, è possibile gestire il codice dell'infrastruttura in un sistema di controllo della versione, ad esempio Git. In questo modo è possibile collaborare con altri utenti e tracciare le modifiche apportate ai requisiti dell'infrastruttura man mano che evolvono.
Come per il codice dell'applicazione, le informazioni riservate, ad esempio le password e le chiavi API, non devono essere impostate come hardcoded nei modelli di ARM. In caso contrario, tutti gli utenti con accesso in lettura al repository potranno accedere alle informazioni segrete.
Sebbene solo gli utenti autorizzati dell'organizzazione debbano accedere alle informazioni riservate, anche i modelli di ARM richiedono queste informazioni. Azure Key Vault è un modo per proteggere le informazioni riservate.
Azure Key Vault consente di proteggere le informazioni riservate
Azure Key Vault è un servizio cloud che funziona come archivio sicuro per i segreti. Key Vault consente di creare più contenitori sicuri denominati insiemi di credenziali. Questi insiemi di credenziali sono supportati da moduli di protezione hardware. Gli insiemi di credenziali consentono di ridurre le probabilità di perdita accidentale di informazioni di sicurezza centralizzando l'archiviazione dei segreti delle applicazioni. Gli insiemi di credenziali controllano e registrano anche l'accesso a tutti gli elementi archiviati al loro interno.
Key Vault è in grado di archiviare sia le chiavi che i segreti. Le sue numerose funzionalità ne fanno una scelta ottimale per la gestione dei segreti, ma anche per il processo di distribuzione.
Controllo degli accessi in base al ruolo. È possibile gestire l'insieme di credenziali delle chiavi usando vari ruoli per assicurarsi che possa essere usato dalle app e da diversi livelli di amministratori.
Consentire utenti e app. L'insieme di credenziali delle chiavi può essere configurato in modo che sia accessibile sia per utenti specifici che per le app. Per le app è necessario creare un'entità servizio. Infatti, l'insieme di credenziali delle chiavi può essere configurato in modo tale che solo le entità servizio possano accedervi.
Nota
Un'entità servizio è un'identità creata per l'uso con applicazioni, servizi ospitati e strumenti automatici per accedere alle risorse di Azure. È possibile limitare l'accesso alle risorse assegnando all'entità solo un ruolo o un subset di ruoli con diritti di accesso limitati. Questo approccio offre un controllo più granulare su quali e quanti elementi sono disponibili quando si accede alle risorse.
Può interagire con un modello di ARM. Durante la distribuzione di un modello di ARM, è possibile leggere da un insieme di credenziali delle chiavi. Perché questo meccanismo funzioni, sono necessari pochi interventi di configurazione. Nella sezione successiva vengono forniti ulteriori dettagli.
Configura autorizzazioni
Si è scelto Key Vault come servizio in cui archiviare le credenziali. Da qui si vuole riuscire a leggere i segreti durante la distribuzione in modo da poter impostare, ad esempio, la password di una macchina virtuale.
È necessario eseguire diversi passaggi di configurazione per impostare Key Vault in modo da poterlo leggere durante la distribuzione. I passaggi sono:
Abilitare l'insieme di credenziali delle chiavi per la distribuzione. È necessario consentire la lettura di Key Vault durante la distribuzione. Questa impostazione può essere passata in fase di creazione o modificata in un secondo momento.
L'utente deve essere autorizzato a eseguire la distribuzione per il gruppo di risorse. Questo aspetto non è diverso rispetto ad altre distribuzioni. Tuttavia, se non è stato creato il gruppo di risorse, è possibile assegnare un ruolo per assicurarsi di poter eseguire la distribuzione.
L'utente deve poter accedere in modo appropriato all'insieme di credenziali delle chiavi. È necessario assicurarsi di disporre dei diritti di accesso appropriati all'insieme di credenziali delle chiavi per la lettura durante la distribuzione. Quando si crea un insieme di credenziali delle chiavi viene creato un criterio di accesso che concede all'utente i diritti per gestire tutti i segreti, le chiavi e i certificati.
Configurare Key Vault per la distribuzione
Configurare l'istanza di Key Vault in modo da poter leggere le credenziali durante la distribuzione di un modello di ARM.
Per abilitare Key Vault per la distribuzione, è possibile passare un'impostazione durante la creazione dell'istanza di Key Vault o un elemento che si può modificare in un secondo momento. In PowerShell è un'opzione denominata -EnabledForTemplateDeployment
. Nell'interfaccia della riga di comando di Azure è un argomento denominato --enabled-for-template-deployment
per cui è necessario passare anche il valore true
.
Nota
L'interfaccia della riga di comando di Azure richiede inoltre di passare un valore booleano con il valore true
.
L'utente deve essere autorizzato a eseguire la distribuzione per Key Vault e il gruppo di risorse
Prima di provare a distribuire e leggere i segreti dall'insieme di credenziali delle chiavi, è necessario assicurarsi di avere l'autorizzazione per la distribuzione. Sono due i ruoli che offrono questa autorizzazione:
Owner
: se l'utente ha creato l'insieme di credenziali delle chiavi, ha automaticamente questo ruolo.Contributor
: questo ruolo concede l'accesso per la gestione di tutti i segreti. Se l'utente non ha creato l'insieme di credenziali delle chiavi, l'approccio più semplice è assegnarsi il ruoloContributor
.
Un'altra opzione consiste nel creare e assegnare un ruolo personalizzato e assicurarsi che il ruolo contenga l'autorizzazione Microsoft.KeyVault/vaults/deploy/action.
Configurare il file di parametri di distribuzione
Anziché specificare ogni parametro e i valori corrispondenti come coppie chiave-valore durante la distribuzione, è possibile usare un file di parametri.
In questo file di parametri specificare l'insieme di credenziali delle chiavi e il segreto nell'insieme di credenziali delle chiavi a cui si è interessati. A tale scopo, modificare un parametro e quindi aggiornare il modello di distribuzione per usare questo parametro.
Nota
Il modello non è a conoscenza dell'insieme di credenziali delle chiavi o del relativo segreto. La configurazione che si sta effettuando viene eseguita nel file dei parametri.
Configurare un insieme di credenziali delle chiavi e il segreto per un parametro
Nel file dei parametri, e per un parametro specifico, puntare a un insieme di credenziali delle chiavi per il quale si ha l'autorizzazione per la distribuzione. Specificare quindi il segreto a cui si è interessati. Indicare il segreto in base al nome. Durante la distribuzione, questa configurazione verrà risolta nel valore del segreto. Il parametro denominato myPassword
viene configurato per usare un insieme di credenziali delle chiavi specifico e un segreto denominato databaseSecret
.
"myPassword" : {
"reference": {
"keyVault": {
"id": "/subscriptions/<subscription-id>/resourceGroups/<rg-name>/providers/Microsoft.KeyVault/vaults/<vault-name>",
"secretName": "databaseSecret"
}
}
}
Nel codice JSON precedente viene specificato l'ID completo per l'insieme di credenziali delle chiavi e si procede per richiedere il segreto databaseSecret
. Il valore di questo segreto viene quindi estratto e assegnato al parametro myPassword
.
Assegnare il parametro alla password della risorsa
Questo passaggio non è correlato all'insieme di credenziali delle chiavi. Ha lo scopo di verificare che la risorsa prevista usi il parametro configurato per la lettura del valore del segreto dall'insieme di credenziali delle chiavi. Di seguito è riportato un frammento di codice abbreviato da una macchina virtuale, nel file del modello, in cui l'elemento adminPassword
legge dal parametro myPassword
. Il valore del segreto verrà quindi letto dall'insieme di credenziali delle chiavi in fase di distribuzione e verrà assegnato all'elemento adminPassword
.
{
"osProfile": {
"adminPassword": "[parameters('myPassword')]"
}
}