Esercitazione: Integrare Azure Key Vault nella distribuzione di modelli di Azure Resource Manager

Informazioni su come recuperare i segreti da Azure Key Vault e passarli come parametri quando si distribuisce un modello di Azure Resource Manager (modello di ARM). Il valore dei parametri non viene mai esposto perché si fa riferimento solo al relativo ID dell'insieme di credenziali delle chiavi. Per fare riferimento al segreto dell'insieme di credenziali delle chiavi, è possibile usare un ID statico o un ID dinamico. In questa esercitazione viene usato un ID statico. Con l'approccio basato sull'ID statico, si fa riferimento all'insieme di credenziali delle chiavi nel file dei parametri del modello, non nel file del modello. Per altre informazioni su entrambi gli approcci, vedere Usare Azure Key Vault per passare valori di parametro protetti durante la distribuzione.

Nell'esercitazione Impostare l'ordine di distribuzione delle risorse viene creata una macchina virtuale. È necessario specificare il nome utente e la password dell'amministratore della macchina virtuale. Invece di immettere la password, è possibile archiviarla preventivamente in Azure Key Vault e quindi personalizzare il modello per recuperare la password dall'insieme di credenziali delle chiavi durante la distribuzione.

Diagramma che illustra l'integrazione di un modello di Resource Manager con un insieme di credenziali delle chiavi

Questa esercitazione illustra le attività seguenti:

  • Preparare un insieme di credenziali delle chiavi
  • Aprire un modello di avvio rapido
  • Modificare il file dei parametri
  • Distribuire il modello
  • Convalidare la distribuzione
  • Pulire le risorse

Se non si ha una sottoscrizione di Azure, creare un account gratuito prima di iniziare.

Per un modulo Learn che usa un valore sicuro da un insieme di credenziali delle chiavi, vedere Gestire distribuzioni cloud complesse usando le funzionalità avanzate dei modelli di ARM.

Prerequisiti

Per completare questo articolo, devi avere quanto segue:

Preparare un insieme di credenziali delle chiavi

In questa sezione si crea un insieme di credenziali delle chiavi e vi si aggiunge un segreto, per poter recuperare il segreto quando si distribuisce il modello. Esistono molti modi per creare un insieme di credenziali delle chiavi. In questa esercitazione si usa Azure PowerShell per distribuire un modello di Azure Resource Manager. Questo modello consente di eseguire due operazioni:

  • Creare un insieme di credenziali delle chiavi con la proprietà enabledForTemplateDeployment abilitata. Affinché il processo di distribuzione del modello possa accedere ai segreti definiti nell'insieme di credenziali delle chiavi, impostare questa proprietà su true.
  • Aggiungere un segreto all'insieme di credenziali delle chiavi. Il segreto contiene la password dell'amministratore della macchina virtuale.

Nota

In qualità di utente che distribuisce il modello di macchina virtuale, non si è il Proprietario o un Collaboratore dell'insieme di credenziali delle chiavi, quindi il Proprietario o un Collaboratore deve concedere all'utente l'accesso all'autorizzazione Microsoft.KeyVault/vaults/deploy/action per l'insieme di credenziali delle chiavi. Per altre informazioni, vedere Usare Azure Key Vault per passare valori di parametro protetti durante la distribuzione.

Per eseguire lo script di Azure PowerShell seguente, selezionare Prova per aprire Cloud Shell. Per incollare lo script, fare clic con il pulsante destro del mouse sul riquadro della shell e quindi scegliere Incolla.

$projectName = Read-Host -Prompt "Enter a project name that is used for generating resource names"
$location = Read-Host -Prompt "Enter the location (i.e. centralus)"
$upn = Read-Host -Prompt "Enter your user principal name (email address) used to sign in to Azure"
$secretValue = Read-Host -Prompt "Enter the virtual machine administrator password" -AsSecureString

