Exempelskript för Azure Disk Encryption

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.

Kommentar

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 det här PowerShell-skriptet.

    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 hittar alla ADE-krypterade vm-skalningsuppsättningar och tilläggsversionen i alla resursgrupper som finns i en prenumeration med hjälp av det här PowerShell-skriptet.

  • 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 som kan användas i PowerShell-skriptet:

Parameter Description Obligatoriskt?
$resourceGroupName Namnet på den resursgrupp som KeyVault tillhör. En ny resursgrupp med det här namnet skapas om den inte finns. Sant
$keyVaultName Namnet på den KeyVault där krypteringsnycklar ska placeras. Ett nytt valv med det här namnet skapas om det inte finns något. Sant
$location KeyVaults plats. Kontrollera att keyVault och virtuella datorer som ska krypteras finns på samma plats. Hämta en innehållsplatslista med Get-AzLocation. Sant
$subscriptionId Identifierare för den Azure-prenumeration som ska användas. Du kan hämta ditt prenumerations-ID med Get-AzSubscription. Sant
$aadAppName Namnet på Microsoft Entra-programmet som ska användas för att skriva hemligheter till KeyVault. Om det inte redan finns ett program med det namnet skapas ett nytt. Om den här appen redan finns skickar du parametern aadClientSecret till skriptet. Falsk
$aadClientSecret Klienthemlighet för Microsoft Entra-programmet som skapades tidigare. Falsk
$keyEncryptionKeyName Namn på valfri nyckelkrypteringsnyckel i KeyVault. En ny nyckel med det här namnet skapas 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 en Microsoft Entra-app (tidigare version)

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

Avsnitten som följer är nödvändiga för att förbereda en förkrypterad virtuell Windows-hårddisk för distribution som en krypterad virtuell hårddisk i Azure IaaS. Använd informationen för att förbereda och starta en ny virtuell Windows-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 grupprincip för att tillåta icke-TPM för OS-skydd

Konfigurera BitLocker-grupprincipinställningen BitLocker-diskkryptering, som du hittar under Windows-komponenter för>datorkonfiguration för lokal datorkonfiguration>>. Ändra den här inställningen till Operativsystemenheter>Kräv ytterligare autentisering vid start>Tillåt BitLocker utan kompatibel TPM, enligt följande bild:

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

Kommentar

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

Den diskkrypteringshemlighet som du hämtade tidigare måste laddas upp som en hemlighet i nyckelvalvet. För att göra det måste du ge behörigheten ange hemlighet och wrapkey till det konto som ska ladda 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

Diskkrypteringshemlighet som inte krypteras 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 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 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

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

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

Utan att använda en KEK

När du ansluter OS-disken måste du skicka $secretUrl. URL:en genererades i avsnittet "Diskkrypteringshemlighet inte krypterad med en KEK".

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

Använda en KEK

När du ansluter OS-disken skickar $KeyEncryptionKey du och $secretUrl. URL:en genererades i avsnittet "Diskkrypteringshemlighet 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