Implantar uma VM com um certificado armazenado com segurança no Azure Stack Hub

Este artigo descreve como implantar uma VM (máquina virtual) do Azure Stack Hub com um certificado Key Vault instalado.

Visão geral

Os certificados são usados em muitos cenários, como autenticação no Active Directory ou criptografia de tráfego da Web. Você pode armazenar certificados com segurança como segredos em um cofre de chaves do Azure Stack Hub. Os benefícios de usar o Azure Stack Hub Key Vault são:

  • Os certificados não são expostos em um script, histórico de linha de comando ou modelo.
  • O processo de gerenciamento de certificados é simplificado.
  • Você tem controle das chaves que acessam certificados.

Descrição do processo

As etapas a seguir descrevem o processo necessário para enviar um certificado por push para a VM:

  1. Crie um segredo do cofre de chaves.
  2. Atualize o arquivo azuredeploy.parameters.json .
  3. Implante o modelo.

Observação

Você pode usar essas etapas do ASDK (Azure Stack Development Kit) ou de um cliente externo se estiver conectado por meio de VPN.

Pré-requisitos

Criar um segredo do cofre de chaves

O script a seguir cria um certificado no formato .pfx, cria um cofre de chaves e armazena o certificado no cofre de chaves como um segredo. O contentType do segredo deve ser definido como pfx.

Importante

Você deve usar o -EnabledForDeployment parâmetro ao criar o cofre de chaves. Esse parâmetro garante que o cofre de chaves possa ser referenciado nos modelos de Resource Manager do Azure.

# 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 você executa esse script, a saída inclui o URI do segredo. Anote esse URI, pois você deve referenciá-lo no modelo Enviar certificado por push para o Windows Resource Manager. Baixe a pasta de modelo vm-push-certificate-windows no computador de desenvolvimento. Essa pasta contém os arquivos azuredeploy.json e azuredeploy.parameters.json , necessários nas etapas a seguir.

Modifique o arquivo azuredeploy.parameters.json de acordo com os valores de ambiente. Os parâmetros importantes são o nome do cofre, o grupo de recursos do cofre e o URI do segredo (conforme gerado pelo script anterior). A seção a seguir mostra um exemplo de um arquivo de parâmetro.

Atualizar o arquivo azuredeploy.parameters.json

Atualize o arquivo azuredeploy.parameters.json com o , o vaultNameURI do segredo, VmNamee outros parâmetros de acordo com seu ambiente. O arquivo JSON a seguir mostra um exemplo do arquivo de parâmetros de modelo:

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

Implantar o modelo

Implante o modelo usando o seguinte script do 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>"

Quando o modelo é implantado com êxito, ele exibe a seguinte saída:

Resultados da implantação de modelo

O Azure Stack Hub envia o certificado por push para a VM durante a implantação. O local do certificado depende do sistema operacional da VM:

  • No Windows, o certificado é adicionado ao local do certificado LocalMachine , com o repositório de certificados fornecido pelo usuário.
  • No Linux, o certificado é colocado no diretório /var/lib/waagent , com o nome do arquivo UppercaseThumbprint.crt para o arquivo de certificado X509 e UppercaseThumbprint.prv para a chave privada.

Desativar certificados

A desativação de certificados faz parte do processo de gerenciamento de certificados. Você não pode excluir a versão mais antiga de um certificado, mas pode desabilitá-lo usando o Set-AzureKeyVaultSecretAttribute cmdlet .

O exemplo a seguir mostra como desabilitar um certificado. Use seus próprios valores para os VaultNameparâmetros , Namee Version .

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

Próximas etapas