Ćwiczenia — zarządzanie wpisami tajnymi w szablonie usługi ARM

Ukończone

W poprzednim ćwiczeniu uruchomiono podstawowy szablon usługi Azure Resource Manager (ARM), który aprowiduje maszynę wirtualną z systemem Linux. W tej części zaobserwujesz podobny proces.

Tym razem zamiast przekazywania hasła jako parametru przechowasz je w usłudze Azure Key Vault. Aby włączyć szablon usługi ARM w celu uzyskania dostępu do hasła, utworzysz plik parametrów, który odwołuje się do wpisu tajnego magazynu kluczy w subskrypcji.

Wdrażanie usługi Azure Key Vault

Uwaga

Ze względu na ograniczenia piaskownicy w tym miejscu utworzysz magazyn kluczy w usłudze Azure Key Vault z poziomu portalu Azure Portal. Zwykle magazyn kluczy w programie Azure PowerShell tworzy się za pomocą polecenia cmdlet New-AzKeyVault.

Tworzenie magazynu kluczy i zezwalanie na dostęp do czasu wdrażania. Aby to zrobić:

  1. Utwórz zmienną programu PowerShell, która zawiera nazwę magazynu kluczy:

    $KVNAME="tailwind-secrets" + (Get-Random -Count 1 -Maximum 9999999)
    
  2. Uruchom $KVNAME, aby wydrukować jego wartość:

    $KVNAME
    

    Dane wyjściowe wyglądają tak (wyświetlona będzie inna liczba):

    tailwind-secrets5978564
    

    Skopiuj wartość do wygodnego miejsca na potrzeby następnego kroku.

  3. Zaloguj się do witryny Azure Portal przy użyciu tego samego konta, za pomocą którego aktywowano piaskownicę.

  4. W menu witryny Azure Portal lub na stronie głównej wybierz pozycję Utwórz zasób.

  5. W polu wyszukiwania wprowadź magazyn kluczy.

  6. Wybierz z listy pozycję Key Vault i wybierz pozycję Utwórz, aby rozpocząć konfigurowanie magazynu kluczy.

  7. W okienku tworzenia określ następujące wartości:

    1. Grupa zasobów: nazwa grupy zasobów.
    2. Nazwa magazynu kluczy: Wartość $KVNAME, na przykład tailwind-secrets5978564.
  8. Wybierz pozycję Przejrzyj i utwórz.

  9. Wybierz pozycję Utwórz. Powinno to zająć około minutę. Po utworzeniu zasobu wybierz pozycję Przejdź do zasobu.

  10. Wybierz pozycję Konfiguracja dostępu w obszarze Ustawienia. Włącz opcję Azure Resource Manager na potrzeby wdrażania szablonu i wybierz pozycję Zastosuj.

  11. W sesji programu PowerShell uruchom polecenie ConvertTo-SecureString cmdlet i przypisz wynik do zmiennej secretSecureString:

    $secretSecureString = ConvertTo-SecureString 'insecurepassword123!' -AsPlainText -Force
    
  12. Uruchom następujące polecenie Set-AzKeyVaultSecret, aby utworzyć wpis tajny w magazynie kluczy. Wpis tajny ma nazwę vmPassword, którego wartością jest insecurepassword123!:

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

Tworzenie pliku parametrów

Tutaj utworzysz plik parametrów, który zawiera nazwę maszyny wirtualnej, nazwę użytkownika administratora oraz odwołanie do hasła maszyny wirtualnej w magazynie kluczy.

Parametry można przekazać do szablonów z wiersza polecenia. Przypomnij sobie, że plik parametrów jest alternatywnym sposobem przekazywania parametrów do szablonu usługi ARM podczas wdrażania. Plik parametrów pozwala uzyskać dostęp do tajnych wpisów magazynu kluczy z szablonu.

  1. Uruchom następujące polecenie Get-AzKeyVault w celu wydrukowania identyfikatora magazynu kluczy:

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

    Dane wyjściowe będą wyglądać mniej więcej tak:

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

    Zwróć uwagę na dane wyjściowe w przypadku następnego kroku.

  2. W programie Visual Studio Code utwórz plik o nazwie azuredeploy.parameters.json w tym samym katalogu, który zawiera plik azuredeploy.json.

  3. Dodaj tę zawartość do pliku 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. Zastąp wartość id (pusty ciąg) wartością skopiowaną w poprzednim kroku. Następnie zapisz plik.

Wdrażanie maszyny wirtualnej z systemem Linux

Tutaj możesz wdrożyć ten sam szablon usługi ARM, który wdrożono w poprzednim ćwiczeniu. Tym razem podajesz plik parametrów odwołujący się do hasła maszyny wirtualnej w magazynie kluczy.

  1. Uruchom następujące polecenie New-AzResourceGroupDeployment:

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

    W poprzednim ćwiczeniu każdą parę klucz-wartość podano bezpośrednio z wiersza polecenia. Tutaj określasz "./azuredeploy.parameters.json", aby podać plik parametrów.

    Parametr dnsLabelPrefix ma wartość vm2-, po której następuje losowa liczba. Jest to wymagane w celu upewnienia się, że nazwa DNS różni się od nazwy DNS użytej w poprzednim ćwiczeniu.

Weryfikowanie wdrożenia

