Delen via


BitLocker-opstartfouten op een Azure-VM

In dit artikel worden BitLocker-fouten beschreven die kunnen optreden wanneer u een virtuele Windows-machine (VM) start in Microsoft Azure.

Symptoom

Een Windows-VM wordt niet gestart. Wanneer u de schermopnamen in het venster Diagnostische gegevens over opstarten controleert, ziet u een van de volgende foutberichten:

  • Sluit het USB-stuurprogramma met de BitLocker-sleutel aan

  • Je bent buitengesloten! Voer de herstelsleutel in om weer aan de slag te gaan (toetsenbordindeling: VS) De verkeerde aanmeldingsgegevens zijn te vaak ingevoerd, zodat uw pc is vergrendeld om uw privacy te beschermen. Als u de herstelsleutel wilt ophalen, gaat u naar https://windows.microsoft.com/recoverykeyfaq van een andere pc of mobiel apparaat. Als u dit nodig hebt, is de sleutel-id XXXXXXX. U kunt uw pc ook opnieuw instellen.

  • Voer het wachtwoord in om dit station te ontgrendelen [ ] Druk op de toets Invoegen om het wachtwoord te zien terwijl u typt.

  • Voer uw herstelsleutel in Laad uw herstelsleutel vanaf een USB-apparaat.

Oorzaak

Dit probleem kan optreden als de VM het BEK-bestand (BitLocker Recovery Key) niet kan vinden om de versleutelde schijf te ontsleutelen.

De versleutelde besturingssysteemschijf ontsleutelen

Tip

Als u een recente back-up van de VM hebt, kunt u proberen de VM te herstellen vanuit de back-up om het opstartprobleem op te lossen.

U kunt dit probleem oplossen door de vm te stoppen en de toewijzing ervan ongedaan te maken en deze vervolgens te starten. Deze bewerking dwingt de VM om het BEK-bestand op te halen uit de Azure Key Vault en vervolgens op de versleutelde schijf te plaatsen.

