Esercizio: Gestire i segreti nel modello di ARM

Completato

Nell'esercizio precedente si è eseguito un modello di Azure Resource Manager (ARM) di base che effettua il provisioning di una macchina virtuale Linux. In questa parte si segue una procedura simile.

Questa volta, anziché passare la password come parametro, si archivia la password in Azure Key Vault. Per abilitare il modello di ARM per accedere alla password, creare un file di parametri che faccia riferimento al segreto dell'insieme di credenziali delle chiavi nella sottoscrizione.

Distribuire Azure Key Vault

Nota

A causa delle limitazioni della sandbox, in questo caso si crea un insieme di credenziali delle chiavi in Azure Key Vault dal portale di Azure. In genere si usa il cmdlet New-AzKeyVault per creare un insieme di credenziali delle chiavi da Azure PowerShell.

Creare un insieme di credenziali delle chiavi e consentire l'accesso in fase di distribuzione. A questo scopo:

  1. Creare una variabile di PowerShell che contenga il nome dell'insieme di credenziali delle chiavi:

    $KVNAME="tailwind-secrets" + (Get-Random -Count 1 -Maximum 9999999)
    
  2. Eseguire $KVNAME per stampare il relativo valore:

    $KVNAME
    

    L'output è simile al seguente (il numero visualizzato sarà diverso):

    tailwind-secrets5978564
    

    Copiare il valore in un punto appropriato per il passaggio successivo.

  3. Accedere al portale di Azure usando lo stesso account con cui è stata attivata la sandbox.

  4. Nel menu del portale di Azure o nella home page selezionare Crea una risorsa.

  5. Nella casella di ricerca immettere Insieme di credenziali delle chiavi.

  6. Selezionare Key Vault nell'elenco e selezionare Crea per avviare la configurazione dell'insieme di credenziali delle chiavi.

  7. Nel riquadro di creazione specificare i valori seguenti:

    1. Gruppo di risorse: nome di un gruppo di risorse.
    2. Nome insieme di credenziali delle chiavi: il valore di $KVNAME, ad esempio tailwind-secrets5978564.
  8. Selezionare Rivedi e crea.

  9. Seleziona Crea. Questa operazione richiede circa un minuto. Creata la risorsa, selezionare Vai alla risorsa.

  10. Selezionare Configurazione di accesso in Impostazioni. Abilitare l'opzione Azure Resource Manager per la distribuzione del modello e selezionare Applica.

  11. Dalla sessione di PowerShell eseguire il cmdlet ConvertTo-SecureString e assegnare il risultato alla variabile secretSecureString:

    $secretSecureString = ConvertTo-SecureString 'insecurepassword123!' -AsPlainText -Force
    
  12. Eseguire il comando Set-AzKeyVaultSecret seguente per creare un segreto nell'insieme di credenziali delle chiavi. Il segreto è denominato vmPassword, con il valore insecurepassword123!:

    $secret = Set-AzKeyVaultSecret -VaultName $KVNAME -Name vmPassword -SecretValue $secretSecureString
    

Creare il file di parametri

Creare un file di parametri che contiene il nome della VM, il nome utente dell'amministratore e un riferimento alla password della VM nell'insieme di credenziali delle chiavi.

È possibile passare i parametri ai modelli dalla riga di comando. Tenere presente che un file di parametri rappresenta un metodo alternativo per passare i parametri al modello di ARM durante la distribuzione. Un file di parametri consente di accedere ai segreti dell'insieme di credenziali delle chiavi dal modello.

  1. Eseguire il seguente comando Get-AzKeyVault per stampare l'ID dell'insieme di credenziali delle chiavi:

    Get-AzKeyVault -VaultName $KVNAME | Select-Object -ExpandProperty ResourceId
    

    L'output è simile al seguente:

    /subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/<rgn>[resource group name]</rgn>/providers/Microsoft.KeyVault/vaults/tailwind-secrets3020
    

    Prendere nota dell'output per il passaggio successivo.

  2. In Visual Studio Code creare un file denominato azuredeploy.parameters.json nella stessa directory che contiene azuredeploy.json.

  3. Aggiungere questi contenuti al file azuredeploy.parameters.json:

    {
      "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#",
      "contentVersion": "1.0.0.0",
      "parameters": {
        "adminUsername": {
          "value": "azureuser"
        },
        "vmName": {
          "value": "vm2"
        },
        "adminPasswordOrKey": {
          "reference": {
             "keyVault": {
             "id": ""
             },
             "secretName": "vmPassword"
          }
        }
      }
    }
    
  4. Sostituire il valore di id (stringa vuota) con il valore copiato nel passaggio precedente. Salvare quindi il file.

Distribuire una macchina virtuale Linux

