Delen via


BitLocker-opstartfouten op een Azure-VM

Van toepassing op: ✔️ Windows-VM's

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

Symptoom

Er wordt geen Windows-VM 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 opnieuw 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 een andere pc of een ander mobiel apparaat. Als u dit nodig hebt, is de sleutel-id XXXXXXX. Of u kunt uw pc 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 VIRTUELE machine het BitLocker-herstelsleutelbestand (BEK) niet kan vinden om de versleutelde schijf te ontsleutelen.

De versleutelde besturingssysteemschijf ontsleutelen

Tip

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

U kunt dit probleem oplossen door de VIRTUELE machine te stoppen en de toewijzing ervan ongedaan te maken en deze vervolgens te starten. Met deze bewerking wordt de VM gedwongen het BEK-bestand op te halen uit de Azure Key Vault en deze 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 betreffende VM als back-up. Zie Momentopname van een schijf 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 een beheerde schijf niet koppelen aan een virtuele machine die is hersteld vanuit een blobinstallatiekopieën.

  3. Nadat de schijf is gekoppeld, maakt u een externe bureaubladverbinding met de herstel-VM.

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

  5. Open een Azure PowerShell-sessie met verhoogde bevoegdheid (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}}
    

    Hier volgt een voorbeeld van de uitvoer. In dit geval wordt ervan uitgegaan 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 het inhoudstype verpakt 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 naam van het geheimbestand 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 VIRTUELE machine opnieuw met behulp van deze nieuwe besturingssysteemschijf.

    Notitie

    Het wisselen van besturingssysteemschijf is beschikbaar voor elke VIRTUELE machine die is versleuteld met een ADE-versie met één wachtwoord, maar wordt niet ondersteund voor Dual Pass.

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

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

Scenario met sleutelversleutelingssleutels (verpakte BEK)

Voer de volgende stappen uit voor een scenario met sleutelversleutelingssleutels:

  1. Zorg ervoor dat voor het aangemelde gebruikersaccount de machtiging 'uitgepakt' 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:

    Notitie

    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 het vervolgens op in een lokale map op de herstel-VM. Als u fouten ontvangt wanneer u het script uitvoert, raadpleegt u de sectie voor probleemoplossing van 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 VIRTUELE machine nog steeds niet normaal kan worden opgestart, voert u een van de volgende stappen uit nadat u het station hebt ontgrendeld:

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

Problemen met scripts oplossen

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 de 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 ExpandInstellingen en KeyEncryptionKeyURL uit en controleer deze 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 Instellingen en KeyEncryptionKeyURL uit en controleer deze 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 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 wordt er een foutmelding weergegeven.
$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 de PowerShell opnieuw.

    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
    

Contact met ons opnemen voor ondersteuning

Als u vragen hebt of hulp nodig hebt, maakt u een ondersteuningsaanvraag of stelt u ondersteuning voor de Azure-community. U kunt ook productfeedback verzenden naar de Azure-feedbackcommunity.