Als deze methode het probleem niet oplost, volgt u deze stappen om het BEK-bestand handmatig te herstellen:

  1. Maak een momentopname van de besturingssysteemschijf van de betrokken VM als back-up. Zie Momentopname van een schijf maken voor meer informatie.

  2. Koppel de besturingssysteemschijf aan een herstel-VM. Wanneer u een beheerde schijf koppelt, ontvangt u mogelijk het foutbericht 'bevat versleutelingsinstellingen en kan daarom niet worden gebruikt als een gegevensschijf'. Voer in dit geval het volgende script uit om opnieuw te proberen de schijf te koppelen:

    $rgName = "myResourceGroup"
    $osDiskName = "ProblemOsDisk"
    # Set the EncryptionSettingsEnabled property to false, so you can attach the disk to the recovery VM.
    New-AzDiskUpdateConfig -EncryptionSettingsEnabled $false |Update-AzDisk -diskName $osDiskName -ResourceGroupName $rgName
    
    $recoveryVMName = "myRecoveryVM" 
    $recoveryVMRG = "RecoveryVMRG" 
    $OSDisk = Get-AzDisk -ResourceGroupName $rgName -DiskName $osDiskName;
    
    $vm = get-AzVM -ResourceGroupName $recoveryVMRG -Name $recoveryVMName 
    
    Add-AzVMDataDisk -VM $vm -Name $osDiskName -ManagedDiskId $osDisk.Id -Caching None -Lun 3 -CreateOption Attach 
    
    Update-AzVM -VM $vm -ResourceGroupName $recoveryVMRG
    

    U kunt geen beheerde schijf koppelen aan een VM die is hersteld vanuit een blob-installatiekopieën.

  3. Nadat de schijf is gekoppeld, maakt u een verbinding met extern bureaublad met de herstel-VM.

  4. Installeer de Az PowerShell-module en Az.Account 1.9.4 in de herstel-VM.

  5. Open een sessie met verhoogde Azure PowerShell (als administrator uitvoeren). Voer de volgende opdrachten uit om u aan te melden bij een Azure-abonnement:

    Add-AzAccount -SubscriptionID [SubscriptionID]
    
  6. Voer het volgende script uit om de naam van het BEK-bestand (geheime naam) te controleren:

    $vmName = "myVM"
    $vault = "myKeyVault"
    Get-AzKeyVaultSecret -VaultName $vault | where {($_.Tags.MachineName -eq $vmName) -and ($_.ContentType -match 'BEK')} `
            | Sort-Object -Property Created `
            | ft  Created, `
                @{Label="Content Type";Expression={$_.ContentType}}, `
                @{Label ="MachineName"; Expression = {$_.Tags.MachineName}}, `
                @{Label ="Volume"; Expression = {$_.Tags.VolumeLetter}}, `
                @{Label ="DiskEncryptionKeyFileName"; Expression = {$_.Tags.DiskEncryptionKeyFileName}}
    

    Hieronder volgt een voorbeeld van de uitvoer. In dit geval gaan we ervan uit dat de bestandsnaam EF7B2F5A-50C6-4637-0001-7F599C12F85C is. BEK.

    Created               Content Type Volume MachineName DiskEncryptionKeyFileName
    -------               ------------ ------ ----------- -------------------------
    11/20/2020 7:41:56 AM BEK          C:\    myVM   EF7B2F5A-50C6-4637-0001-7F599C12F85C.BEK
    

    Als u twee gedupliceerde volumes ziet, is het volume met de nieuwere tijdstempel het huidige BEK-bestand dat wordt gebruikt door de herstel-VM.

    Als de waarde van inhoudstypeVerpaktE BEK is, gaat u naar de KEK-scenario's (Key Encryption Key).

    Nu u de naam van het BEK-bestand voor het station hebt, moet u de secret-file-name maken. BEK-bestand om het station te ontgrendelen.

  7. Download het BEK-bestand naar de herstelschijf. In het volgende voorbeeld wordt het BEK-bestand opgeslagen in de map C:\BEK. Zorg ervoor dat het C:\BEK\ pad bestaat voordat u de scripts uitvoert.

    $vault = "myKeyVault"
    $bek = "EF7B2F5A-50C6-4637-0001-7F599C12F85C"
    $keyVaultSecret = Get-AzKeyVaultSecret -VaultName $vault -Name $bek
    $bstr = [Runtime.InteropServices.Marshal]::SecureStringToBSTR($keyVaultSecret.SecretValue)
    $bekSecretBase64 = [Runtime.InteropServices.Marshal]::PtrToStringAuto($bstr)
    $bekFileBytes = [Convert]::FromBase64String($bekSecretbase64)
    $path = "C:\BEK\DiskEncryptionKeyFileName.BEK"
    [System.IO.File]::WriteAllBytes($path,$bekFileBytes)
    
  8. Voer de volgende opdracht uit om de gekoppelde schijf te ontgrendelen met behulp van het BEK-bestand.

    manage-bde -unlock F: -RecoveryKey "C:\BEK\EF7B2F5A-50C6-4637-0001-7F599C12F85C.BEK"
    

    In dit voorbeeld is de gekoppelde besturingssysteemschijf station F. Zorg ervoor dat u de juiste stationsletter gebruikt.

  9. Nadat de schijf is ontgrendeld met behulp van de BEK-sleutel, ontkoppelt u de schijf van de herstel-VM en maakt u de VM opnieuw met behulp van deze nieuwe besturingssysteemschijf.

    Opmerking

    Het wisselen van besturingssysteemschijf is beschikbaar voor elke VM die is versleuteld met Single Pass ADE-versie, maar wordt niet ondersteund voor Dual Pass.

  10. Als de nieuwe VM nog steeds niet normaal kan worden opgestart, voert u een van de volgende stappen uit nadat u het station hebt ontgrendeld:

    • Onderbroken beveiliging om BitLocker tijdelijk uit te schakelen door het volgende uit te voeren:
    manage-bde -protectors -disable F: -rc 0
    
    • Het station volledig ontsleutelen. Voer hiervoor de volgende opdracht uit:
    manage-bde -off F:
    

