Ошибки загрузки BitLocker на виртуальной машине Azure
Область применения: ✔️ Виртуальные машины Windows
В этой статье описаны ошибки BitLocker, которые могут возникнуть при запуске виртуальной машины Windows в Microsoft Azure.
Симптом
Виртуальная машина Windows не запускается. При проверке скриншотов в окне Диагностика загрузки появляется одно из следующих сообщений об ошибке.
Подключение USB-драйвера с ключом BitLocker
Вы заблокированы. Введите ключ восстановления чтобы снова начать работу (макет клавиатуры: США). Неправильные входные данные вводились много раз, поэтому ваш компьютер был заблокирован для защиты вашей конфиденциальной информации. Чтобы получить ключ восстановления, перейдите в раздел https://windows.microsoft.com/recoverykeyfaq с другого компьютера или мобильного устройства. В случае необходимости ключ ID — XXXXXXX. Или можно вернуть компьютер в исходное состояние.
Введите пароль для разблокировки этого диска [ ]. Нажмите клавишу Insert для просмотра пароля при вводе.
Введите ключ восстановления. Загрузите ключ восстановления с USB-устройства.
Причина
Эта проблема может возникнуть если виртуальная машина не сможет найти файл ключа восстановления BitLocker (BEK) для дешифрования зашифрованного диска.
Расшифровка зашифрованного диска ОС
Совет
Если у вас есть последняя резервная копия виртуальной машины, попробуйте восстановить виртуальную машину из резервной копии , чтобы устранить проблему загрузки.
Чтобы устранить эту проблему, остановите и разрешите виртуальную машину, а затем запустите ее. Эта операция заставляет виртуальную машину извлекать файл BEK из Azure Key Vault, а затем помещать его на зашифрованный диск.
Если с помощью этого метода не удается устранить проблему, выполните следующие действия для восстановления BEK-файла вручную.
Сделайте снимок диска ОС затронутой виртуальной машины в качестве резервной копии. Дополнительные сведения см. в статье Создание моментального снимка.
Устранение неполадок с виртуальной машиной Windows при подключении диска операционной системы к виртуальной машине восстановления с помощью портала Azure. Когда вы подключаете управляемый диск, может появиться сообщение об ошибке "диск содержит параметры шифрования и поэтому не может использоваться в качестве диска данных". В этом случае запустите следующий сценарий, чтобы повторить попытку подключения этого диска.
$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
Вы не можете подключить управляемый диск к виртуальной машине, которая была восстановлена из BLOB-объекта образа.
После подключения диска подключитесь к виртуальной машине восстановления удаленного рабочего стола.
Установите модуль Az PowerShell и Az.Account 1.9.4 на виртуальной машине восстановления.
Откройте расширенный сеанс Azure PowerShell (Запуск от имени администратора). Выполните приведенные ниже команды, чтобы войти в подписку Azure.
Add-AzAccount -SubscriptionID [SubscriptionID]
Выполните следующий скрипт, чтобы проверить имя файла BEK (имя секрета):
$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}}
Ниже приведен пример выходных данных. В этом случае предполагается, что имя файла — 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
Если отображаются два дублированных тома, том, содержащий новую временную метку является текущим BEK-файлом, который используется виртуальной машиной восстановления.
Если значение Тип содержимого — зашифрованный BEK, перейдите в меню Сценарии ключа шифрования ключа (KEK).
Теперь, когда имя BEK-файла для диска выбрано, необходимо создать секретное имя BEK-файла для разблокировки диска.
Скачайте BEK-файл на диск восстановления. Следующий пример сохраняет BEK-файл в папку C:\BEK. Перед запуском скриптов убедитесь, что путь
C:\BEK\
существует.$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)
Чтобы разблокировать подключенный диск с помощью файла BEK, выполните следующую команду.
manage-bde -unlock F: -RecoveryKey "C:\BEK\EF7B2F5A-50C6-4637-0001-7F599C12F85C.BEK"
В этом примере диск F является подключенным диском ОС. Выберите правильное имя диска.
После успешного разблокирования диска с помощью ключа BEK отсоедините диск от виртуальной машины восстановления, а затем повторно создайте виртуальную машину с помощью этого нового диска ОС.
Примечание.
Переключение диска ОС доступно для любой виртуальной машины, зашифрованной с использованием одной сквозной версии ADE, но не поддерживается для двойного прохода.
Если новая виртуальная машина по-прежнему не может загружаться обычно, попробуйте выполнить одно из следующих действий после разблокировки диска:
- Приостанавливать защиту, чтобы временно отключить BitLocker, выполнив следующие действия:
manage-bde -protectors -disable F: -rc 0
- Полностью расшифровка диска. Для этого выполните следующую команду:
manage-bde -off F:
Сценарий ключа шифрования ключей (оболочка BEK)
Для сценария ключа шифрования ключа выполните следующие действия.
Убедитесь, что зарегистрированная учетная запись пользователя требует наличие "развернутого" разрешения в политиках доступа к хранилищу ключей в USER|Key permissions|Cryptographic Operations|Unwrap Key.
Сохраните следующий скрипт в PS1-файл:
Примечание.
Сборки ADAL (dll-файлы), используемые в этом скрипте, доступны только в Az.Account 1.9.4 и более ранних версиях. Чтобы установить модуль Az.Account, см . раздел "Установка модуля Az 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
Задайте параметры. Сценарий будет обрабатывать секрет KEK для создания ключа BEK, а затем сохранит его в локальной папке на виртуальной машине восстановления. Если при запуске скрипта возникают ошибки, см . раздел устранения неполадок скрипта.
После запуска сценария появится следующий результат.
Расположение версии GAC
False v4.0.30319 C:\Program Files\WindowsPowerShell\Modules\Az.Accounts... False v4.0.30319 C:\Program Files\WindowsPowerShell\Modules\Az.Accounts...
После завершения сценария отобразятся следующие выходные данные.
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
Чтобы разблокировать подключенный диск с помощью BEK-файла, выполните следующую команду.
manage-bde -unlock F: -RecoveryKey "C:\BEK\EF7B2F5A-50C6-4637-9F13-7F599C12F85C.BEK
В этом примере диск F является подключенным диском ОС. Выберите правильное имя диска.
После успешного разблокировки диска с помощью ключа BEK отсоедините диск от виртуальной машины восстановления, а затем используйте функцию замены диска ОС исходной виртуальной машины на этот восстановленный диск.
Если новая виртуальная машина по-прежнему не может загружаться обычно, попробуйте выполнить одно из следующих действий после разблокировки диска:
- Приостанавливать защиту, чтобы временно отключить BitLocker, выполнив следующую команду:
manage-bde -protectors -disable F: -rc 0
- Полностью расшифровка диска. Для этого выполните следующую команду:
manage-bde -off F:
Устранение неполадок сценариев
Ошибка: не удалось загрузить файл или сборку
Эта ошибка возникает из-за неправильного пути сборок ADAL. Чтобы найти правильный путь, можно найти Az.Accounts
папку.
Ошибка: Get-AzKeyVaultSecret или Get-AzKeyVaultSecret не распознается как имя командлета.
Если вы используете старый модуль Az PowerShell, необходимо изменить две команды на Get-AzureKeyVaultSecret
и Get-AzureKeyVaultSecret
.
Параметры скрипта KEK
Параметры | Пример | Как проверить |
---|---|---|
$keyVaultName | myKeyVault2707 | Запустите Get-AzVM -ResourceGroupName $rgName -Name $vmName -DisplayHint Expand и проверьте параметры и KeyEncryptionKeyURL в выходных данных. Ниже приведен пример:"KeyEncryptionKeyURL": https://myKeyVault2707.vault.azure.net/keys/mykey/000072b987145a3b79b0ed415f0000 |
$kekName | mykey | Запустите Get-AzVM -ResourceGroupName $rgName -Name $vmName -DisplayHint expand и проверьте параметры и KeyEncryptionKeyURL в выходных данных. Ниже приведен пример:"KeyEncryptionKeyURL": https://myKeyVault2707.vault.azure.net/keys/mykey/000072b987145a3b79b0ed415f0000 |
$secretName | 7EB4F531-5FBA-4970-8E2D-C11FD6B0C69D | Имя секрета ключа виртуальной машины. Чтобы найти правильное имя секрета, проверьте шаг 6 в разделе "Расшифровать зашифрованный диск ОС". |
$bekFilePath | c:\bek\7EB4F531-5FBA-4970-8E2D-C11FD6B0C69D. BEK | Локальный путь к файлу BEK. В этом примере необходимо создать папку bek перед запуском скрипта или ошибка. |
$adTenant | contoso.onmicrosoft.com | Полное доменное имя или GUID идентификатора Microsoft Entra, в котором размещено хранилище ключей |
Установка модуля Az PowerShell
Чтобы установить модуль Az PowerShell для виртуальной машины восстановления, выполните следующие действия.
Откройте сеанс PowerShell от имени администратора и задайте протокол безопасности API HTTP для TLS 1.2 для текущего сеанса. Протокол безопасности будет возвращен в значение по умолчанию после закрытия текущего сеанса.
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
Скачайте последнюю версию пакета Nuget:
Install-PackageProvider -Name "Nuget" -Force
Установите последнюю версию пакета PowerShellGet и перезапустите PowerShell.
Install-Module -Name PowerShellGet -Force
Выполните следующую команду, чтобы установить последнюю версию модуля Azure Az:
Install-Module -Name Az -Scope AllUsers -Repository PSGallery -Force
Установите пакет Az.Account 1.9.4:
Install-Module -Name Az.Accounts -Scope AllUsers -RequiredVersion "1.9.4" -Repository PSGallery -Force
Свяжитесь с нами для получения помощи
Если у вас есть вопросы или помощь, создайте запрос на поддержку или попросите сообщества Azure. Вы также можете отправить отзыв о продукте в сообщество отзывов Azure.