Exempelskript för Azure Disk Encryption

Viktigt!

Azure Disk Encryption är planerat att tas bort den 15 september 2028. Fram till det datumet kan du fortsätta att använda Azure Disk Encryption utan avbrott. Den 15 september 2028 fortsätter ADE-aktiverade arbetsbelastningar att köras, men krypterade diskar kan inte låsas upp efter omstarter av virtuella datorer, vilket resulterar i avbrott i tjänsten.

Använd kryptering vid värden för nya VM:er eller överväg konfidentiella VM-storlekar med OS-diskkryptering för arbetslaster för konfidentiell databehandling. Alla ADE-aktiverade virtuella datorer (inklusive säkerhetskopior) måste migreras till kryptering hos värden före pensionsdatumet för att undvika serviceavbrott. Se Migrera från Azure Disk Encryption till värdkryptering för detaljer.

Gäller för: ✔️ Virtuella Windows-datorer

Den här artikeln innehåller exempelskript för att förbereda förkrypterade virtuella hårddiskar och andra uppgifter.

Note

Alla skript refererar till den senaste, icke-AAD-versionen av ADE, förutom där det anges.

PowerShell-exempelskript för Azure Disk Encryption

  • Visa en lista över alla krypterade virtuella datorer i din prenumeration

Du hittar alla ADE-krypterade virtuella datorer och tilläggsversionen i alla resursgrupper som finns i en prenumeration med hjälp av Find_1passAdeVersion_VM.ps1 PowerShell-skript.

Alternativt visar dessa cmdletar alla ADE-krypterade virtuella datorer (men inte tilläggsversionen):

$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}
  • Visa en lista över alla krypterade VMSS-instanser i din prenumeration

    Du kan hitta alla ADE-krypterade instanser i skaluppsättningar för virtuella datorer och tilläggsversionen i alla resursgrupper inom en prenumeration genom att använda PowerShell-skriptet Find_1passAdeVersion_VMSS.ps1.

  • Visa en lista över alla diskkrypteringshemligheter som används för att kryptera virtuella datorer i ett nyckelvalv

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

Använda PowerShell-skriptet för förhandskrav för Azure Disk Encryption

Om du redan är bekant med förhandskraven för Azure Disk Encryption kan du använda PowerShell-skriptet för Förhandskrav för Azure Disk Encryption. Ett exempel på hur du använder det här PowerShell-skriptet finns i snabbstarten Kryptera en virtuell dator. Du kan ta bort kommentarerna från ett avsnitt i skriptet, från och med rad 211, för att kryptera alla diskar för befintliga virtuella datorer i en befintlig resursgrupp.

I följande tabell visas vilka parametrar du kan använda i PowerShell-skriptet:

Parameter Beskrivning Obligatorisk?
$resourceGroupName Namnet på resursgruppen som nyckelvalvet tillhör. Skriptet skapar en ny resursgrupp med det här namnet om det inte finns någon. True
$keyVaultName Namnet på nyckelvalvet där krypteringsnycklar ska placeras. Skriptet skapar ett nytt valv med det här namnet om det inte finns något. True
$location Placering av nyckelvalvet. Kontrollera att nyckelvalvet och de virtuella datorer som ska krypteras finns på samma plats. Hämta en platslista med Get-AzLocation. True
$subscriptionId Identifierare för den Azure prenumeration som ska användas. Hämta ditt prenumerations-ID med Get-AzSubscription. True
$aadAppName Namnet på det Microsoft Entra program som skriver hemligheter till Key Vault. Skriptet skapar ett nytt program med det här namnet om det inte finns något. Om den här appen redan finns skickar du parametern aadClientSecret till skriptet. Falsk
$aadClientSecret Klienthemligheten för den Microsoft Entra-applikation som skapades tidigare. Falsk
$keyEncryptionKeyName Namn på valfri nyckelkrypteringsnyckel i Key Vault. Skriptet skapar en ny nyckel med det här namnet om det inte finns någon. Falsk

Resource Manager-mallar

Kryptera eller dekryptera virtuella datorer utan en Microsoft Entra-app