Scenario sleutelversleutelingssleutel (verpakte BEK)

Voer voor een scenario met sleutelversleutelingssleutels de volgende stappen uit:

  1. Zorg ervoor dat voor het aangemelde gebruikersaccount de machtiging 'unwrapped' is vereist in het Key Vault Toegangsbeleid in de GEBRUIKER|Sleutelmachtigingen |Cryptografische bewerkingen |Sleutel uitpakken.

  2. Sla het volgende script op in een .PS1-bestand:

    Opmerking

    De ADAL-assembly's (dll-bestanden) die in dit script worden gebruikt, zijn alleen beschikbaar in Az.Account 1.9.4 en de eerdere versies. Zie Az PowerShell-module installeren om de Az.Account-module te installeren.

    #Set the Parameters for the script. If you have question about the Parameters, see the "KEK script parameters" section.
    param (
            [Parameter(Mandatory=$true)]
            [string] 
            $keyVaultName,
            [Parameter(Mandatory=$true)]
            [string] 
            $kekName,
            [Parameter(Mandatory=$true)]
            [string]
            $secretName,
            [Parameter(Mandatory=$true)]
            [string]
            $bekFilePath,
            [Parameter(Mandatory=$true)]
            [string] 
            $adTenant
            )
    # Load ADAL Assemblies. If the ADAL Assemblies cannot be found, please see the "Install Az PowerShell module" section. 
    
    $adal = "${env:ProgramFiles}\WindowsPowerShell\Modules\Az.Accounts\1.9.4\PreloadAssemblies\Microsoft.IdentityModel.Clients.ActiveDirectory.dll"
    $adalforms = "${env:ProgramFiles}\WindowsPowerShell\Modules\Az.Accounts\1.9.4\PreloadAssemblies\Microsoft.IdentityModel.Clients.ActiveDirectory.Platform.dll"  
    
    If ((Test-Path -Path $adal) -and (Test-Path -Path $adalforms)) { 
    
    [System.Reflection.Assembly]::LoadFrom($adal)
    [System.Reflection.Assembly]::LoadFrom($adalforms)
     }
     else
     {
      Write-output "ADAL Assemblies files cannot be found. Please set the correct path for `$adal` and `$adalforms`, then run the script again." 
      exit    
     }  
    
    # Set well-known client ID for AzurePowerShell
    $clientId = "1950a258-227b-4e31-a9cf-717495945fc2" 
    # Set redirect URI for Azure PowerShell
    $redirectUri = "urn:ietf:wg:oauth:2.0:oob"
    # Set Resource URI to Azure Service Management API
    $resourceAppIdURI = "https://vault.azure.net"
    # Set Authority to Azure AD Tenant
    $authority = "https://login.windows.net/$adtenant"
    # Create Authentication Context tied to Azure AD Tenant
    $authContext = New-Object "Microsoft.IdentityModel.Clients.ActiveDirectory.AuthenticationContext" -ArgumentList $authority
    # Acquire token
    $platformParameters = New-Object "Microsoft.IdentityModel.Clients.ActiveDirectory.PlatformParameters" -ArgumentList "Auto"
    $authResult = $authContext.AcquireTokenAsync($resourceAppIdURI, $clientId, $redirectUri, $platformParameters).result
    # Generate auth header 
    $authHeader = $authResult.CreateAuthorizationHeader()
    # Set HTTP request headers to include Authorization header
    $headers = @{'x-ms-version'='2014-08-01';"Authorization" = $authHeader}
    
    ########################################################################################################################
    # 1. Retrieve wrapped BEK
    # 2. Make KeyVault REST API call to unwrap the BEK
    # 3. Convert the Base64Url string returned by KeyVault unwrap to Base64 string 
    # 4. Convert Base64 string to bytes and write to the BEK file
    ########################################################################################################################
    
    #Get wrapped BEK and place it in JSON object to send to KeyVault REST API
    $keyVaultSecret = Get-AzKeyVaultSecret -VaultName $keyVaultName -Name $secretName
    $bstr = [Runtime.InteropServices.Marshal]::SecureStringToBSTR($keyVaultSecret.SecretValue)
    $wrappedBekSecretBase64 = [Runtime.InteropServices.Marshal]::PtrToStringAuto($bstr)
    $jsonObject = @"
    {
    "alg": "RSA-OAEP",
    "value" : "$wrappedBekSecretBase64"
    }
    "@
    
    #Get KEK Url
    $kekUrl = (Get-AzKeyVaultKey -VaultName $keyVaultName -Name $kekName).Key.Kid;
    $unwrapKeyRequestUrl = $kekUrl+ "/unwrapkey?api-version=2015-06-01";
    
    #Call KeyVault REST API to Unwrap 
    $result = Invoke-RestMethod -Method POST -Uri $unwrapKeyRequestUrl -Headers $headers -Body $jsonObject -ContentType "application/json" -Debug
    
    #Convert Base64Url string returned by KeyVault unwrap to Base64 string
    $base64UrlBek = $result.value;
    $base64Bek = $base64UrlBek.Replace('-', '+');
    $base64Bek = $base64Bek.Replace('_', '/');
    if($base64Bek.Length %4 -eq 2)
    {
        $base64Bek+= '==';
    }
    elseif($base64Bek.Length %4 -eq 3)
    {
        $base64Bek+= '=';
    }
    
    #Convert base64 string to bytes and write to BEK file
    $bekFileBytes = [System.Convert]::FromBase64String($base64Bek);
    [System.IO.File]::WriteAllBytes($bekFilePath,$bekFileBytes)
    
    #Delete the key from the memory
    [Runtime.InteropServices.Marshal]::ZeroFreeBSTR($bstr)
    clear-variable -name wrappedBekSecretBase64
    
  3. Stel de parameters in. Het script verwerkt het KEK-geheim om de BEK-sleutel te maken en slaat deze vervolgens op in een lokale map op de herstel-VM. Als er fouten optreden wanneer u het script uitvoert, raadpleegt u de sectie probleemoplossing voor scripts .

  4. U ziet de volgende uitvoer wanneer het script begint:

    GAC-versielocatie


    False v4.0.30319 C:\Program Files\WindowsPowerShell\Modules\Az.Accounts... False v4.0.30319 C:\Program Files\WindowsPowerShell\Modules\Az.Accounts...

    Wanneer het script is voltooid, ziet u de volgende uitvoer:

    VERBOSE: POST https://myvault.vault.azure.net/keys/rondomkey/<KEY-ID>/unwrapkey?api-
    version=2015-06-01 with -1-byte payload
    VERBOSE: received 360-byte response of content type application/json; charset=utf-8
    
  5. Voer de volgende opdracht uit om de gekoppelde schijf te ontgrendelen met behulp van het BEK-bestand:

    manage-bde -unlock F: -RecoveryKey "C:\BEK\EF7B2F5A-50C6-4637-9F13-7F599C12F85C.BEK
    

    In dit voorbeeld is de gekoppelde besturingssysteemschijf station F. Zorg ervoor dat u de juiste stationsletter gebruikt.

  6. Nadat de schijf is ontgrendeld met behulp van de BEK-sleutel, ontkoppelt u de schijf van de herstel-VM en gebruikt u vervolgens de functie Os-schijf wisselen om de besturingssysteemschijf van de oorspronkelijke VM te vervangen door deze herstelde schijf.

  7. Als de nieuwe VM nog steeds niet normaal kan worden opgestart, voert u een van de volgende stappen uit nadat u het station hebt ontgrendeld:

    • De beveiliging onderbreken om BitLocker tijdelijk uit te schakelen door de volgende opdracht uit te voeren:
    manage-bde -protectors -disable F: -rc 0
    
    • Het station volledig ontsleutelen. Voer hiervoor de volgende opdracht uit:
    manage-bde -off F:
    

