Implementar um VM com um certificado armazenado de forma segura no Azure Stack HubDeploy a VM with a securely stored certificate on Azure Stack Hub

Este artigo descreve como implantar uma máquina virtual Azure Stack Hub (VM) com um certificado Key Vault instalado.This article describes how to deploy an Azure Stack Hub virtual machine (VM) with a Key Vault certificate installed.

Descrição geralOverview

Os certificados são usados em muitos cenários, tais como autenticação no Ative Directory ou encriptação do tráfego web.Certificates are used in many scenarios, such as authenticating to Active Directory, or encrypting web traffic. Você pode armazenar certificados de forma segura como segredos em um cofre chave Azure Stack Hub.You can securely store certificates as secrets in an Azure Stack Hub key vault. Os benefícios da utilização do Azure Stack Hub Key Vault são:The benefits of using Azure Stack Hub Key Vault are:

  • Os certificados não são expostos num script, histórico de linha de comando ou modelo.Certificates are not exposed in a script, command-line history, or template.
  • O processo de gestão de certificados é simplificado.The certificate management process is streamlined.
  • Tem o controlo das chaves que acedem aos certificados.You have control of the keys that access certificates.

Descrição do processoProcess description

Os seguintes passos descrevem o processo necessário para empurrar um certificado para o VM:The following steps describe the process required to push a certificate to the VM:

  1. Criar um segredo chave do cofre.Create a key vault secret.
  2. Atualize o azuredeploy.parameters.jsno ficheiro.Update the azuredeploy.parameters.json file.
  3. Implemente o modelo.Deploy the template.

Nota

Pode utilizar estes passos a partir do Kit de Desenvolvimento da Pilha de Azure (ASDK), ou de um cliente externo se estiver conectado através da VPN.You can use these steps from the Azure Stack Development Kit (ASDK), or from an external client if you're connected through VPN.

Pré-requisitosPrerequisites

Criar um segredo chave do cofreCreate a key vault secret

O seguinte script cria um certificado no formato .pfx, cria um cofre chave e armazena o certificado no cofre de chaves como um segredo.The following script creates a certificate in the .pfx format, creates a key vault, and stores the certificate in the key vault as a secret. O contentType segredo deve ser definido para pfx .The contentType of the secret must be set to pfx.

Importante

Deve utilizar o -EnabledForDeployment parâmetro ao criar o cofre da chave.You must use the -EnabledForDeployment parameter when creating the key vault. Este parâmetro garante que o cofre chave pode ser referenciado a partir de modelos do Gestor de Recursos Azure.This parameter ensures that the key vault can be referenced from Azure Resource Manager templates.

# 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

Quando executar este script, a saída inclui o URI secreto.When you run this script, the output includes the secret URI. Tome nota deste URI, uma vez que deve fazê-lo referenciar no certificado Push ao modelo do Gestor de Recursos do Windows.Make a note of this URI, as you must reference it in the Push certificate to Windows Resource Manager template. Descarregue a pasta do modelo de janelas de certificados vm-push para o seu computador de desenvolvimento.Download the vm-push-certificate-windows template folder to your development computer. Esta pasta contém a azuredeploy.jse azuredeploy.parameters.jsem ficheiros, que necessita nos seguintes passos.This folder contains the azuredeploy.json and azuredeploy.parameters.json files, which you need in the following steps.

Modifique a azuredeploy.parameters.jsno ficheiro de acordo com os valores ambientais.Modify the azuredeploy.parameters.json file according to your environment values. Os parâmetros importantes são o nome do cofre, o grupo de recursos do cofre e o URI secreto (como gerado pelo script anterior).The important parameters are the vault name, the vault resource group, and the secret URI (as generated by the previous script). A seguinte secção mostra um exemplo de um ficheiro de parâmetro.The following section shows an example of a parameter file.

Atualizar o azuredeploy.parameters.jsno ficheiroUpdate the azuredeploy.parameters.json file

Atualize a azuredeploy.parameters.jsem arquivo com o vaultName URI secreto, VmName e outros parâmetros conforme o seu ambiente.Update the azuredeploy.parameters.json file with the vaultName, secret URI, VmName, and other parameters as per your environment. O seguinte ficheiro JSON mostra um exemplo do ficheiro de parâmetros do modelo:The following JSON file shows an example of the template parameters file:

{
  "$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"
    }
  }
}

Implementar o modeloDeploy the template

Implemente o modelo utilizando o seguinte script PowerShell:Deploy the template by using the following PowerShell script:

# 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>"

Quando o modelo é implantado com sucesso, apresenta a seguinte saída:When the template is deployed successfully, it displays the following output:

Resultados da implementação do modelo

O Azure Stack Hub empurra o certificado para o VM durante a implantação.Azure Stack Hub pushes the certificate to the VM during deployment. A localização do certificado depende do sistema operativo do VM:The certificate location depends on the operating system of the VM:

  • No Windows, o certificado é adicionado ao certificado LocalMachine, com a loja de certificados que o utilizador forneceu.In Windows, the certificate is added to the LocalMachine certificate location, with the certificate store that the user provided.
  • No Linux, o certificado é colocado sob o diretório /var/lib/waagent, com o nome de ficheiro UppercaseThumbprint.crt para o ficheiro de certificado X509 e UppercaseThumbprint.prv para a chave privada.In Linux, the certificate is placed under the /var/lib/waagent directory, with the file name UppercaseThumbprint.crt for the X509 certificate file and UppercaseThumbprint.prv for the private key.

Certificados de aposentaçãoRetire certificates

A aposentação dos certificados faz parte do processo de gestão de certificados.Retiring certificates is part of the certificate management process. Não é possível eliminar a versão mais antiga de um certificado, mas pode desativá-la utilizando o Set-AzureKeyVaultSecretAttribute cmdlet.You can't delete the older version of a certificate, but you can disable it by using the Set-AzureKeyVaultSecretAttribute cmdlet.

O exemplo a seguir mostra como desativar um certificado.The following example shows how to disable a certificate. Use os seus próprios valores para os VaultName Name parâmetros e Version parâmetros.Use your own values for the VaultName, Name, and Version parameters.

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

Passos seguintesNext steps