Kryptera eller dekryptera virtuella datorer med hjälp av en Microsoft Entra app

Förbereda en förkrypterad virtuell Windows-hårddisk

I följande avsnitt beskrivs hur du förbereder en förkrypterad Windows VHD för distribution som en krypterad virtuell hårddisk i Azure IaaS. Använd den här informationen för att förbereda och starta en ny Windows virtuell dator (VHD) på Azure Site Recovery eller Azure. Mer information om hur du förbereder och laddar upp en virtuell hårddisk finns i Ladda upp en generaliserad virtuell hårddisk och använd den för att skapa nya virtuella datorer i Azure.

Uppdatera grupppolicy för att tillåta icke-TPM (Trusted Platform Module) för OS-skydd

Konfigurera BitLocker Group Policy-inställningen BitLocker-diskkryptering, som du hittar under Lokal datorprincip>Datorkonfiguration>Administrativa mallar>Windows-komponenter. Ändra den här inställningen till Operativsystemenheter>Kräv ytterligare autentisering vid start>Tillåt BitLocker utan kompatibel TPM, som visas i följande figur:

Microsoft Antimalware i Azure

Installera BitLocker-funktionskomponenter

För Windows Server 2012 och senare använder du följande kommando:

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

För Windows Server 2008 R2 använder du följande kommando:

ServerManagerCmd -install BitLockers

Förbereda OS-volymen för BitLocker med hjälp av bdehdcfg

Om du vill komprimera OS-partitionen och förbereda datorn för BitLocker kör du bdehdcfg om det behövs:

bdehdcfg -target c: shrink -quiet

Skydda OS-volymen med hjälp av BitLocker

manage-bde Använd kommandot för att aktivera kryptering på startvolymen med hjälp av ett externt nyckelskydd. Placera även den externa nyckeln (.bek-filen) på den externa enheten eller volymen. Kryptering är aktiverat på system-/startvolymen efter nästa omstart.

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

Note

Förbered den virtuella datorn med en separat data-/resurs-VHD för att hämta den externa nyckeln med hjälp av BitLocker.

Ladda upp krypterad virtuell hårddisk till ett Azure Storage-konto

När BitLocker-kryptering har aktiverats måste den lokala krypterade virtuella hårddisken laddas upp till ditt lagringskonto.

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

Ladda upp hemligheten för den förkrypterade virtuella datorn till ditt nyckelvalv

Ladda upp diskkrypteringshemligheten som du fick tidigare som en hemlighet i nyckelvalvet. Det gör du genom att ge behörigheten att ange hemligheter och behörigheten wrap key till det konto som laddar upp hemligheterna.

# 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

Diskkrypteringsnyckel som inte är krypterad med en KEK

Om du vill konfigurera hemligheten i nyckelvalvet använder du Set-AzKeyVaultSecret. Lösenfrasen kodas som en base64-sträng och laddas sedan upp till nyckelvalvet. Kontrollera dessutom att följande taggar har angetts när du skapar hemligheten i nyckelvalvet.


 # 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

$secretUrl Använd i nästa steg för att ansluta OS-disken utan att använda en KEK.

Diskkrypteringshemlighet krypterad med en KEK

Innan du laddar upp hemligheten till nyckelvalvet kan du kryptera den med hjälp av en nyckelkrypteringsnyckel. Använd wrap-API :et för att först kryptera hemligheten med hjälp av nyckelkrypteringsnyckeln. Utdata från den här wrap-åtgärden är en base64 URL-kodad sträng som du sedan kan ladda upp som en hemlighet med hjälp av cmdleten 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

Använd $KeyEncryptionKey och $secretUrl i nästa steg för att ansluta OS-disken med hjälp av en KEK.

Ange en hemlig URL när du ansluter en OS-disk

Utan att använda en KEK

När du ansluter OS-disken skickar du $secretUrl. URL:en genereras i avsnittet "Hemlighet för diskkryptering som inte är krypterad med en KEK".

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

Användning av en KEK

När du ansluter OS-disken skickar du $KeyEncryptionKey och $secretUrl. URL:en genereras i avsnittet "Hemlighet för diskkryptering krypterad med en 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