Esercizio: Gestire i segreti nel modello di ARM
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:
Creare una variabile di PowerShell che contenga il nome dell'insieme di credenziali delle chiavi:
$KVNAME="tailwind-secrets" + (Get-Random -Count 1 -Maximum 9999999)
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.
Accedere al portale di Azure usando lo stesso account con cui è stata attivata la sandbox.
Nel menu del portale di Azure o nella home page selezionare Crea una risorsa.
Nella casella di ricerca immettere Insieme di credenziali delle chiavi.
Selezionare Key Vault nell'elenco e selezionare Crea per avviare la configurazione dell'insieme di credenziali delle chiavi.
Nel riquadro di creazione specificare i valori seguenti:
- Gruppo di risorse:
nome di un gruppo di risorse . - Nome insieme di credenziali delle chiavi: il valore di
$KVNAME
, ad esempio tailwind-secrets5978564.
- Gruppo di risorse:
Selezionare Rivedi e crea.
Seleziona Crea. Questa operazione richiede circa un minuto. Creata la risorsa, selezionare Vai alla risorsa.
Selezionare Configurazione di accesso in Impostazioni. Abilitare l'opzione Azure Resource Manager per la distribuzione del modello e selezionare Applica.
Dalla sessione di PowerShell eseguire il cmdlet
ConvertTo-SecureString
e assegnare il risultato alla variabilesecretSecureString
:$secretSecureString = ConvertTo-SecureString 'insecurepassword123!' -AsPlainText -Force
Eseguire il comando
Set-AzKeyVaultSecret
seguente per creare un segreto nell'insieme di credenziali delle chiavi. Il segreto è denominatovmPassword
, con il valoreinsecurepassword123!
:$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.
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.
In Visual Studio Code creare un file denominato azuredeploy.parameters.json nella stessa directory che contiene azuredeploy.json.
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" } } } }
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.
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 suvm2-
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:
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.
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
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:
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.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.Eseguire il comando
az keyvault secret set
seguente per creare un segreto nell'insieme di credenziali delle chiavi. Il segreto è denominatovmPassword
, con il valoreinsecurepassword123!
: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.
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.
In Visual Studio Code creare un file denominato azuredeploy.parameters.json nella stessa directory che contiene azuredeploy.json.
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" } } } }
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.
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!
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
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.