Sprawdź, czy maszyna wirtualna została ustanowiona i czy można połączyć się z nią za pośrednictwem protokołu SSH. Aby to zrobić:

  1. Uruchom polecenie Invoke-Expression, aby uzyskać połączenie z maszyną wirtualną za pośrednictwem protokołu SSH:

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

    Po wyświetleniu monitu wprowadź , yes aby kontynuować nawiązywanie połączenia. Następnie wprowadź hasło administratora. insecurepassword123!

    Ważne

    W praktyce stosuj bezpieczne hasła. Ponadto można użyć uwierzytelniania przy użyciu klucza publicznego, które jest zwykle bezpieczniejsze niż używanie haseł.

  2. Z poziomu połączenia SSH z maszyną wirtualną uruchom polecenie hostname, aby wyświetlić nazwę hosta maszyny wirtualnej:

    hostname
    

    Zostanie wyświetlona wewnętrzna nazwa hosta maszyny wirtualnej: vm1

    vm2
    
  3. Uruchom polecenie exit, aby opuścić sesję SSH.

    exit
    

Świetnie! Wdrożenie zostało rozszerzone tak, aby zawierało plik parametrów, który odczytuje tajne informacje z magazynu kluczy.

Wdrażanie usługi Azure Key Vault

W usłudze Azure Key Vault utwórz magazyn kluczy i dodaj hasło maszyny wirtualnej jako bezpieczny wpis tajny. Aby to zrobić:

  1. Utwórz zmienną Bash, która zawiera nazwę magazynu kluczy.

    KVNAME=tailwind-secrets$RANDOM
    

    Nazwy magazynów kluczy muszą być unikatowe. Część $RANDOM gwarantuje, że nazwa wystąpienia magazynu kluczy zostanie zakończona losową serią liczb.

  2. Uruchom następujące polecenie az keyvault create, aby utworzyć magazyn kluczy:

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

    Argument --enabled-for-template-deployment zezwala szablonowi usługi Azure Resource Manager (ARM) na pobieranie wpisów tajnych z magazynu kluczy.

  3. Uruchom następujące polecenie az keyvault secret set, aby utworzyć wpis tajny w magazynie kluczy. Wpis tajny ma nazwę vmPassword, którego wartością jest insecurepassword123!:

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

Tworzenie pliku parametrów

Tutaj utworzysz plik parametrów, który zawiera nazwę maszyny wirtualnej, nazwę użytkownika administratora oraz odwołanie do hasła maszyny wirtualnej w magazynie kluczy.

Parametry można przekazać do szablonów z wiersza polecenia. Przypomnij sobie, że plik parametrów jest alternatywnym sposobem przekazywania parametrów do szablonu usługi ARM podczas wdrażania. Plik parametrów pozwala uzyskać dostęp do tajnych wpisów magazynu kluczy z szablonu.

  1. Uruchom następujące polecenie az keyvault show w celu wydrukowania identyfikatora magazynu kluczy:

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

    Dane wyjściowe będą wyglądać mniej więcej tak:

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

    Zwróć uwagę na dane wyjściowe w przypadku następnego kroku.

  2. W programie Visual Studio Code utwórz plik o nazwie azuredeploy.parameters.json w tym samym katalogu, który zawiera plik azuredeploy.json.

  3. Dodaj tę zawartość do pliku 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. Zastąp wartość id (pusty ciąg) wartością skopiowaną w poprzednim kroku. Następnie zapisz plik.

Wdrażanie maszyny wirtualnej z systemem Linux

Tutaj możesz wdrożyć ten sam szablon usługi ARM, który wdrożono w poprzednim ćwiczeniu. Tym razem podajesz plik parametrów odwołujący się do hasła maszyny wirtualnej w magazynie kluczy.

Uruchom następujące polecenie az deployment group create w celu wdrożenia szablonu:

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

W poprzednim ćwiczeniu każdą parę klucz-wartość podano w argumencie --parameters. Tutaj określasz @azuredeploy.parameters.json, aby podać plik parametrów.

Parametr dnsLabelPrefix ma wartość vm2-, po której następuje losowa liczba. Jest to wymagane w celu upewnienia się, że nazwa DNS różni się od nazwy DNS użytej w poprzednim ćwiczeniu.

Weryfikowanie wdrożenia

Tak jak w poprzednim ćwiczeniu, sprawdź, czy maszyna wirtualna została ustanowiona i czy można połączyć się z nią za pośrednictwem protokołu SSH. Dla zwięzłości tym razem pominiesz kilka kroków pośrednich.

  1. W celu nawiązania połączenia z maszyną wirtualną za pośrednictwem protokołu SSH wykonaj następujące czynności:

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

    Po wyświetleniu monitu wprowadź , yes aby kontynuować nawiązywanie połączenia. Następnie wprowadź hasło administratora. insecurepassword123!

  2. Z poziomu połączenia SSH z maszyną wirtualną uruchom polecenie hostname, aby wyświetlić nazwę hosta maszyny wirtualnej:

    hostname
    

    Zostanie wyświetlona wewnętrzna nazwa hosta maszyny wirtualnej: vm2

    vm2
    
  3. Uruchom polecenie exit, aby opuścić sesję SSH.

    exit
    

Świetnie! Wdrożenie zostało rozszerzone tak, aby zawierało plik parametrów, który odczytuje tajne informacje z magazynu kluczy.