Distribuire una macchina virtuale con un certificato archiviato in modo sicuro nell'hub di Azure Stack

Questo articolo descrive come distribuire una macchina virtuale (VM) dell'hub di Azure Stack con un certificato Key Vault installato.

Panoramica

I certificati vengono usati in molti scenari, ad esempio l'autenticazione in Active Directory o la crittografia del traffico Web. È possibile archiviare in modo sicuro i certificati come segreti in un insieme di credenziali delle chiavi dell'hub di Azure Stack. I vantaggi dell'uso dell'hub di Azure Stack Key Vault sono:

  • I certificati non vengono esposti in uno script, in una cronologia della riga di comando o in un modello.
  • Il processo di gestione dei certificati è semplificato.
  • È possibile controllare le chiavi che accedono ai certificati.

Descrizione del processo

I passaggi seguenti descrivono il processo necessario per eseguire il push di un certificato nella macchina virtuale:

  1. Creare un segreto dell'insieme di credenziali delle chiavi.
  2. Aggiornare il file azuredeploy.parameters.json .
  3. Distribuire il modello.

Nota

È possibile usare questi passaggi da Azure Stack Development Kit (ASDK) o da un client esterno se si è connessi tramite VPN.

Prerequisiti

Crea un segreto dell'insieme di credenziali delle chiavi

Lo script seguente crea un certificato nel formato pfx, crea un insieme di credenziali delle chiavi e archivia il certificato nell'insieme di credenziali delle chiavi come segreto. L'oggetto contentType del segreto deve essere impostato su pfx.

Importante

È necessario usare il -EnabledForDeployment parametro durante la creazione dell'insieme di credenziali delle chiavi. Questo parametro garantisce che sia possibile fare riferimento all'insieme di credenziali delle chiavi dai modelli di 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 si esegue questo script, l'output include l'URI del segreto. Prendere nota di questo URI, perché è necessario farvi riferimento nel modello Push certificate to Windows Resource Manager (Esegui push certificato a Windows Resource Manager). Scaricare la cartella del modello vm-push-certificate-windows nel computer di sviluppo. Questa cartella contiene i file azuredeploy.json e azuredeploy.parameters.json necessari nei passaggi seguenti.

Modificare il file azuredeploy.parameters.json in base ai valori dell'ambiente. I parametri importanti sono il nome dell'insieme di credenziali, il gruppo di risorse dell'insieme di credenziali e l'URI del segreto (come generato dallo script precedente). La sezione seguente illustra un esempio di file di parametri.

Aggiornare il file azuredeploy.parameters.json

Aggiornare il file azuredeploy.parameters.json con l'URI del segreto, VmNamee altri parametri in base all'ambientevaultName. Il file JSON seguente mostra un esempio del file di parametri del modello:

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

Distribuire il modello

Distribuire il modello usando lo script di PowerShell seguente:

# 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 il modello viene distribuito correttamente, viene visualizzato l'output seguente:

Risultati della distribuzione dei modelli

L'hub di Azure Stack esegue il push del certificato nella macchina virtuale durante la distribuzione. Il percorso del certificato dipende dal sistema operativo della macchina virtuale:

  • In Windows il certificato viene aggiunto al percorso del certificato LocalMachine , con l'archivio certificati fornito dall'utente.
  • In Linux il certificato viene inserito nella directory /var/lib/waagent , con il nome di file UppercaseThumbprint.crt per il file di certificato X509 e UppercaseThumbprint.prv per la chiave privata.

Ritirare i certificati

Il ritiro dei certificati fa parte del processo di gestione dei certificati. Non è possibile eliminare la versione precedente di un certificato, ma è possibile disabilitarla usando il Set-AzureKeyVaultSecretAttribute cmdlet .

Nell'esempio seguente viene illustrato come disabilitare un certificato. Usare i propri valori per i VaultNameparametri , Namee Version .

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

Passaggi successivi