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:
- Cree un secreto de almacén de claves.
- Actualice el archivo azuredeploy.parameters.json.
- 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
- Debe suscribirse a una oferta que incluya el servicio Key Vault.
- Instale PowerShell para Azure Stack Hub.
- Configure el entorno de PowerShell del usuario de Azure Stack Hub.
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:
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