Erros de inicialização do BitLocker em uma VM do Azure
Aplica-se a: ✔️ VMs do Windows
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:
Conectar driver USB que tem a chave do BitLocker
Você está bloqueado! Insira a chave de recuperação para começar novamente (Layout do teclado: EUA) As informações de entrada incorretas foram inseridas muitas vezes, portanto, o computador 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.
Insira a senha para desbloquear esta unidade [ ] Pressione a tecla Insert para ver a senha enquanto você digita.
Insira a chave de recuperação para Carregar a 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:
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.
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.
Depois que o disco estiver conectado, faça uma conexão de área de trabalho remota com a VM de recuperação.
Instale o módulo Az PowerShell e Az.Account 1.9.4 na VM de recuperação.
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]
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.
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)
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.
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.
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:
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.
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
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.
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
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.
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.
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 Expand e 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:
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
Baixar a última versão do pacote Nuget:
Install-PackageProvider -Name "Nuget" -Force
Instale a versão mais recente do pacote PowerShellGet e reinicie o PowerShell.
Install-Module -Name PowerShellGet -Force
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
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.