Erros de inicialização do BitLocker em uma VM do Azure

Este artigo descreve os erros do BitLocker que podem ocorrer ao iniciar uma máquina virtual (VM) do Windows no Microsoft Azure.

Sintoma

Uma VM do Windows não inicia. Ao verificar as capturas de tela na janela Boot diagnostics, você verá uma das seguintes mensagens de erro:

  • Conecte o driver USB que possui a chave BitLocker

  • Você está bloqueado! Insira a chave de recuperação para continuar (Layout do teclado: EUA) As informações de login incorretas foram inseridas muitas vezes, então seu PC foi bloqueado para proteger sua privacidade. Para recuperar a chave de recuperação, vá para https://windows.microsoft.com/recoverykeyfaq de outro PC ou dispositivo móvel. Caso precise, o ID da chave é XXXXXXX. Ou, você pode redefinir seu PC.

  • Digite a senha para desbloquear esta unidade [ ] Pressione a tecla Insert para ver a senha enquanto digita.

  • Digite sua chave de recuperação Carregue sua chave de recuperação de um dispositivo USB.

Motivo

Esse problema pode ocorrer se a VM não conseguir localizar o arquivo BitLocker Recovery Key (BEK) para descriptografar o disco criptografado.

Descriptografar o disco do sistema operacional criptografado

Dica

Se você tiver um backup recente da VM, tente restaurar a VM do backup para corrigir o problema de inicialização.

Para resolver esse problema, pare e desaloque a VM e, em seguida, inicie-a. Essa operação força a VM a recuperar o arquivo BEK do Azure Key Vault e colocá-lo no disco criptografado.

Se esse método não resolver o problema, siga estas etapas para restaurar o arquivo BEK manualmente:

  1. Faça um instantâneo do disco do sistema operacional da VM afetada como um backup. Para saber mais, consulte Instantâneo de um disco.

  2. Anexe o disco do SO a uma VM de recuperação. Ao anexar um disco gerenciado, você pode receber uma mensagem de erro "contém configurações de criptografia e, portanto, não pode ser usado como um disco de dados". Nessa situação, execute o seguinte script para tentar anexar o disco novamente:

    $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
    

    Você não pode anexar um disco gerenciado a uma VM que foi restaurada de uma imagem de blob.

  3. Depois que o disco estiver conectado, faça uma conexão de área de trabalho remota com a VM de recuperação.

  4. Instale o módulo Az PowerShell e Az.Account 1.9.4 na VM de recuperação.

  5. Abra uma sessão elevada do Azure PowerShell (executar como administrador). Execute os seguintes comandos para entrar na assinatura do Azure:

    Add-AzAccount -SubscriptionID [SubscriptionID]
    
  6. Execute o seguinte script para verificar o nome do arquivo BEK (nome secreto):

    $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}}
    

    O seguinte é um exemplo de saída. Nesse caso, assumimos que o nome do arquivo é 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
    

    Se você vir dois volumes duplicados, o volume que tem o carimbo de data/hora mais recente é o arquivo BEK atual usado pela VM de recuperação.

    Se o valor Tipo de conteúdo for BEK encapsulado, vá para os cenários Chave de criptografia de chave (KEK).

    Agora que você tem o nome do arquivo BEK para a unidade, é necessário criar o arquivo secret-file-name.BEK para desbloquear a unidade.

  7. Baixe o arquivo BEK para o disco de recuperação. O exemplo a seguir salva o arquivo BEK na pasta C:\BEK. Certifique-se de que o caminho C:\BEK\ exista antes de executar os scripts.

    $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. Para desbloquear o disco anexado usando o arquivo BEK, execute o seguinte comando.

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

    Neste exemplo, o disco do sistema operacional anexado é a unidade F. Certifique-se de usar a letra de unidade correta.

  9. Depois que o disco foi desbloqueado com êxito usando a chave BEK, desconecte o disco da VM de recuperação e, em seguida, recrie a VM usando esse novo disco do sistema operacional.

    Observação

    A troca de disco do sistema operacional está disponível para qualquer VM criptografada com a versão ADE de passagem única, mas não é compatível com a passagem dupla.

  10. Se a nova VM ainda não conseguir inicializar normalmente, tente uma das etapas a seguir depois de desbloquear a unidade:

    • Suspenda a proteção para desativar temporariamente o BitLocker executando o seguinte:
    manage-bde -protectors -disable F: -rc 0
    
    • Descriptografe totalmente a unidade. Para fazer isso, execute o seguinte comando:
    manage-bde -off F:
    

Cenário de chave de criptografia de chave (BEK encapsulado)

