Поделиться через


Развертывание VM с сертификатом, безопасно хранящимся в Azure Stack Hub

В этой статье описано, как развернуть виртуальную машину (VM) Azure Stack Hub с установленным сертификатом Key Vault.

Общие сведения

Сертификаты используются во многих сценариях, например для аутентификации в Active Directory или шифрования веб-трафика. Вы можете безопасно хранить сертификаты в виде секретов в хранилище ключей Azure Stack Hub. Хранилище ключей Azure Stack обеспечивает следующие преимущества:

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

Описание процесса

Ниже представлены шаги, которые необходимо предпринять для отправки сертификата на VM.

  1. Создайте секрет хранилища ключей.
  2. Обновите файл azuredeploy.parameters.json .
  3. Разверните шаблон.

Примечание

Эти шаги можно выполнить из Пакета средств разработки Azure Stack (ASDK) или из внешнего клиента при подключении через VPN.

Предварительные требования

Создание секрета хранилища ключей

Следующий скрипт создает сертификат в формате PFX, создает хранилище ключей и сохраняет в нем сертификат в качестве секрета. Параметр contentType секрета должен иметь значение pfx.

Важно!

Используйте параметр -EnabledForDeployment при создании хранилища ключей. Благодаря этому параметру на хранилище ключей можно ссылаться из шаблонов Azure Resource Manager.

# Create a certificate in the .pfx format
New-SelfSignedCertificate `
  -certstorelocation cert:\LocalMachine\My `
  -dnsname contoso.microsoft.com

$pwd = ConvertTo-SecureString `
  -String "<Password used to export the certificate>" `
  -Force `
  -AsPlainText

Export-PfxCertificate `
  -cert "cert:\localMachine\my\<certificate thumbprint that was created in the previous step>" `
  -FilePath "<Fully qualified path to where the exported certificate can be stored>" `
  -Password $pwd

# Create a key vault and upload the certificate into the key vault as a secret
$vaultName = "contosovault"
$resourceGroup = "contosovaultrg"
$location = "local"
$secretName = "servicecert"
$fileName = "<Fully qualified path to where the exported certificate can be stored>"
$certPassword = "<Password used to export the certificate>"

$fileContentBytes = get-content $fileName `
  -Encoding Byte

$fileContentEncoded = [System.Convert]::ToBase64String($fileContentBytes)
$jsonObject = @"
{
"data": "$filecontentencoded",
"dataType" :"pfx",
"password": "$certPassword"
}
"@
$jsonObjectBytes = [System.Text.Encoding]::UTF8.GetBytes($jsonObject)
$jsonEncoded = [System.Convert]::ToBase64String($jsonObjectBytes)

New-AzResourceGroup `
  -Name $resourceGroup `
  -Location $location

New-AzKeyVault `
  -VaultName $vaultName `
  -ResourceGroupName $resourceGroup `
  -Location $location `
  -sku standard `
  -EnabledForDeployment

$secret = ConvertTo-SecureString `
  -String $jsonEncoded `
  -AsPlainText -Force

Set-AzureKeyVaultSecret `
  -VaultName $vaultName `
  -Name $secretName `
   -SecretValue $secret

В результате выполнения этого скрипта был выведен URI секрета. Запишите этот универсальный код ресурса (URI) так как на него необходимо указать ссылку при отправке сертификата в шаблон Resource Manager для Windows. Скачайте папку шаблона vm-push-certificate-windows template на компьютер разработчика. В этой папке содержатся файлы azuredeploy.json и azuredeploy.parameters.json, которые требуются в следующих шагах.

Измените файл azuredeploy.parameters.json в соответствии со значениями своей среды. К важным параметрам относятся имя хранилища, группа ресурсов хранилища и URI секрета (сгенерированный предыдущим скриптом). Ниже приведен пример файла параметров.

Обновление файла azuredeploy.parameters.json

Обновите файл azuredeploy.parameters.json, указав vaultName, URI секрета, VmName и другие параметры для своей среды. Ниже приведен пример JSON-файла параметров шаблона:

{
  "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentParameters.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "newStorageAccountName": {
      "value": "kvstorage01"
    },
    "vmName": {
      "value": "VM1"
    },
    "vmSize": {
      "value": "Standard_D1_v2"
    },
    "adminUserName": {
      "value": "demouser"
    },
    "adminPassword": {
      "value": "demouser@123"
    },
    "vaultName": {
      "value": "contosovault"
    },
    "vaultResourceGroup": {
      "value": "contosovaultrg"
    },
    "secretUrlWithVersion": {
      "value": "https://testkv001.vault.local.azurestack.external/secrets/testcert002/82afeeb84f4442329ce06593502e7840"
    }
  }
}

Развертывание шаблона

Разверните шаблон с помощью следующего скрипта PowerShell:

# Deploy a Resource Manager template to create a VM and push the secret to it
New-AzResourceGroupDeployment `
  -Name KVDeployment `
  -ResourceGroupName $resourceGroup `
  -TemplateFile "<Fully qualified path to the azuredeploy.json file>" `
  -TemplateParameterFile "<Fully qualified path to the azuredeploy.parameters.json file>"

При успешном развертывании шаблона выводятся следующие выходные данные:

Результаты развертывания шаблона

При развертывании этой ВМ Azure Stack Hub отправляет на нее сертификат. Расположение сертификата зависит от операционной системы VM.

  • В Windows сертификат добавляется в расположение сертификата LocalMachine с хранилищем сертификатов, предоставленным пользователем.
  • В Linux сертификат размещается в каталоге /var/lib/waagent: файл сертификата X509 с именем UppercaseThumbprint.crt и файл закрытого ключа с именем UppercaseThumbprint.prv.

Списание сертификатов

Прекращение использования сертификатов — это часть процесса управления сертификатами. Вы не можете удалить более раннюю версию сертификата, но ее можно отключить с помощью командлета Set-AzureKeyVaultSecretAttribute.

В примере ниже показано, как отключить сертификат. Для параметров VaultName, Name и Version используйте свои значения.

Set-AzureKeyVaultSecretAttribute -VaultName contosovault -Name servicecert -Version e3391a126b65414f93f6f9806743a1f7 -Enable 0

Дальнейшие действия