Błędy rozruchu funkcji BitLocker na maszynie wirtualnej platformy Azure
Dotyczy: ✔️ maszyny wirtualne z systemem Windows
W tym artykule opisano błędy funkcji BitLocker, które mogą wystąpić podczas uruchamiania maszyny wirtualnej z systemem Windows na platformie Microsoft Azure.
Objaw
Maszyna wirtualna z systemem Windows nie uruchamia się. Po sprawdzeniu zrzutów ekranu w oknie Diagnostyka rozruchu zostanie wyświetlony jeden z następujących komunikatów o błędach:
Podłącz sterownik USB, który ma klucz funkcji BitLocker
Masz blokadę! Wprowadź klucz odzyskiwania, aby przejść ponownie (układ klawiatury: USA) Nieprawidłowe informacje logowania zostały wprowadzone zbyt wiele razy, więc komputer został zablokowany w celu ochrony prywatności. Aby pobrać klucz odzyskiwania, przejdź do https://windows.microsoft.com/recoverykeyfaq innego komputera lub urządzenia przenośnego. W razie potrzeby identyfikator klucza to XXXXXXX. Możesz też zresetować komputer.
Wprowadź hasło, aby odblokować ten dysk [ ] Naciśnij Wstaw, aby wyświetlić hasło podczas wpisywania.
Wprowadź klucz odzyskiwania Załaduj klucz odzyskiwania z urządzenia USB.
Przyczyna
Ten problem może wystąpić, jeśli maszyna wirtualna nie może zlokalizować pliku klucza odzyskiwania funkcji BitLocker (BEK), aby odszyfrować zaszyfrowany dysk.
Odszyfrowywanie zaszyfrowanego dysku systemu operacyjnego
Napiwek
Jeśli masz najnowszą kopię zapasową maszyny wirtualnej, możesz spróbować przywrócić maszynę wirtualną z kopii zapasowej , aby rozwiązać problem z rozruchem.
Aby rozwiązać ten problem, zatrzymaj i cofnij przydział maszyny wirtualnej, a następnie uruchom ją. Ta operacja wymusza na maszynie wirtualnej pobranie pliku BEK z usługi Azure Key Vault, a następnie umieszczenie go na zaszyfrowanym dysku.
Jeśli ta metoda nie rozwiąże problemu, wykonaj następujące kroki, aby ręcznie przywrócić plik BEK:
Utwórz migawkę dysku systemu operacyjnego maszyny wirtualnej, której dotyczy problem, jako kopię zapasową. Aby uzyskać więcej informacji, zobacz Migawka dysku.
Dołącz dysk systemu operacyjnego do maszyny wirtualnej odzyskiwania. Podczas dołączania dysku zarządzanego może zostać wyświetlony komunikat o błędzie "zawiera ustawienia szyfrowania i dlatego nie można go użyć jako dysku danych". W takiej sytuacji uruchom następujący skrypt, aby spróbować ponownie dołączyć dysk:
$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
Nie można dołączyć dysku zarządzanego do maszyny wirtualnej, która została przywrócona z obrazu obiektu blob.
Po dołączeniu dysku utwórz połączenie pulpitu zdalnego z maszyną wirtualną odzyskiwania.
Zainstaluj moduł Az programu PowerShell i moduł Az.Account 1.9.4 na maszynie wirtualnej odzyskiwania.
Otwórz sesję programu Azure PowerShell z podwyższonym poziomem uprawnień (Uruchom jako administrator). Uruchom następujące polecenia, aby zalogować się do subskrypcji platformy Azure:
Add-AzAccount -SubscriptionID [SubscriptionID]
Uruchom następujący skrypt, aby sprawdzić nazwę pliku BEK (nazwę wpisu tajnego):
$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}}
Poniżej przedstawiono przykładowe dane wyjściowe. W tym przypadku przyjęto założenie, że nazwa pliku to EF7B2F5A-50C6-4637-0001-7F599C12F85C. BEK.
Created Content Type Volume MachineName DiskEncryptionKeyFileName ------- ------------ ------ ----------- ------------------------- 11/20/2020 7:41:56 AM BEK C:\ myVM EF7B2F5A-50C6-4637-0001-7F599C12F85C.BEK
Jeśli widzisz dwa zduplikowane woluminy, wolumin, który zawiera nowszy znacznik czasu, jest bieżącym plikiem BEK używanym przez maszynę wirtualną odzyskiwania.
Jeśli wartość Typ zawartości jest opakowana kluczem BEK, przejdź do scenariuszy klucza szyfrowania kluczy (KEK).
Teraz, gdy masz nazwę pliku BEK dla dysku, musisz utworzyć nazwę secret-file-name. Plik BEK do odblokowania dysku.
Pobierz plik BEK na dysk odzyskiwania. Poniższy przykład zapisuje plik BEK w folderze C:\BEK. Przed uruchomieniem skryptów upewnij się, że
C:\BEK\
ścieżka istnieje.$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)
Aby odblokować dołączony dysk przy użyciu pliku BEK, uruchom następujące polecenie.
manage-bde -unlock F: -RecoveryKey "C:\BEK\EF7B2F5A-50C6-4637-0001-7F599C12F85C.BEK"
W tym przykładzie dołączony dysk systemu operacyjnego to F. Upewnij się, że używasz poprawnej litery dysku.
Po pomyślnym odblokowaniu dysku przy użyciu klucza szyfrowania kluczy odłącz dysk od maszyny wirtualnej odzyskiwania, a następnie utwórz ponownie maszynę wirtualną przy użyciu tego nowego dysku systemu operacyjnego.
Uwaga 16.
Zamiana dysku systemu operacyjnego jest dostępna dla dowolnej maszyny wirtualnej zaszyfrowanej przy użyciu pojedynczej wersji usługi ADE z przekazywaniem jednokrotnym, ale nie jest obsługiwana w przypadku podwójnego przekazywania.
Jeśli nowa maszyna wirtualna nadal nie może uruchomić się normalnie, spróbuj wykonać jedną z następujących czynności po odblokowaniu dysku:
- Wstrzymaj ochronę, aby tymczasowo wyłączyć funkcję BitLocker, uruchamiając następujące polecenie:
manage-bde -protectors -disable F: -rc 0
- W pełni odszyfruj dysk. Aby to zrobić, uruchom następujące polecenie:
manage-bde -off F:
Scenariusz klucza szyfrowania kluczy (opakowany klucz szyfrowania kluczy)
W przypadku scenariusza klucza szyfrowania kluczy wykonaj następujące kroki:
Upewnij się, że zalogowane konto użytkownika wymaga uprawnienia "niezapisane" w zasadach dostępu usługi Key Vault w użytkowniku |Uprawnienia klucza|Operacje kryptograficzne|Odpakuj klucz.
Zapisz następujący skrypt w pliku PS1:
Uwaga 16.
Zestawy biblioteki ADAL (pliki dll), które są używane w tym skrygcie, są dostępne tylko w narzędziu Az.Account 1.9.4 i wcześniejszych wersjach. Aby zainstalować moduł Az.Account, zobacz Instalowanie modułu Az programu PowerShell.
#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
Ustaw parametry. Skrypt przetworzy klucz tajny klucza KEK, aby utworzyć klucz szyfrowania szyfrowania kluczy, a następnie zapisze go w folderze lokalnym na maszynie wirtualnej odzyskiwania. Jeśli podczas uruchamiania skryptu wystąpią błędy, zobacz sekcję rozwiązywania problemów ze skryptem.
Po rozpoczęciu skryptu zobaczysz następujące dane wyjściowe:
Lokalizacja wersji GAC
Fałsz v4.0.30319 C:\Program Files\WindowsPowerShell\Modules\Az.Accounts... Fałsz v4.0.30319 C:\Program Files\WindowsPowerShell\Modules\Az.Accounts...
Po zakończeniu działania skryptu zobaczysz następujące dane wyjściowe:
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
Aby odblokować dołączony dysk przy użyciu pliku BEK, uruchom następujące polecenie:
manage-bde -unlock F: -RecoveryKey "C:\BEK\EF7B2F5A-50C6-4637-9F13-7F599C12F85C.BEK
W tym przykładzie dołączony dysk systemu operacyjnego to F. Upewnij się, że używasz poprawnej litery dysku.
Po pomyślnym odblokowaniu dysku przy użyciu klucza szyfrowania kluczy odłącz dysk od maszyny wirtualnej odzyskiwania, a następnie użyj funkcji Zamień dysk systemu operacyjnego, aby zastąpić dysk systemu operacyjnego oryginalnej maszyny wirtualnej tym naprawionym dyskiem.
Jeśli nowa maszyna wirtualna nadal nie może uruchomić się normalnie, spróbuj wykonać jedną z następujących czynności po odblokowaniu dysku:
- Wstrzymaj ochronę, aby tymczasowo wyłączyć funkcję BitLocker, uruchamiając następujące polecenie:
manage-bde -protectors -disable F: -rc 0
- W pełni odszyfruj dysk. Aby to zrobić, uruchom następujące polecenie:
manage-bde -off F:
Rozwiązywanie problemów ze skryptami
Błąd: Nie można załadować pliku lub zestawu
Ten błąd występuje, ponieważ ścieżki zestawów ADAL są nieprawidłowe. Możesz wyszukać Az.Accounts
folder, aby znaleźć poprawną ścieżkę.
Błąd: Polecenie Get-AzKeyVaultSecret lub Get-AzKeyVaultSecret nie jest rozpoznawane jako nazwa polecenia cmdlet
Jeśli używasz starego modułu Az programu PowerShell, musisz zmienić dwa polecenia na Get-AzureKeyVaultSecret
i Get-AzureKeyVaultSecret
.
Parametry skryptu KEK
Parametry | Przykład | Jak sprawdzić |
---|---|---|
$keyVaultName | myKeyVault2707 | Uruchom Get-AzVM -ResourceGroupName $rgName -Name $vmName -DisplayHint Expand i sprawdź ustawienia i keyEncryptionKeyURL w danych wyjściowych. Oto przykład:"KeyEncryptionKeyURL": https://myKeyVault2707.vault.azure.net/keys/mykey/000072b987145a3b79b0ed415f0000 |
$kekName | mykey | Uruchom Get-AzVM -ResourceGroupName $rgName -Name $vmName -DisplayHint expand i sprawdź ustawienia i keyEncryptionKeyURL w danych wyjściowych. Oto przykład:"KeyEncryptionKeyURL": https://myKeyVault2707.vault.azure.net/keys/mykey/000072b987145a3b79b0ed415f0000 |
$secretName | 7EB4F531-5FBA-4970-8E2D-C11FD6B0C69D | Nazwa wpisu tajnego klucza maszyny wirtualnej. Aby znaleźć poprawną nazwę wpisu tajnego, sprawdź krok 6 w sekcji Odszyfrowywanie zaszyfrowanego dysku systemu operacyjnego. |
$bekFilePath | c:\bek\7EB4F531-5FBA-4970-8E2D-C11FD6B0C69D. Klucz szyfrowania | Ścieżka lokalna, w której chcesz zapisać plik BEK. W tym przykładzie należy utworzyć folder "bek" przed uruchomieniem skryptu lub wystąpi błąd. |
$adTenant | contoso.onmicrosoft.com | Nazwa FQDN lub identyfikator GUID identyfikatora entra firmy Microsoft, który hostuje magazyn kluczy |
Instalowanie modułu Az programu PowerShell
Aby zainstalować moduł Az programu PowerShell dla maszyny wirtualnej odzyskiwania, wykonaj następujące kroki:
Otwórz sesję programu PowerShell jako administrator i ustaw protokół zabezpieczeń interfejsów API HTTP na TLS 1.2 dla bieżącej sesji. Protokół zabezpieczeń zostanie przywrócony do wartości domyślnej po zamknięciu bieżącej sesji.
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
Pobierz najnowszą wersję pakietu Nuget:
Install-PackageProvider -Name "Nuget" -Force
Zainstaluj najnowszą wersję pakietu PowerShellGet, a następnie uruchom ponownie program PowerShell.
Install-Module -Name PowerShellGet -Force
Uruchom następujące polecenie, aby zainstalować najnowszą wersję modułu Azure Az:
Install-Module -Name Az -Scope AllUsers -Repository PSGallery -Force
Zainstaluj pakiet Az.Account 1.9.4:
Install-Module -Name Az.Accounts -Scope AllUsers -RequiredVersion "1.9.4" -Repository PSGallery -Force
Skontaktuj się z nami, aby uzyskać pomoc
Jeśli masz pytania lub potrzebujesz pomocy, utwórz wniosek o pomoc techniczną lub zadaj pytanie w społeczności wsparcia dla platformy Azure. Możesz również przesłać opinię o produkcie do społeczności opinii na temat platformy Azure.