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
- Aktivera diskkryptering på en befintlig eller kör en virtuell Windows-dator
- Inaktivera kryptering på en virtuell Windows-dator som körs
Kryptera eller dekryptera virtuella datorer med en Microsoft Entra-app (tidigare version)
- Aktivera diskkryptering på en befintlig eller kör en virtuell Windows-dator
- Inaktivera kryptering på en virtuell Windows-dator som körs
- Skapa en ny krypterad hanterad disk från en förkrypterad virtuell hårddisk/lagringsblob
- Skapar en ny krypterad hanterad disk med en förkrypterad virtuell hårddisk och motsvarande krypteringsinställningar
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:
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