Probleemoplossing voor scripts

Fout: kan bestand of assembly niet laden

Deze fout treedt op omdat de paden van de ADAL-assembly's onjuist zijn. U kunt zoeken naar Az.Accounts map om het juiste pad te vinden.

Fout: Get-AzKeyVaultSecret of Get-AzKeyVaultSecret wordt niet herkend als de naam van een cmdlet

Als u de oude Az PowerShell-module gebruikt, moet u de twee opdrachten wijzigen in Get-AzureKeyVaultSecret en Get-AzureKeyVaultSecret.

KEK-scriptparameters

Parameters Voorbeeld Controleren
$keyVaultName myKeyVault2707 Voer Get-AzVM -ResourceGroupName $rgName -Name $vmName -DisplayHint Expanden controleer Instellingen en KeyEncryptionKeyURL in de uitvoer. Hier volgt een voorbeeld:
"KeyEncryptionKeyURL":https://myKeyVault2707.vault.azure.net/keys/mykey/000072b987145a3b79b0ed415f0000
$kekName mykey Voer Get-AzVM -ResourceGroupName $rgName -Name $vmName -DisplayHint expand en controleer Instellingen en KeyEncryptionKeyURL in de uitvoer. Hier volgt een voorbeeld:
"KeyEncryptionKeyURL":https://myKeyVault2707.vault.azure.net/keys/mykey/000072b987145a3b79b0ed415f0000
$secretName 7EB4F531-5FBA-4970-8E2D-C11FD6B0C69D De naam van het geheim van de VM-sleutel.
Als u de juiste geheime naam wilt vinden, controleert u stap 6 in de sectie De versleutelde besturingssysteemschijf ontsleutelen .
$bekFilePath c:\bek\7EB4F531-5FBA-4970-8E2D-C11FD6B0C69D. BEK Een lokaal pad waar u het BEK-bestand wilt opslaan. In het voorbeeld moet u de map 'bek' maken voordat u het script uitvoert, anders treedt er een fout op.
$adTenant contoso.onmicrosoft.com FQDN of GUID van uw Microsoft Entra ID die als host fungeert voor de sleutelkluis

