Поделиться через


Ошибки загрузки BitLocker на виртуальной машине Azure

В этой статье описаны ошибки BitLocker, которые могут возникнуть при запуске виртуальной машины Windows в Microsoft Azure.

Признак

Виртуальная машина Windows не запускается. При проверка снимки экрана в окне диагностика загрузки отображается одно из следующих сообщений об ошибке:

  • Подключите USB-драйвер с ключом BitLocker

  • Ты заперта! Введите клавишу восстановления, чтобы снова начать работу (раскладка клавиатуры: США) Неправильные сведения для входа вводились слишком много раз, поэтому компьютер был заблокирован для защиты вашей конфиденциальности. Чтобы получить ключ восстановления, перейдите на страницу https://windows.microsoft.com/recoverykeyfaq с другого компьютера или мобильного устройства. В случае необходимости идентификатор ключа — XXXXXXX. Вы также можете сбросить компьютер.

  • Введите пароль для разблокировки этого диска [ ] Нажмите клавишу INSERT, чтобы увидеть пароль при вводе.

  • Введите ключ восстановления. Загрузите ключ восстановления с USB-устройства.

Причина

Эта проблема может возникнуть, если виртуальной машине не удается найти файл ключа восстановления BitLocker (BEK) для расшифровки зашифрованного диска.

Расшифровка зашифрованного диска ОС

Совет

Если у вас есть недавняя резервная копия виртуальной машины, попробуйте восстановить ее из резервной копии , чтобы устранить проблему с загрузкой.

Чтобы устранить эту проблему, остановите и освободите виртуальную машину, а затем запустите ее. Эта операция заставляет виртуальную машину получить BEK-файл из Key Vault Azure, а затем поместить его на зашифрованный диск.

Если этот метод не позволяет устранить проблему, выполните следующие действия, чтобы восстановить BEK-файл вручную:

  1. Создайте snapshot диска ОС затронутой виртуальной машины в качестве резервной копии. Дополнительные сведения см. в разделе Создание моментального снимка диска.

  2. Подключите диск ОС к виртуальной машине восстановления. При подключении управляемого диска может появиться сообщение об ошибке "содержит параметры шифрования и, следовательно, не может использоваться в качестве диска данных". В этом случае выполните следующий скрипт, чтобы повторить попытку подключения диска:

    $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-объекта.

  3. После подключения диска установите подключение удаленного рабочего стола к виртуальной машине восстановления.

  4. Установите модуль Az PowerShell и Az.Account 1.9.4 на виртуальной машине восстановления.

  5. Откройте сеанс Azure PowerShell с повышенными привилегиями (запуск от имени администратора). Выполните следующие команды, чтобы войти в подписку Azure:

    Add-AzAccount -SubscriptionID [SubscriptionID]
    
  6. Выполните следующий скрипт, чтобы проверка имя ФАЙЛА 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. БЕК.

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

    Если вы видите два повторяющихся тома, том с более новой меткой времени — это текущий BEK-файл, используемый виртуальной машиной восстановления.

    Если для параметра Тип контентазадано значение Wrapped BEK, перейдите к сценариям ключа шифрования ключей (KEK).

    Теперь, когда у вас есть имя BEK-файла для диска, необходимо создать secret-file-name. BEK-файл для разблокировки диска.

  7. Скачайте 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)
    
  8. Чтобы разблокировать подключенный диск с помощью BEK-файла, выполните следующую команду.

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

    В этом примере подключенным диском ОС является диск F. Убедитесь, что используется правильная буква диска.

  9. После успешного разблокирования диска с помощью ключа BEK отключите диск от виртуальной машины восстановления, а затем повторно создайте виртуальную машину с помощью этого нового диска ОС.

    Примечание.

    Переключение диска ОС доступно для любой виртуальной машины, зашифрованной с использованием версии ADE с одним проходом, но не поддерживается для двойного прохода.

  10. Если новая виртуальная машина по-прежнему не может загружаться нормально, попробуйте выполнить одно из следующих действий после разблокировки диска:

    • Приостановите защиту, чтобы временно отключить BitLocker, выполнив следующую команду:
    manage-bde -protectors -disable F: -rc 0
    
    • Полностью расшифруйте диск. Для этого выполните следующую команду.
    manage-bde -off F:
    

Сценарий ключа шифрования ключей (оболочка BEK)

Для сценария ключа шифрования ключей выполните следующие действия.

  1. Убедитесь, что для учетной записи вошедшего пользователя требуется разрешение "unwrapped" в политиках доступа Key Vault в user|Разрешения ключей|Криптографические операции|Распаковка ключа.

  2. Сохраните следующий скрипт в файл .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
    
  3. Задайте параметры. Скрипт обработает секрет KEK для создания ключа BEK, а затем сохранит его в локальной папке на виртуальной машине восстановления. Если при выполнении скрипта возникают ошибки, см. раздел Устранение неполадок скрипта .

  4. При запуске скрипта отображаются следующие выходные данные:

    Расположение версии 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
    
  5. Чтобы разблокировать подключенный диск с помощью ФАЙЛА BEK, выполните следующую команду:

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

    В этом примере подключенным диском ОС является диск F. Убедитесь, что используется правильная буква диска.

  6. После успешного разблокирования диска с помощью ключа BEK отключите диск от виртуальной машины восстановления, а затем используйте функцию переключения диска ОС, чтобы заменить диск ОС исходной виртуальной машины на этот восстановленный диск.

  7. Если новая виртуальная машина по-прежнему не может загружаться нормально, попробуйте выполнить одно из следующих действий после разблокировки диска:

    • Приостановите защиту, чтобы временно отключить 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 перед выполнением скрипта, иначе произойдет ошибка.
$adTenant contoso.onmicrosoft.com Полное доменное имя или GUID Microsoft Entra ID, в котором размещается хранилище ключей

Установка модуля Az PowerShell

Чтобы установить модуль Az PowerShell для виртуальной машины восстановления, выполните следующие действия.

  1. Откройте сеанс PowerShell от имени администратора и задайте для протокола безопасности API HTTP значение TLS 1.2 для текущего сеанса. После закрытия текущего сеанса протокол безопасности будет возвращен к значению по умолчанию.

    [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
    
  2. Скачайте последнюю версию пакета Nuget:

     Install-PackageProvider -Name "Nuget" -Force
    
    
  3. Установите последнюю версию пакета PowerShellGet, а затем перезапустите PowerShell.

    Install-Module -Name PowerShellGet -Force
    
  4. Выполните следующую команду, чтобы установить последнюю версию модуля Azure Az:

    Install-Module -Name Az -Scope AllUsers -Repository PSGallery -Force
    
  5. Установите пакет Az.Account 1.9.4:

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

Свяжитесь с нами для получения помощи

Если у вас есть вопросы или вам нужна помощь, создайте запрос в службу поддержки или обратитесь за поддержкой сообщества Azure. Вы также можете отправить отзыв о продукте в сообщество отзывов Azure.