Implantar uma VM com um certificado armazenado com segurança no Azure Stack Hub
Este artigo descreve como implantar uma máquina virtual (VM) do Azure Stack Hub com um certificado do Cofre da Chave instalado.
Visão geral
Os certificados são usados em muitos cenários, como a autenticação no Ative Directory ou a criptografia do 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:
- Crie um segredo do cofre de chaves.
- Atualize o arquivo azuredeploy.parameters.json.
- Implante o modelo.
Observação
Pode utilizar estes passos a partir do Azure Stack Development Kit (ASDK) ou de um cliente externo se estiver ligado através de VPN.
Pré-requisitos
- Tem de subscrever uma oferta que inclua o serviço Key Vault.
- Instalar o PowerShell para Azure Stack Hub.
- Configure o ambiente PowerShell do usuário do Azure Stack Hub.
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
Tem de usar o parâmetro -EnabledForDeployment
ao criar o cofre de chaves. Esse parâmetro garante que o cofre de chaves possa ser referenciado a partir de modelos do 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
Quando você executa esse script, a saída inclui o URI secreto. Anote esse URI, pois você deve fazer referência a ele no Push certificate to Windows Resource Manager template. Transfira a pasta de modelos vm-push-certificate-windows para o seu computador de desenvolvimento. Esta pasta contém os arquivos azuredeploy.json e azuredeploy.parameters.json, que você precisa nas etapas a seguir.
Modifique o arquivo azuredeploy.parameters.json de acordo com os valores do seu ambiente. Os parâmetros importantes são o nome do vault, o grupo de recursos do vault e o URI secreto (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 os parâmetros vaultName
, URI secreto, VmName
e outros de acordo com seu ambiente. O seguinte arquivo JSON 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:
O Azure Stack Hub envia o certificado para a VM durante a implantação. O local do certificado depende do sistema operacional da VM:
- No Windows, o certificado é adicionado ao LocalMachine local do certificado, com o armazenamento de certificados fornecido pelo usuário.
- No Linux, o certificado é colocado sob o 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.
Revogar certificados
A desativação de certificados faz parte do processo de gerenciamento de certificados. Não é possível excluir a versão mais antiga de um certificado, mas você pode desabilitá-la usando o cmdlet Set-AzureKeyVaultSecretAttribute
.
O exemplo a seguir mostra como desabilitar um certificado. Use seus próprios valores para os parâmetros VaultName
, Name
e Version
.
Set-AzureKeyVaultSecretAttribute -VaultName contosovault -Name servicecert -Version e3391a126b65414f93f6f9806743a1f7 -Enable 0