Упражнение. Управление секретами в шаблоне ARM

Завершено

В предыдущем упражнении вы запустили базовый шаблон Azure Resource Manager (ARM), который подготавливает виртуальную машину Linux. В этом разделе вы выполните аналогичную процедуру.

На этот раз вместо того, чтобы передавать пароль в качестве параметра, пароль сохраняется в Azure Key Vault. Чтобы включить шаблон ARM для доступа к паролю, создайте файл параметров, который указывает на секрет в хранилище ключей из вашей подписки.

Развертывание Azure Key Vault

Примечание.

Из-за ограничений, связанных с песочницей, можно создать хранилище ключей в Azure Key Vault на портале Azure. Обычно для создания хранилища ключей из Azure PowerShell используется командлет New-AzKeyVault.

Создайте хранилище ключей и разрешите доступ во время развертывания. Для этого:

  1. Создайте переменную PowerShell, содержащую имя хранилища ключей:

    $KVNAME="tailwind-secrets" + (Get-Random -Count 1 -Maximum 9999999)
    
  2. Выполните $KVNAME, чтобы вывести его значение:

    $KVNAME
    

    Выходные данные будут похожи на это (реальное значение будет отличаться):

    tailwind-secrets5978564
    

    Скопируйте значение в удобное место, чтобы воспользоваться им на следующем шаге.

  3. Войдите на портал Azure, используя ту же учетную запись, с помощью которой вы активировали песочницу.

  4. В меню портала Azure или на странице Домашняя выберите Создать ресурс.

  5. В поле поиска введите Key Vault.

  6. Выберите Key Vault из списка и нажмите кнопку Создать, чтобы начать настройку хранилища ключей.

  7. На панели создания укажите следующие значения:

    1. Resource group: имя группы ресурсов.
    2. Имя хранилища ключей: Ваше значение $KVNAME, например, tailwind-secrets5978564.
  8. Выберите Review + create (Просмотреть и создать).

  9. Нажмите кнопку создания. Это займет около минуты. После создания ресурса выберите команду Перейти к ресурсу.

  10. Выберите "Конфигурация доступа" в Параметры. Включите параметр Azure Resource Manager для развертывания шаблона и выберите "Применить".

  11. В сеансе PowerShell выполните командлет ConvertTo-SecureString и назначьте ее результат переменной secretSecureString:

    $secretSecureString = ConvertTo-SecureString 'insecurepassword123!' -AsPlainText -Force
    
  12. Выполните следующую команду Set-AzKeyVaultSecret, чтобы создать секрет в хранилище ключей. Секрету присваивается имя vmPassword со значением insecurepassword123!:

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

Создание файла параметров

Здесь создается файл параметров, содержащий имя виртуальной машины, имя пользователя администратора и ссылку на пароль виртуальной машины в хранилище ключей.

Параметры можно передать в шаблоны из командной строки. Напоминаем, что файл параметров — это альтернативный способ передачи параметров в шаблон ARM во время развертывания. Файл параметров позволяет получить доступ к секретам хранилища ключей из шаблона.

  1. Выполните следующую команду Get-AzKeyVault, чтобы вывести идентификатор Key Vault:

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

    Результат будет примерно таким:

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

    Эти выходные данные потребуются на следующем шаге.

  2. В Visual Studio Code создайте файл с именем azuredeploy.parameters.json в том же каталоге, который содержит azuredeploy.json.

  3. Добавьте это содержимое в файл 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. Замените значение id (пустая строка) значением, скопированным на предыдущем шаге. Затем сохраните файл.

Развертывание виртуальной машины Linux

Здесь развертывается тот же шаблон ARM, который был развернут в предыдущем упражнении. На этот раз вы предоставляете файл параметров, который ссылается на пароль виртуальной машины в хранилище ключей.

  1. Выполните приведенную ниже команду New-AzResourceGroupDeployment.

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

    В предыдущем упражнении вы указывали каждую пару "ключ-значение" непосредственно из командной строки. Здесь указывается "./azuredeploy.parameters.json", чтобы предоставить файл параметров.

    Для dnsLabelPrefix задано значение vm2-, за которым следует случайное число. Это необходимо для того, чтобы это DNS-имя отличалось от DNS-имени, использованного в предыдущем упражнении.

Проверка развертывания

