Script di esempio per Crittografia dischi di Azure

Importante

Crittografia dischi di Azure è pianificato per il ritiro il 15 settembre 2028. Fino a tale data, è possibile continuare a usare Crittografia dischi di Azure senza interruzioni. Il 15 settembre 2028 i carichi di lavoro abilitati per ADE continueranno a essere eseguiti, ma i dischi crittografati non riusciranno a sbloccarsi dopo il riavvio della macchina virtuale, causando un'interruzione del servizio.

Usare la crittografia nell'host per le nuove macchine virtuali o prendere in considerazione le dimensioni delle macchine virtuali riservate con crittografia del disco del sistema operativo per i carichi di lavoro di computing riservato. Tutte le macchine virtuali abilitate per ADE (inclusi i backup) devono eseguire la migrazione alla crittografia nell'host prima della data di ritiro per evitare interruzioni del servizio. Per informazioni dettagliate, vedere Eseguire la migrazione da Crittografia dischi di Azure alla crittografia nell'host .

Si applica a: ✔️ macchine virtuali di Windows

Questo articolo fornisce script di esempio per la preparazione di dischi rigidi virtuali pre-crittografati e altre attività.

Note

Tutti gli script fanno riferimento alla versione più recente, non AAD di Crittografia dischi di Azure, tranne dove indicato.

Esempi di script di PowerShell per Crittografia dischi di Azure

  • Elencare tutte le macchine virtuali crittografate nella sottoscrizione

È possibile trovare tutte le macchine virtuali con crittografia ADE e la versione dell'estensione, in tutti i gruppi di risorse presenti in una sottoscrizione, usando lo script di PowerShellFind_1passAdeVersion_VM.ps1.

