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

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

Descrição Geral

Os certificados são utilizados em muitos cenários, como a autenticação no Active Directory ou a encriptação do tráfego da Web. Pode armazenar certificados de forma segura como segredos num cofre de chaves do Azure Stack Hub. As vantagens de utilizar o Azure Stack Hub Key Vault são:

  • Os certificados não são expostos num script, histórico de linha de comandos ou modelo.
  • O processo de gestão de certificados é simplificado.
  • Tem controlo sobre as chaves que acedem aos certificados.

Descrição do processo

Os passos seguintes descrevem o processo necessário para emitir um certificado para a VM:

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

Nota

Pode utilizar estes passos do Azure Stack Development Kit (ASDK) ou de um cliente externo se estiver ligado através de VPN.

Pré-requisitos

Criar um segredo do cofre de chaves

O script seguinte cria um certificado no formato .pfx, cria um cofre de chaves e armazena o certificado no cofre de chaves como segredo. O contentType segredo tem de ser definido como pfx.

Importante

Tem de utilizar o -EnabledForDeployment parâmetro ao criar o cofre de chaves. Este parâmetro garante que o cofre de chaves pode ser referenciado a partir de 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 executa este script, o resultado inclui o URI secreto. Tome nota deste URI, pois tem de referenciá-lo no modelo Emitir certificado para Windows Resource Manager. Transfira a pasta de modelo vm-push-certificate-windows para o seu computador de desenvolvimento. Esta pasta contém os ficheiros azuredeploy.json e azuredeploy.parameters.json , de que precisa nos passos seguintes.

Modifique o ficheiro azuredeploy.parameters.json de acordo com os valores do ambiente. Os parâmetros importantes são o nome do cofre, o grupo de recursos do cofre e o URI secreto (tal como gerado pelo script anterior). A secção seguinte mostra um exemplo de um ficheiro de parâmetros.

Atualizar o ficheiro azuredeploy.parameters.json

Atualize o ficheiro azuredeploy.parameters.json com o , o vaultNameURI secreto e VmNameoutros parâmetros de acordo com o seu ambiente. O seguinte ficheiro JSON mostra um exemplo do ficheiro de parâmetros do 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"
    }
  }
}

Implementar o modelo

Implemente o modelo com 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 é implementado com êxito, apresenta o seguinte resultado:

Resultados da implementação do modelo

O Azure Stack Hub envia o certificado para a VM durante a implementação. A localização do certificado depende do sistema operativo da VM:

  • No Windows, o certificado é adicionado à localização do certificado LocalMachine , com o arquivo de certificados que o utilizador forneceu.
  • No Linux, o certificado é colocado no 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.

Extinguir certificados

A extinção de certificados faz parte do processo de gestão de certificados. Não pode eliminar a versão mais antiga de um certificado, mas pode desativá-lo com o Set-AzureKeyVaultSecretAttribute cmdlet .

O exemplo seguinte mostra como desativar um certificado. Utilize os seus próprios valores para os VaultNameparâmetros , Namee Version .

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

Passos seguintes