Убедитесь, что виртуальная машина подготовлена и к ней можно подключиться по протоколу SSH. Для этого:

  1. Выполните команду Invoke-Expression, чтобы подключиться к виртуальной машине с помощью SSH:

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

    При появлении запроса введите yes , чтобы продолжить подключение. Затем введите пароль администратора. insecurepassword123!

    Важно!

    На практике пароли следует хранить в надежном месте. Также можно использовать проверку подлинности с открытым ключом, которая обычно безопаснее, чем использование паролей.

  2. В SSH-сеансе с виртуальной машиной выполните команду hostname, чтобы вывести имя узла виртуальной машины:

    hostname
    

    Вы увидите внутреннее имя узла виртуальной машины: vm1

    vm2
    
  3. Введите exit, чтобы выйти из SSH-сеанса.

    exit
    

Отличная работа! Вы расширили развертывание, включив в него файл параметров, который считывает данные секрета из хранилища ключей.

Развертывание Azure Key Vault

В Azure Key Vault создайте хранилище ключей и добавьте пароль виртуальной машины в качестве безопасного секрета. Для этого:

  1. Создайте переменную bash, содержащую имя хранилища ключей.

    KVNAME=tailwind-secrets$RANDOM
    

    Имена хранилища должны быть уникальными. Часть $RANDOM гарантирует, что имя хранилища ключей заканчивается случайной серией чисел.

  2. Выполните следующую команду az keyvault create, чтобы создать хранилище ключей.

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

    Аргумент --enabled-for-template-deployment позволяет шаблону Azure Resource Manager (ARM) извлекать секреты из хранилища ключей.

  3. Выполните следующую команду az keyvault secret set, чтобы создать секрет в хранилище ключей. Секрету присваивается имя vmPassword со значением insecurepassword123!:

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

Создание файла параметров

Здесь создается файл параметров, содержащий имя виртуальной машины, имя пользователя администратора и ссылку на пароль виртуальной машины в хранилище ключей.

Параметры можно передать в шаблоны из командной строки. Напоминаем, что файл параметров — это альтернативный способ передачи параметров в шаблон ARM во время развертывания. Файл параметров позволяет получить доступ к секретам хранилища ключей из шаблона.

  1. Выполните следующую команду az keyvault show, чтобы вывести идентификатор Key Vault:

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

    Результат будет примерно таким:

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

    Эти выходные данные потребуются на следующем шаге.

  2. В Visual Studio Code создайте файл с именем azuredeploy.parameters.json в том же каталоге, который содержит azuredeploy.json.

  3. Добавьте это содержимое в файл 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. Замените значение id (пустая строка) значением, скопированным на предыдущем шаге. Затем сохраните файл.

Развертывание виртуальной машины Linux

Здесь развертывается тот же шаблон ARM, который был развернут в предыдущем упражнении. На этот раз вы предоставляете файл параметров, который ссылается на пароль виртуальной машины в хранилище ключей.

Чтобы развернуть шаблон, выполните приведенную ниже команду az deployment group create.

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

В предыдущем упражнении вы указали каждую пару "ключ-значение" в аргументе --parameters. Здесь указывается @azuredeploy.parameters.json, чтобы предоставить файл параметров.

Для dnsLabelPrefix задано значение vm2-, за которым следует случайное число. Это необходимо для того, чтобы это DNS-имя отличалось от DNS-имени, использованного в предыдущем упражнении.

Проверка развертывания

Как и в предыдущем упражнении, убедитесь, что виртуальная машина подготовлена и подключается по протоколу SSH. Для краткости на этот раз некоторые промежуточные шаги будут пропущены.

  1. Выполните следующую команду, чтобы подключиться к виртуальной машине по протоколу SSH:

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

    При появлении запроса введите yes , чтобы продолжить подключение. Затем введите пароль администратора. insecurepassword123!

  2. В SSH-сеансе с виртуальной машиной выполните команду hostname, чтобы вывести имя узла виртуальной машины:

    hostname
    

    Вы увидите внутреннее имя узла виртуальной машины: vm2

    vm2
    
  3. Введите exit, чтобы выйти из SSH-сеанса.

    exit
    

Отличная работа! Вы расширили развертывание, включив в него файл параметров, который считывает данные секрета из хранилища ключей.