Para um cenário de chave de criptografia de chave, siga estas etapas:

  1. Certifique-se de que a conta do usuário conectado exija a permissão "desempacotada" nas políticas de acesso ao Key Vault em USER|Permissões de chave|Operações criptográficas|Chave desempacotada.

  2. Salve o script a seguir em um arquivo .PS1:

    Observação

    Os assemblies ADAL (arquivos dll) usados neste script estão disponíveis apenas em Az.Account 1.9.4 e nas versões anteriores. Para instalar o módulo Az.Account, consulte Instalar o módulo 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. Defina os parâmetros. O script processará o segredo KEK para criar a chave BEK e, em seguida, salvá-lo em uma pasta local na VM de recuperação. Se você receber erros ao executar o script, consulte a seção solução de problemas de script.

  4. Você vê a seguinte saída quando o script começa:

    Localização da Versão GAC


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

    Quando o script terminar, você verá a seguinte saída:

    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. Para desbloquear o disco anexado usando o arquivo BEK, execute o seguinte comando:

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

    Neste exemplo, o disco do sistema operacional anexado é a unidade F. Certifique-se de usar a letra de unidade correta.

  6. Depois que o disco foi desbloqueado com sucesso usando a chave BEK, desconecte o disco da VM de recuperação e, em seguida, use o recurso Swap OS disk para substituir o disco do SO da VM original por este disco reparado.

  7. Se a nova VM ainda não conseguir inicializar normalmente, tente uma das etapas a seguir depois de desbloquear a unidade:

    • Suspenda a proteção para desativar temporariamente o BitLocker executando o seguinte comando:
    manage-bde -protectors -disable F: -rc 0
    
    • Descriptografe totalmente a unidade. Para fazer isso, execute o seguinte comando:
    manage-bde -off F:
    

Solução de problemas de script

Erro: não foi possível carregar arquivo ou montagem

Este erro ocorre porque os caminhos dos Assemblies da ADAL estão errados. Você pode procurar a pasta Az.Accounts para encontrar o caminho correto.

Erro: Get-AzKeyVaultSecret ou Get-AzKeyVaultSecret não é reconhecido como o nome de um cmdlet

Se você estiver usando o antigo módulo Az PowerShell, deverá alterar os dois comandos para Get-AzureKeyVaultSecret e Get-AzureKeyVaultSecret.

Parâmetros de script KEK

Parâmetros Exemplo Como verificar
$keyVaultName myKeyVault2707 Execute Get-AzVM -ResourceGroupName $rgName -Name $vmName -DisplayHint Expande verifique Configurações e KeyEncryptionKeyURL na saída. Aqui está um exemplo:
"KeyEncryptionKeyURL":https://myKeyVault2707.vault.azure.net/keys/mykey/000072b987145a3b79b0ed415f0000
$kekName mykey Execute Get-AzVM -ResourceGroupName $rgName -Name $vmName -DisplayHint expand e verifique Configurações e KeyEncryptionKeyURL na saída. Aqui está um exemplo:
"KeyEncryptionKeyURL":https://myKeyVault2707.vault.azure.net/keys/mykey/000072b987145a3b79b0ed415f0000
$secretName 7EB4F531-5FBA-4970-8E2D-C11FD6B0C69D O nome do segredo da chave VM.
Para encontrar o nome secreto correto, verifique a etapa 6 na seção Descriptografar o disco do sistema operacional criptografado.
$bekFilePath c:\bek\7EB4F531-5FBA-4970-8E2D-C11FD6B0C69D.BEK Um caminho local onde você deseja salvar o arquivo BEK. No exemplo, você precisa criar a pasta "bek" antes de executar o script ou ocorrerá um erro.
$adTenant contoso.onmicrosoft.com FQDN ou GUID do Microsoft Entra ID que hospeda o cofre de chaves

Instale o módulo Az PowerShell

Para instalar o módulo Az PowerShell para a VM de recuperação, siga estas etapas:

  1. Abra uma sessão do PowerShell como administrador e defina o protocolo de segurança das APIs HTTP como TLS 1.2 para a sessão atual. O protocolo de segurança será revertido para o valor padrão depois que você fechar a sessão atual.

    [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
    
  2. Baixar a última versão do pacote Nuget:

     Install-PackageProvider -Name "Nuget" -Force
    
    
  3. Instale a versão mais recente do pacote PowerShellGet e reinicie o PowerShell.

    Install-Module -Name PowerShellGet -Force
    
  4. Execute o seguinte comando para instalar a versão mais recente do módulo Azure Az:

    Install-Module -Name Az -Scope AllUsers -Repository PSGallery -Force
    
  5. Instale o pacote Az.Account 1.9.4:

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

Entre em contato conosco para obter ajuda

Se você tiver dúvidas ou precisar de ajuda, crie uma solicitação de suporte ou peça ajuda à comunidade de suporte do Azure. Você também pode enviar comentários sobre o produto para a comunidade de comentários do Azure.