Oefening: geheimen beheren in uw ARM-sjabloon

Voltooid

In de vorige oefening hebt u een eenvoudige Azure Resource Manager-sjabloon (ARM) voor het inrichten van een virtuele Linux-machine uitgevoerd. In dit gedeelte volgt u een soortgelijk proces.

In plaats van het wachtwoord door te geven als een parameter, slaat u het wachtwoord op in Azure Key Vault. Om de ARM-sjabloon toegang tot het wachtwoord te geven, maakt u een parameterbestand dat verwijst naar het sleutelkluisgeheim in uw abonnement.

Azure Key Vault implementeren

Notitie

Als gevolg van beperkingen met de sandbox maakt u hier een sleutelkluis in Azure Key Vault vanuit Azure Portal. Normaal gesproken gebruikt u de cmdlet New-AzKeyVault om een sleutelkluis te maken vanuit Azure PowerShell.

Maak een sleutelkluis en sta toegang voor implementatietijd toe. Hiervoor doet u het volgende:

  1. Maak een PowerShell-variabele met de naam van de sleutelkluis:

    $KVNAME="tailwind-secrets" + (Get-Random -Count 1 -Maximum 9999999)
    
  2. Voer $KVNAME uit om de waarde af te drukken:

    $KVNAME
    

    De uitvoer ziet er ongeveer zo uit (met een ander getal):

    tailwind-secrets5978564
    

    Kopieer de waarde naar een handige locatie voor de volgende stap.

  3. Meld u aan bij Azure Portal met het account waarmee u de sandbox hebt geactiveerd.

  4. Selecteer in het menu van Azure Portal of op de startpagina de optie Een resource maken.

  5. Typ Key Vault in het zoekvak.

  6. Selecteer Key Vault in de lijst en selecteer Maken om de sleutelkluis te configureren.

  7. Geef in het deelvenster voor het maken de volgende waarden op:

    1. Resourcegroep: naam van de resourcegroep.
    2. Key Vault-naam: uw waarde van $KVNAMEbijvoorbeeld tailwind-secrets5978564.
  8. Selecteer Controleren + maken.

  9. Selecteer Maken. Dit duurt ongeveer een minuut. Wanneer de resource is gemaakt, selecteert u Naar de resource gaan.

  10. Selecteer Toegangsconfiguratie onder Instellingen. Schakel de optie Azure Resource Manager in voor sjabloonimplementatie en selecteer Toepassen.

  11. Voer vanuit uw PowerShell-sessie de cmdlet ConvertTo-SecureString uit en wijs het resultaat toe aan de variabele secretSecureString:

    $secretSecureString = ConvertTo-SecureString 'insecurepassword123!' -AsPlainText -Force
    
  12. Voer de volgende Set-AzKeyVaultSecret-opdracht uit om een geheim in de sleutelkluis te maken. Het geheim heeft de naam vmPassword, met de waarde insecurepassword123!:

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

Het parameterbestand maken

Hier maakt u een parameterbestand met de naam van de virtuele machine, de gebruikersnaam van de beheerder en een verwijzing naar het wachtwoord van de virtuele machine in de sleutelkluis.

U kunt parameters doorgeven aan sjablonen vanaf de opdrachtregel. Ter herinnering, een parameterbestand is een alternatieve methode om parameters aan uw ARM-sjabloon door te geven tijdens de implementatie. Met een parameterbestand kunt u toegang krijgen tot sleutelkluisgeheimen met behulp van uw sjabloon.

  1. Voer de volgende Get-AzKeyVault-opdracht uit om uw Key Vault-id af te drukken:

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

    De uitvoer ziet er ongeveer als volgt uit:

    /subscriptions/7c7df858-93a0-4f38-8990-304c836a4e8d/resourceGroups/<rgn>[resource group name]</rgn>/providers/Microsoft.KeyVault/vaults/tailwind-secrets3020
    

    Noteer de uitvoer voor de volgende stap.

  2. Maak in Visual Studio Code een bestand met de naam azuredeploy.parameters.json in de map die ook azuredeploy.json bevat.

  3. Voeg deze inhoud toe aan 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. Vervang de waarde van id (de lege tekenreeks) door de waarde die u in de vorige stap hebt gekopieerd. Sla het bestand op.

Een Linux-VM implementeren

Hier implementeert u dezelfde ARM-sjabloon die u in de vorige oefening hebt geïmplementeerd. Deze keer geeft u het parameterbestand op dat verwijst naar het wachtwoord voor de VM in de sleutelkluis.

  1. Voer de volgende New-AzResourceGroupDeployment-opdracht uit:

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

    In de vorige oefening hebt u elk sleutel-waardepaar rechtstreeks opgegeven vanaf de opdrachtregel. Hier geeft u "./azuredeploy.parameters.json" op als uw parameterbestand.

    De dnsLabelPrefix is ingesteld op vm2-, gevolgd door een willekeurig getal. Dit is nodig om ervoor te zorgen dat de DNS-naam verschilt van de DNS-naam die u in de vorige oefening hebt gebruikt.