$resourceGroupName = "${projectName}rg"
$keyVaultName = $projectName
$adUserId = (Get-AzADUser -UserPrincipalName $upn).Id
$templateUri = "https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/tutorials-use-key-vault/CreateKeyVault.json"

New-AzResourceGroup -Name $resourceGroupName -Location $location
New-AzResourceGroupDeployment -ResourceGroupName $resourceGroupName -TemplateUri $templateUri -keyVaultName $keyVaultName -adUserId $adUserId -secretValue $secretValue

Write-Host "Press [ENTER] to continue ..."

Importante

  • Il nome del gruppo di risorse corrisponde al nome del progetto seguito da rg. Per semplificare la pulizia delle risorse create in questa esercitazione, usare lo stesso nome di progetto e di gruppo di risorse per la distribuzione del modello seguente.
  • Il nome predefinito del segreto è vmAdminPassword. Tale nome è hardcoded nel modello.
  • Affinché il modello possa recuperare il segreto, è necessario abilitare un criterio di accesso denominato Abilita l'accesso ad Azure Resource Manager per la distribuzione dei modelli per l'insieme di credenziali delle chiavi. Questo criterio viene abilitato nel modello. Per altre informazioni sui criteri di accesso, vedere Distribuire insiemi di credenziali delle chiavi e segreti.

Il modello ha un valore di output denominato keyVaultId. Questo ID verrà usato insieme al nome del segreto per recuperare il valore del segreto più avanti nell'esercitazione. Il formato dell'ID della risorsa è il seguente:

/subscriptions/<SubscriptionID>/resourceGroups/mykeyvaultdeploymentrg/providers/Microsoft.KeyVault/vaults/<KeyVaultName>

Quando si copia e si incolla l'ID, questo potrebbe venire suddiviso in più righe. Unire le righe e tagliare gli spazi aggiuntivi.

Per convalidare la distribuzione, eseguire il comando di PowerShell seguente nello stesso riquadro della shell per recuperare il segreto come testo non crittografato. Il comando funziona solo nella stessa sessione della shell, perché utilizza la variabile $keyVaultName, definita nello script di PowerShell precedente.

$secret = Get-AzKeyVaultSecret -VaultName $keyVaultName -Name "vmAdminPassword"
$ssPtr = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($secret.SecretValue)
try {
   $secretValueText = [System.Runtime.InteropServices.Marshal]::PtrToStringBSTR($ssPtr)
} finally {
   [System.Runtime.InteropServices.Marshal]::ZeroFreeBSTR($ssPtr)
}
Write-Output $secretValueText

A questo punto sono stati preparati un insieme di credenziali delle chiavi e un segreto. Le sezioni seguenti illustrano come personalizzare un modello esistente per recuperare il segreto durante la distribuzione.

Aprire un modello di avvio rapido

Modelli di avvio rapido di Azure è un repository di modelli di Azure Resource Manager. Anziché creare un modello da zero, è possibile trovare un modello di esempio e personalizzarlo. Il modello usato in questa esercitazione è il modello di distribuzione di una macchina virtuale Windows semplice.

  1. In Visual Studio Code selezionare File>Apri file.

  2. Nella casella Nome file incollare l'URL seguente:

    https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/quickstarts/microsoft.compute/vm-simple-windows/azuredeploy.json
    
  3. Selezionare Apri per aprire il file. È lo stesso scenario utilizzato in Esercitazione: Creare modelli di ARM con risorse dipendenti. Il modello definisce sei risorse:

    Prima di personalizzare il modello è utile acquisirne una conoscenza di base.

  4. Selezionare File>Salva con nome e quindi salvare una copia del file con il nome azuredeploy.json nel computer locale.

  5. Ripetere i passaggi da 1 a 3 per aprire l'URL seguente e quindi salvare il file con il nome azuredeploy.parameters.json.

    https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/quickstarts/microsoft.compute/vm-simple-windows/azuredeploy.parameters.json
    

Modificare il file dei parametri

