Implementación de una máquina virtual con un certificado almacenado de forma segura en Azure Stack Hub

En este artículo se describe cómo implementar una máquina virtual de Azure Stack Hub con un certificado de Key Vault instalado.

Información general

Los certificados se usan en muchos escenarios, como la autenticación en Active Directory o el cifrado del tráfico web. Puede almacenar certificados como secretos de forma segura en un almacén de claves de Azure Stack Hub. Las ventajas de usar Key Vault de Azure Stack Hub son:

  • Los certificados no se exponen en un script, un historial de línea de comandos o una plantilla.
  • El proceso de administración de certificados es más sencillo.
  • Tiene el control de las claves de acceso a los certificados.

Descripción del proceso

Los pasos siguientes describen el proceso necesario para insertar un certificado en la VM:

  1. Cree un secreto de almacén de claves.
  2. Actualice el archivo azuredeploy.parameters.json.
  3. Implemente la plantilla.

Nota:

Puede seguir estos pasos desde el Kit de desarrollo de Azure Stack (ASDK) o desde un cliente externo, si se conecta a través de VPN.

Prerrequisitos

Creación de un secreto de almacén de claves

El script siguiente crea un certificado con el formato .pfx, crea un almacén de claves y almacena el certificado en el almacén de claves como un secreto. El valor de contentType del secreto debe establecerse en pfx.

Importante

Debe usar el parámetro -EnabledForDeployment cuando cree el almacén de datos. Este parámetro garantiza que se puede hacer referencia al almacén de claves desde las plantillas de 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

Cuando ejecuta este script, la salida incluye el identificador URI del secreto. Tome nota de este identificador URI, ya que tendrá que hacer referencia a él para la Inserción de un certificado en la plantilla del Administrador de recursos de Windows. Descargue la carpeta de la plantilla vm-push-certificate-windows en el equipo de desarrollo. Esta carpeta contiene los archivos azuredeploy.json y azuredeploy.parameters.json, que necesitará para los pasos siguientes.

Modifique el archivo azuredeploy.parameters.json según los valores del entorno. Los parámetros importantes son el nombre del almacén, el grupo de recursos del almacén y el identificador URI del secreto (que se generó en el script anterior). En la sección siguiente se ofrece un ejemplo de un archivo de parámetros.

Actualice el archivo azuredeploy.parameters.json

Actualice el archivo azuredeploy.parameters.json con los valor de vaultName, el URI del secreto, el valor de VmName y otros valores según el entorno. El siguiente archivo JSON muestra un ejemplo del archivo de parámetros de plantilla:

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

Implementación de la plantilla

Implemente la plantilla con el siguiente script de 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>"

Cuando la plantilla se ha implementado correctamente, muestra la siguiente salida:

Resultados de la implementación de plantilla

Azure Stack Hub inserta el certificado en la máquina virtual durante la implementación. La ubicación del certificado depende del sistema operativo de la VM:

  • En Windows, el certificado se agrega a la ubicación de certificados LocalMachine, con el almacén de certificados que el usuario proporcionó.
  • En Linux, el certificado se coloca en el directorio /var/lib/waagent, con el nombre de archivo UppercaseThumbprint.crt para el archivo de certificado X509 y UppercaseThumbprint.prv para la clave privada.

Retirada de certificados

La retirada de certificados forma parte del proceso de administración de certificados. No se puede eliminar la versión anterior de un certificado, pero se puede deshabilitar mediante el cmdlet Set-AzureKeyVaultSecretAttribute.

En el ejemplo siguiente se muestra cómo deshabilitar un certificado. Use sus propios valores para los parámetros VaultName, Name y Version.

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

Pasos siguientes