In alternativa, questi cmdlet mostrano tutte le macchine virtuali con crittografia ADE (ma non la versione dell'estensione):

$osVolEncrypted = {(Get-AzVMDiskEncryptionStatus -ResourceGroupName $_.ResourceGroupName -VMName $_.Name).OsVolumeEncrypted}
$dataVolEncrypted= {(Get-AzVMDiskEncryptionStatus -ResourceGroupName $_.ResourceGroupName -VMName $_.Name).DataVolumesEncrypted}
Get-AzVm | Format-Table @{Label="MachineName"; Expression={$_.Name}}, @{Label="OsVolumeEncrypted"; Expression=$osVolEncrypted}, @{Label="DataVolumesEncrypted"; Expression=$dataVolEncrypted}
  • Elencare tutte le istanze del set di scalabilità di macchine virtuali crittografate nella sottoscrizione

    È possibile trovare, in tutti i gruppi di risorse presenti in una sottoscrizione, tutte le istanze dei set di scalabilità di macchine virtuali crittografati con ADE e la versione dell'estensione utilizzando lo script PowerShell Find_1passAdeVersion_VMSS.ps1.

  • Elencare tutti i segreti di crittografia dischi usati per crittografare le macchine virtuali in un insieme di credenziali delle chiavi

Get-AzKeyVaultSecret -VaultName $KeyVaultName | where {$_.Tags.ContainsKey('DiskEncryptionKeyFileName')} | format-table @{Label="MachineName"; Expression={$_.Tags['MachineName']}}, @{Label="VolumeLetter"; Expression={$_.Tags['VolumeLetter']}}, @{Label="EncryptionKeyURL"; Expression={$_.Id}}

Uso dello script di PowerShell per i prerequisiti di Crittografia dischi di Azure

Se si ha già familiarità con i prerequisiti per Crittografia dischi di Azure, è possibile usare lo script di PowerShell per i prerequisiti di Crittografia dischi di Azure. Per un esempio d'uso di questo script di PowerShell, vedere Guida introduttiva alla crittografia di una macchina virtuale. È possibile rimuovere i commenti da una sezione dello script, a partire dalla riga 211, per crittografare tutti i dischi per le macchine virtuali esistenti in un gruppo di risorse esistente.

La tabella seguente illustra i parametri che è possibile usare nello script di PowerShell:

Parametro Descrizione Obbligatorio?
$resourceGroupName Nome del gruppo di risorse a cui appartiene il Key Vault. Lo script crea un nuovo gruppo di risorse con questo nome, se non esiste. True
$keyVaultName Nome dell'insieme di credenziali delle chiavi in cui inserire le chiavi di crittografia. Lo script crea un nuovo vault con questo nome, se non ne esiste già uno. True
$location Posizione del Key Vault. Assicurarsi che l'insieme di credenziali delle chiavi e le macchine virtuali da crittografare si trovino nella stessa area geografica. Ottenere un elenco di percorsi con Get-AzLocation. True
$subscriptionId Identificatore della sottoscrizione Azure da usare. Ottenere l'ID sottoscrizione con Get-AzSubscription. True
$aadAppName Nome dell'applicazione Microsoft Entra che scrive i segreti in Key Vault. Lo script crea una nuova applicazione con questo nome, se non esiste. Se questa app esiste già, passare il parametro aadClientSecret allo script. False
$aadClientSecret Segreto client dell'applicazione Microsoft Entra creata in precedenza. False
$keyEncryptionKeyName Nome della chiave di crittografia della chiave facoltativa in Key Vault. Lo script crea una nuova chiave con questo nome, se non esiste. False

Modelli di Gestione risorse

Crittografare o decrittografare le macchine virtuali senza un'app Microsoft Entra

Crittografare o decrittografare le macchine virtuali usando un'app Microsoft Entra

Preparare un disco rigido virtuale Windows pre-crittografato

Le sezioni seguenti illustrano come preparare un disco rigido virtuale pre-crittografato Windows per la distribuzione come disco rigido virtuale crittografato in Azure IaaS. Usare queste informazioni per preparare e avviare una nuova macchina virtuale Windows (VHD) in Azure Site Recovery o Azure. Per altre informazioni su come preparare e caricare un disco rigido virtuale, vedere Caricare un disco rigido virtuale generalizzato e usarlo per creare nuove macchine virtuali in Azure.

Aggiornare i criteri di gruppo per consentire la protezione non TPM del sistema operativo

Configurare l'impostazione Crittografia unità BitLocker di Criteri di gruppo per BitLocker, disponibile in Criteri del computer locale>Configurazione computer>Modelli amministrativi>Componenti di Windows. Cambiare questa impostazione in Unità del sistema operativo>Richiedi autenticazione aggiuntiva all'avvio>Consenti BitLocker senza un TPM compatibile, come illustrato nella figura seguente:

Microsoft Antimalware in Azure

Installare i componenti della funzionalità BitLocker

Per Windows Server 2012 e versioni successive, usare il comando seguente:

dism /online /Enable-Feature /all /FeatureName:BitLocker /quiet /norestart

Per Windows Server 2008 R2, usare il comando seguente:

ServerManagerCmd -install BitLockers

Preparare il volume del sistema operativo per BitLocker tramite bdehdcfg

Per comprimere la partizione del sistema operativo e preparare il computer per BitLocker, eseguire il comando bdehdcfg, se necessario:

bdehdcfg -target c: shrink -quiet

Proteggere il volume del sistema operativo usando BitLocker

Usa il comando manage-bde per abilitare la crittografia sul volume di avvio usando un sistema di protezione con chiave esterna. Salvare anche la chiave esterna (file con estensione bek) nell'unità o nel volume esterno. La crittografia viene abilitata nel volume di sistema/di avvio al riavvio successivo.

manage-bde -on %systemdrive% -sk [ExternalDriveOrVolume]
reboot

Note

Preparare la macchina virtuale con un disco rigido virtuale dati/di risorse separato per recuperare la chiave esterna usando BitLocker.

Caricare il VHD crittografato in un account di archiviazione di Azure

Dopo aver abilitato la crittografia BitLocker, il disco rigido virtuale crittografato locale dovrà essere caricato nell'account di archiviazione.

    Add-AzVhd [-Destination] <Uri> [-LocalFilePath] <FileInfo> [[-NumberOfUploaderThreads] <Int32> ] [[-BaseImageUriToPatch] <Uri> ] [[-OverWrite]] [ <CommonParameters>]

Caricare il segreto per la macchina virtuale pre-crittografata nell'insieme di credenziali delle chiavi

Carica il segreto di crittografia del disco che hai ottenuto in precedenza come segreto nel tuo insieme di credenziali delle chiavi. A tale scopo, concedi l'autorizzazione set secret e l'autorizzazione WrapKey all'account che carica i segreti.

# Typically, account Id is the user principal name (in user@domain.com format)
$upn = (Get-AzureRmContext).Account.Id
Set-AzKeyVaultAccessPolicy -VaultName $kvname -UserPrincipalName $acctid -PermissionsToKeys wrapKey -PermissionsToSecrets set

# In cloud shell, the account ID is a managed service identity, so specify the username directly
# $upn = "user@domain.com"
# Set-AzKeyVaultAccessPolicy -VaultName $kvname -UserPrincipalName $acctid -PermissionsToKeys wrapKey -PermissionsToSecrets set

# When running as a service principal, retrieve the service principal ID from the account ID, and set access policy to that
# $acctid = (Get-AzureRmContext).Account.Id
# $spoid = (Get-AzureRmADServicePrincipal -ServicePrincipalName $acctid).Id
# Set-AzKeyVaultAccessPolicy -VaultName $kvname -ObjectId $spoid -BypassObjectIdValidation -PermissionsToKeys wrapKey -PermissionsToSecrets set

Segreto di crittografia del disco non crittografato con una chiave di crittografia della chiave

Per configurare il segreto nell'insieme di credenziali delle chiavi, usare Set-AzKeyVaultSecret. La passphrase viene codificata come stringa base64 e quindi caricata nell'insieme di credenziali delle chiavi. Assicurarsi anche che i tag seguenti siano impostati quando si crea il segreto nell'insieme di credenziali delle chiavi.


 # This is the passphrase that was provided for encryption during the distribution installation
 $passphrase = "contoso-password"

 $tags = @{"DiskEncryptionKeyEncryptionAlgorithm" = "RSA-OAEP"; "DiskEncryptionKeyFileName" = "LinuxPassPhraseFileName"}
 $secretName = [guid]::NewGuid().ToString()
 $secretValue = [Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes($passphrase))
 $secureSecretValue = ConvertTo-SecureString $secretValue -AsPlainText -Force

 $secret = Set-AzKeyVaultSecret -VaultName $KeyVaultName -Name $secretName -SecretValue $secureSecretValue -tags $tags
 $secretUrl = $secret.Id

Usare $secretUrl nel passaggio successivo per collegare il disco del sistema operativo senza usare una chiave KEK.

Segreto di crittografia del disco crittografato con una chiave di crittografia della chiave

Prima di caricare il segreto nell'insieme di credenziali delle chiavi, è possibile crittografarlo usando una chiave di crittografia della chiave. Usare l'API wrap per prima crittografare il segreto utilizzando la chiave di crittografia delle chiavi. L'output di questa operazione WRAP si basa su una stringa con codifica base64 dell'URL che può essere quindi caricata come segreto con il cmdlet Set-AzKeyVaultSecret.

    # This is the passphrase that was provided for encryption during the distribution installation
    $passphrase = "contoso-password"

    Add-AzKeyVaultKey -VaultName $KeyVaultName -Name "keyencryptionkey" -Destination Software
    $KeyEncryptionKey = Get-AzKeyVaultKey -VaultName $KeyVault.OriginalVault.Name -Name "keyencryptionkey"

    $apiversion = "2015-06-01"

    ##############################
    # Get Auth URI
    ##############################

    $uri = $KeyVault.VaultUri + "/keys"
    $headers = @{}

    $response = try { Invoke-RestMethod -Method GET -Uri $uri -Headers $headers } catch { $_.Exception.Response }

    $authHeader = $response.Headers["www-authenticate"]
    $authUri = [regex]::match($authHeader, 'authorization="(.*?)"').Groups[1].Value

    Write-Host "Got Auth URI successfully"

    ##############################
    # Get Auth Token
    ##############################

    $uri = $authUri + "/oauth2/token"
    $body = "grant_type=client_credentials"
    $body += "&client_id=" + $AadClientId
    $body += "&client_secret=" + [Uri]::EscapeDataString($AadClientSecret)
    $body += "&resource=" + [Uri]::EscapeDataString("https://vault.azure.net")
    $headers = @{}

    $response = Invoke-RestMethod -Method POST -Uri $uri -Headers $headers -Body $body

    $access_token = $response.access_token

    Write-Host "Got Auth Token successfully"

    ##############################
    # Get KEK info
    ##############################

    $uri = $KeyEncryptionKey.Id + "?api-version=" + $apiversion
    $headers = @{"Authorization" = "Bearer " + $access_token}

    $response = Invoke-RestMethod -Method GET -Uri $uri -Headers $headers

    $keyid = $response.key.kid

    Write-Host "Got KEK info successfully"

    ##############################
    # Encrypt passphrase by using a KEK
    ##############################

    $passphraseB64 = [Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes($Passphrase))
    $uri = $keyid + "/encrypt?api-version=" + $apiversion
    $headers = @{"Authorization" = "Bearer " + $access_token; "Content-Type" = "application/json"}
    $bodyObj = @{"alg" = "RSA-OAEP"; "value" = $passphraseB64}
    $body = $bodyObj | ConvertTo-Json

    $response = Invoke-RestMethod -Method POST -Uri $uri -Headers $headers -Body $body

    $wrappedSecret = $response.value

    Write-Host "Encrypted passphrase successfully"

    ##############################
    # Store secret
    ##############################

    $secretName = [guid]::NewGuid().ToString()
    $uri = $KeyVault.VaultUri + "/secrets/" + $secretName + "?api-version=" + $apiversion
    $secretAttributes = @{"enabled" = $true}
    $secretTags = @{"DiskEncryptionKeyEncryptionAlgorithm" = "RSA-OAEP"; "DiskEncryptionKeyFileName" = "LinuxPassPhraseFileName"}
    $headers = @{"Authorization" = "Bearer " + $access_token; "Content-Type" = "application/json"}
    $bodyObj = @{"value" = $wrappedSecret; "attributes" = $secretAttributes; "tags" = $secretTags}
    $body = $bodyObj | ConvertTo-Json

    $response = Invoke-RestMethod -Method PUT -Uri $uri -Headers $headers -Body $body

    Write-Host "Stored secret successfully"

    $secretUrl = $response.id

Utilizzare $KeyEncryptionKey e $secretUrl nel passaggio seguente per collegare il disco del sistema operativo usando una KEK.

Specificare un URL del segreto quando si collega un disco del sistema operativo

Senza l'uso di una chiave di crittografia della chiave (KEK)

Quando si collega il disco del sistema operativo, specificare $secretUrl. L'URL viene generato nella sezione "Segreto di crittografia del disco non crittografato con una chiave KEK".

    Set-AzVMOSDisk `
            -VM $VirtualMachine `
            -Name $OSDiskName `
            -SourceImageUri $VhdUri `
            -VhdUri $OSDiskUri `
            -Windows `
            -CreateOption FromImage `
            -DiskEncryptionKeyVaultId $KeyVault.ResourceId `
            -DiskEncryptionKeyUrl $SecretUrl

Uso di una chiave di crittografia della chiave (KEK)

Quando si collega il disco del sistema operativo, vedere $KeyEncryptionKey e $secretUrl. L'URL viene generato nella sezione "Segreto di crittografia del disco crittografato con una chiave kek".

    Set-AzVMOSDisk `
            -VM $VirtualMachine `
            -Name $OSDiskName `
            -SourceImageUri $CopiedTemplateBlobUri `
            -VhdUri $OSDiskUri `
            -Windows `
            -CreateOption FromImage `
            -DiskEncryptionKeyVaultId $KeyVault.ResourceId `
            -DiskEncryptionKeyUrl $SecretUrl `
            -KeyEncryptionKeyVaultId $KeyVault.ResourceId `
            -KeyEncryptionKeyURL $KeyEncryptionKey.Id