Con l'approccio basato sull'ID statico non è necessario apportare modifiche al file del modello. Il recupero del valore del segreto viene eseguito configurando il file dei parametri del modello.

  1. In Visual Studio Code aprire azuredeploy.parameters.json, se non è già aperto.

  2. Aggiornare il parametro adminPassword in:

    "adminPassword": {
      "reference": {
        "keyVault": {
          "id": "/subscriptions/<SubscriptionID>/resourceGroups/mykeyvaultdeploymentrg/providers/Microsoft.KeyVault/vaults/<KeyVaultName>"
        },
        "secretName": "vmAdminPassword"
      }
    },
    

    Importante

    Sostituire il valore di id con l'ID della risorsa dell'insieme di credenziali delle chiavi creato nella routine precedente. Il valore hardcoded di secretName è vmAdminPassword. Vedere Preparare un insieme di credenziali delle chiavi.

    Integrare Key Vault e i modelli di Resource Manager - File dei parametri per la distribuzione di macchine virtuali

  3. Aggiornare i valori seguenti:

    • adminUsername: il nome dell'account amministratore della macchina virtuale.
    • dnsLabelPrefix: denominare il valore dnsLabelPrefix.

    Per esempi di nomi, vedere l'immagine precedente.

  4. Salvare le modifiche.

Distribuire il modello

  1. Accedere a Cloud Shell.

  2. Scegliere l'ambiente preferito selezionando PowerShell o Bash (per l'interfaccia della riga di comando) nell'angolo in alto a sinistra. Quando si cambia interfaccia, è necessario riavviare la shell.

    Caricare file in Cloud Shell nel portale di Azure

  3. Selezionare Carica/Scarica file e quindi Carica. Caricare entrambi i file azuredeploy.json e azuredeploy.parameters.json in Cloud Shell. Dopo aver caricato il file, è possibile usare i comandi ls e cat per verificare che sia stato caricato correttamente.

  4. quindi eseguire lo script di PowerShell seguente per distribuire il modello.

    $projectName = Read-Host -Prompt "Enter the same project name that is used for creating the key vault"
    $location = Read-Host -Prompt "Enter the same location that is used for creating the key vault (i.e. centralus)"
    $resourceGroupName = "${projectName}rg"
    
    New-AzResourceGroupDeployment `
        -ResourceGroupName $resourceGroupName `
        -TemplateFile "$HOME/azuredeploy.json" `
        -TemplateParameterFile "$HOME/azuredeploy.parameters.json"
    
    Write-Host "Press [ENTER] to continue ..."
    

    Quando si distribuisce il modello, usare lo stesso gruppo di risorse usato nell'insieme di credenziali delle chiavi. Questo approccio semplifica la pulizia delle risorse, perché è necessario eliminare un solo gruppo di risorse anziché due.

Convalidare la distribuzione

Dopo aver distribuito la macchina virtuale, testare le credenziali di accesso usando la password archiviata nell'insieme di credenziali delle chiavi.

  1. Apri il portale di Azure.

  2. Selezionare Gruppi di risorse><NomeGruppoRisorse>>simpleWinVM.

  3. Selezionare Connetti nella parte superiore.

  4. Selezionare Scarica file RDP e quindi seguire le istruzioni per accedere alla macchina virtuale usando la password archiviata nell'insieme di credenziali delle chiavi.

Pulire le risorse

Quando non sono più necessarie, eseguire la pulizia delle risorse di Azure distribuite eliminando il gruppo di risorse.

$projectName = Read-Host -Prompt "Enter the same project name that is used for creating the key vault"
$resourceGroupName = "${projectName}rg"

Remove-AzResourceGroup -Name $resourceGroupName

Write-Host "Press [ENTER] to continue ..."

Passaggi successivi

In questa esercitazione è stato recuperato un segreto da Azure Key Vault. Il segreto è stato quindi usato per la distribuzione del modello. Per informazioni su come usare estensioni di macchina virtuale per eseguire le attività post-distribuzione, vedere: