Script di esempio per la crittografia dischi di Azure
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à.
Nota
Tutti gli script fanno riferimento alla versione più recente, non AAD di ADE, 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 questo script di PowerShell.
In alternativa, questi cmdlet visualizzeranno 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 tutte le istanze di ade-encrypted set di scalabilità di macchine virtuali e la versione dell'estensione, in tutti i gruppi di risorse presenti in una sottoscrizione, usando questo script di PowerShell.
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 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 possono essere usati nello script di PowerShell:
Parametro | Descrizione | Obbligatorio? |
---|---|---|
$resourceGroupName | Nome del gruppo di risorse a cui appartiene l'insieme di credenziali delle chiavi. Verrà creato un nuovo gruppo di risorse con questo nome, se non esiste già. | Vero |
$keyVaultName | Nome dell'insieme di credenziali delle chiavi in cui inserire le chiavi di crittografia. Verrà creato un nuovo insieme con questo nome, se non esiste già. | Vero |
$location | Percorso dell'insieme di credenziali delle chiavi. Assicurarsi che l'insieme di credenziali delle chiavi e le macchine virtuali da crittografare si trovino nello stesso percorso. Ottenere un elenco di percorsi con Get-AzLocation . |
Vero |
$subscriptionId | Identificatore della sottoscrizione di Azure da usare. È possibile ottenere l'ID della sottoscrizione con Get-AzSubscription . |
Vero |
$aadAppName | Nome dell'applicazione Microsoft Entra che verrà usata per scrivere segreti in KeyVault. Viene creata una nuova applicazione con questo nome, se non esiste già. Se l'app esiste già, passare il parametro aadClientSecret allo script. | Falso |
$aadClientSecret | Segreto client dell'applicazione Microsoft Entra creata in precedenza. | Falso |
$keyEncryptionKeyName | Nome della chiave di crittografia della chiave facoltativa nell'insieme di credenziali delle chiavi. Verrà creata una nuova chiave con questo nome, se non esiste già. | Falso |
Modelli di Resource Manager
Crittografare o decrittografare le macchine virtuali senza un'app Microsoft Entra
- Abilitare la crittografia del disco in una macchina virtuale Windows esistente o in esecuzione
- Disabilitare la crittografia in una macchina virtuale Windows in esecuzione
Crittografare o decrittografare le macchine virtuali con un'app Microsoft Entra (versione precedente)
- Abilitare la crittografia del disco in una macchina virtuale Windows esistente o in esecuzione
- Disabilitare la crittografia in una macchina virtuale Windows in esecuzione
- Creare un nuovo disco gestito crittografato da un BLOB di archiviazione/disco rigido virtuale pre-crittografato
- Crea un nuovo disco gestito crittografato a partire da un disco rigido virtuale pre-crittografato con le corrispondenti impostazioni di crittografia
Preparare un disco rigido virtuale Windows pre-crittografato
Le sezioni seguenti sono necessarie per preparare un disco rigido virtuale Windows pre-crittografato per la distribuzione come disco rigido virtuale crittografato in Azure IaaS. Usare le informazioni per preparare e avviare una nuova macchina virtuale Windows VM (disco rigido virtuale) 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:
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
Usare il comando manage-bde
per abilitare la crittografia sul volume di avvio usando una 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
Nota
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, è necessario caricare il disco rigido virtuale crittografato locale 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
Il segreto di crittografia del disco ottenuto in precedenza deve essere caricato come segreto nell'insieme di credenziali delle chiavi. A tale scopo, è necessario concedere l'autorizzazione set secret e l'autorizzazione wrapkey all'account che caricherà 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 di crittografia della chiave.
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 crittografare prima di tutto il segreto con la chiave di crittografia della chiave. L'output di questa operazione WRAP si basa su una stringa con codifica Base 64 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 using 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
Usare $KeyEncryptionKey
e $secretUrl
nel passaggio successivo per collegare il disco del sistema operativo usando una chiave di crittografia della chiave.
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 è necessario passare $secretUrl
. L'URL è stato generato nella sezione "Segreto di crittografia del disco non crittografato con una chiave di crittografia della chiave".
Set-AzVMOSDisk `
-VM $VirtualMachine `
-Name $OSDiskName `
-SourceImageUri $VhdUri `
-VhdUri $OSDiskUri `
-Windows `
-CreateOption FromImage `
-DiskEncryptionKeyVaultId $KeyVault.ResourceId `
-DiskEncryptionKeyUrl $SecretUrl
Con l'uso di una chiave di crittografia della chiave (KEK)
Quando si collega il disco del sistema operativo, vedere $KeyEncryptionKey
e $secretUrl
. L'URL è stato generato nella sezione "Segreto di crittografia del disco crittografato con una chiave di crittografia della chiave".
Set-AzVMOSDisk `
-VM $VirtualMachine `
-Name $OSDiskName `
-SourceImageUri $CopiedTemplateBlobUri `
-VhdUri $OSDiskUri `
-Windows `
-CreateOption FromImage `
-DiskEncryptionKeyVaultId $KeyVault.ResourceId `
-DiskEncryptionKeyUrl $SecretUrl `
-KeyEncryptionKeyVaultId $KeyVault.ResourceId `
-KeyEncryptionKeyURL $KeyEncryptionKey.Id