Implementatie verifiëren

Controleer of de VM is ingericht en of deze via SSH kan worden aangesloten. Hiervoor doet u het volgende:

  1. Voer de opdracht Invoke-Expression uit om via SSH verbinding te maken met de virtuele machine:

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

    Voer desgevraagd in yes om door te gaan met verbinding maken. Voer vervolgens het beheerderswachtwoord in. insecurepassword123!

    Belangrijk

    In het echt moet u wachtwoorden natuurlijk veilig bewaren. U kunt ook verificatie op basis van openbare sleutels gebruiken, dat meestal veiliger is dan het gebruik van wachtwoorden.

  2. Voer hostname uit vanaf uw SSH-verbinding naar de virtuele machine uit om de hostnaam van de VM af te drukken:

    hostname
    

    U ziet de interne hostnaam van de virtuele machine: vm1

    vm2
    
  3. Voer exit uit om uw SSH-sessie te verlaten.

    exit
    

Goed gedaan! U hebt uw implementatie uitgebreid met een parameterbestand dat geheime informatie uit Key Vault leest.

Azure Key Vault implementeren

Maak in Azure Key Vault een sleutelkluis en voeg het wachtwoord voor de VM toe als een beveiligd geheim. Hiervoor doet u het volgende:

  1. Maak een Bash-variabele met de naam van de sleutelkluis.

    KVNAME=tailwind-secrets$RANDOM
    

    Sleutelkluisnamen moeten uniek zijn. Het onderdeel $RANDOM zorgt ervoor dat de sleutelkluisnaam eindigt op een willekeurige reeks cijfers.

  2. Voer de volgende az keyvault create-opdracht uit om de sleutelkluis te maken:

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

    Met het argument --enabled-for-template-deployment kan de Azure Resource Manager-sjabloon (ARM) geheimen ophalen uit de sleutelkluis.

  3. Voer de volgende az keyvault secret set-opdracht uit om een geheim in de sleutelkluis te maken. Het geheim heeft de naam vmPassword, met de waarde insecurepassword123!:

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

Het parameterbestand maken

Hier maakt u een parameterbestand met de naam van de virtuele machine, de gebruikersnaam van de beheerder en een verwijzing naar het wachtwoord van de virtuele machine in de sleutelkluis.

U kunt parameters doorgeven aan sjablonen vanaf de opdrachtregel. Ter herinnering, een parameterbestand is een alternatieve methode om parameters aan uw ARM-sjabloon door te geven tijdens de implementatie. Met een parameterbestand kunt u toegang krijgen tot sleutelkluisgeheimen met behulp van uw sjabloon.

  1. Voer de volgende az keyvault show-opdracht uit om uw Key Vault-id af te drukken:

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

    De uitvoer ziet er ongeveer als volgt uit:

    /subscriptions/7c7df858-93a0-4f38-8990-304c836a4e8d/resourceGroups/<rgn>[resource group name]</rgn>/providers/Microsoft.KeyVault/vaults/tailwind-secrets3020
    

    Noteer de uitvoer voor de volgende stap.

  2. Maak in Visual Studio Code een bestand met de naam azuredeploy.parameters.json in de map die ook azuredeploy.json bevat.

  3. Voeg deze inhoud toe aan 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. Vervang de waarde van id (de lege tekenreeks) door de waarde die u in de vorige stap hebt gekopieerd. Sla het bestand op.

Een Linux-VM implementeren

Hier implementeert u dezelfde ARM-sjabloon die u in de vorige oefening hebt geïmplementeerd. Deze keer geeft u het parameterbestand op dat verwijst naar het wachtwoord voor de VM in de sleutelkluis.

Voer de volgende az deployment group create-opdracht uit om de sjabloon te implementeren:

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

In de vorige oefening hebt u elk sleutel-waardepaar opgegeven in het argument --parameters. Hier geeft u @azuredeploy.parameters.json op als uw parameterbestand.

De dnsLabelPrefix is ingesteld op vm2-, gevolgd door een willekeurig getal. Dit is nodig om ervoor te zorgen dat de DNS-naam verschilt van de DNS-naam die u in de vorige oefening hebt gebruikt.

De implementatie controleren

Controleer of de VM is ingericht en of deze via SSH kan worden aangesloten, net als in de vorige oefening. Om het kort te houden, slaat u dit keer een aantal tussenstappen over.

  1. Voer de volgende stappen uit om via SSH verbinding te maken met uw VM:

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

    Voer desgevraagd in yes om door te gaan met verbinding maken. Voer vervolgens het beheerderswachtwoord in. insecurepassword123!

  2. Voer hostname uit vanaf uw SSH-verbinding naar de virtuele machine uit om de hostnaam van de VM af te drukken:

    hostname
    

    U ziet de interne hostnaam van de virtuele machine: vm2

    vm2
    
  3. Voer exit uit om uw SSH-sessie te verlaten.

    exit
    

Goed gedaan! U hebt uw implementatie uitgebreid met een parameterbestand dat geheime informatie uit Key Vault leest.