Az PowerShell-module installeren

Voer de volgende stappen uit om de Az PowerShell-module voor de herstel-VM te installeren:

  1. Open een PowerShell-sessie als beheerder en stel het HTTP-API-beveiligingsprotocol in op TLS 1.2 voor de huidige sessie. Het beveiligingsprotocol wordt teruggezet naar de standaardwaarde nadat u de huidige sessie hebt gesloten.

    [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
    
  2. Download de nieuwste versie van het Nuget-pakket:

     Install-PackageProvider -Name "Nuget" -Force
    
    
  3. Installeer de nieuwste versie van het PowerShellGet-pakket en start powershell opnieuw op.

    Install-Module -Name PowerShellGet -Force
    
  4. Voer de volgende opdracht uit om de nieuwste versie van de Azure Az-module te installeren:

    Install-Module -Name Az -Scope AllUsers -Repository PSGallery -Force
    
  5. Installeer het az.account 1.9.4-pakket:

    Install-Module -Name Az.Accounts -Scope AllUsers -RequiredVersion "1.9.4" -Repository PSGallery -Force
    

Contacteer ons voor hulp

Als u vragen hebt of hulp nodig hebt, maak een ondersteuningsaanvraag of vraag de Azure-communityondersteuning. U kunt ook productfeedback verzenden naar de Feedback-community van Azure.