Qui si distribuisce lo stesso modello di ARM distribuito nell'esercizio precedente. Questa volta si specifica il file di parametri che fa riferimento alla password della VM nell'insieme di credenziali delle chiavi.

  1. Eseguire il comando New-AzResourceGroupDeployment seguente:

    New-AzResourceGroupDeployment `
      -TemplateFile "./azuredeploy.json" `
      -TemplateParameterFile "./azuredeploy.parameters.json" `
      -dnsLabelPrefix ("vm2-" + (Get-Random -Count 1 -Maximum 9999999))
    

    Nell'esercizio precedente è stata specificata ogni coppia chiave-valore direttamente dalla riga di comando. Qui si specifica "./azuredeploy.parameters.json" per indicare il file di parametri.

    dnsLabelPrefix è impostato su vm2- seguito da un numero casuale. Questa operazione è necessaria per garantire che il nome DNS sia diverso dal nome DNS usato nell'esercizio precedente.

Verificare la distribuzione

Verificare che la macchina virtuale sia stata sottoposta a provisioning e sia collegabile via SSH. A questo scopo:

  1. Eseguire il comando Invoke-Expression per connettersi alla macchina virtuale tramite SSH:

    Invoke-Expression (Get-AzResourceGroupDeployment -Name azuredeploy -ResourceGroupName <rgn>your resource group</rgn>).outputs.sshCommand.value
    

    Quando richiesto, immettere yes per continuare la connessione. Quindi, immettere di nuovo la password di amministratore. insecurepassword123!

    Importante

    Nella pratica le password vanno protette. È anche possibile usare l'autenticazione con chiave pubblica, che in genere è più sicura rispetto all'uso delle password.

  2. Dalla connessione SSH alla VM eseguire hostname per stampare il nome host della VM:

    hostname
    

    Viene visualizzato il nome host interno della macchina virtuale, vm1:

    vm2
    
  3. Eseguire exit per lasciare la sessione SSH.

    exit
    

Ottimo lavoro! La distribuzione è stata estesa in modo da includere un file di parametri che legge le informazioni sui segreti da Key Vault.

Distribuire Azure Key Vault

In Azure Key Vault creare un insieme di credenziali delle chiavi e aggiungere la password della macchina virtuale come segreto protetto. A questo scopo:

  1. Creare una variabile Bash che contenga il nome dell'insieme di credenziali delle chiavi.

    KVNAME=tailwind-secrets$RANDOM
    

    I nomi degli insiemi di credenziali delle chiavi devono essere univoci. La parte $RANDOM garantisce che il nome dell'insieme di credenziali delle chiavi termini con una serie casuale di numeri.

  2. Eseguire il comando az keyvault create seguente per creare l'insieme di credenziali delle chiavi:

    az keyvault create \
      --name $KVNAME \
      --enabled-for-template-deployment true
    

    L'argomento --enabled-for-template-deployment consente al modello di Azure Resource Manager (ARM) di recuperare i segreti dall'insieme di credenziali delle chiavi.

  3. Eseguire il comando az keyvault secret set seguente per creare un segreto nell'insieme di credenziali delle chiavi. Il segreto è denominato vmPassword, con il valore insecurepassword123!:

    az keyvault secret set \
      --vault-name $KVNAME \
      --name vmPassword \
      --value 'insecurepassword123!'
    

Creare il file di parametri

Creare un file di parametri che contiene il nome della VM, il nome utente dell'amministratore e un riferimento alla password della VM nell'insieme di credenziali delle chiavi.

È possibile passare i parametri ai modelli dalla riga di comando. Tenere presente che un file di parametri rappresenta un metodo alternativo per passare i parametri al modello di ARM durante la distribuzione. Un file di parametri consente di accedere ai segreti dell'insieme di credenziali delle chiavi dal modello.

  1. Eseguire il seguente comando az keyvault show per stampare l'ID dell'insieme di credenziali delle chiavi:

    az keyvault show \
      --name $KVNAME \
      --query id \
      --output tsv
    

    L'output è simile al seguente:

    /subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/<rgn>[resource group name]</rgn>/providers/Microsoft.KeyVault/vaults/tailwind-secrets3020
    

    Prendere nota dell'output per il passaggio successivo.

  2. In Visual Studio Code creare un file denominato azuredeploy.parameters.json nella stessa directory che contiene azuredeploy.json.

  3. Aggiungere questi contenuti al file azuredeploy.parameters.json:

    {
      "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#",
      "contentVersion": "1.0.0.0",
      "parameters": {
        "adminUsername": {
          "value": "azureuser"
        },
        "vmName": {
          "value": "vm2"
        },
        "adminPasswordOrKey": {
          "reference": {
             "keyVault": {
             "id": ""
             },
             "secretName": "vmPassword"
          }
        }
      }
    }
    
  4. Sostituire il valore di id (stringa vuota) con il valore copiato nel passaggio precedente. Salvare quindi il file.

Distribuire una macchina virtuale Linux

Qui si distribuisce lo stesso modello di ARM distribuito nell'esercizio precedente. Questa volta si specifica il file di parametri che fa riferimento alla password della VM nell'insieme di credenziali delle chiavi.

Per distribuire il modello, eseguire il seguente comando az deployment group create:

az deployment group create \
  --template-file azuredeploy.json \
  --parameters @azuredeploy.parameters.json dnsLabelPrefix="vm2-$RANDOM"

Nell'esercizio precedente è stata specificata ogni coppia chiave-valore nell'argomento --parameters. Qui si specifica @azuredeploy.parameters.json per indicare il file di parametri.

dnsLabelPrefix è impostato su vm2- seguito da un numero casuale. Questa operazione è necessaria per garantire che il nome DNS sia diverso dal nome DNS usato nell'esercizio precedente.

Verificare la distribuzione

Come nell'esercizio precedente, verificare che la macchina virtuale sia stata sottoposta a provisioning e sia collegabile via SSH. Per brevità, questa volta verranno saltati alcuni passaggi intermedi.

  1. Eseguire il comando seguente per connettersi alla macchina virtuale via SSH:

    $(az deployment group show \
      --name azuredeploy \
      --query properties.outputs.sshCommand.value \
      --output tsv)
    

    Quando richiesto, immettere yes per continuare la connessione. Quindi, immettere di nuovo la password di amministratore. insecurepassword123!

  2. Dalla connessione SSH alla VM eseguire hostname per stampare il nome host della VM:

    hostname
    

    Viene visualizzato il nome host interno della macchina virtuale, vm2:

    vm2
    
  3. Eseguire exit per lasciare la sessione SSH.

    exit
    

Ottimo lavoro! La distribuzione è stata estesa in modo da includere un file di parametri che legge le informazioni sui segreti da Key Vault.