Errori di avvio di BitLocker in una macchina virtuale di Azure

Questo articolo descrive gli errori di BitLocker che potrebbero verificarsi all'avvio di una macchina virtuale (VM) Windows in Microsoft Azure.

Sintomo

Una macchina virtuale Windows non si avvia. Quando controlli gli screenshot nella finestra Diagnostica di avvio, viene visualizzato uno dei seguenti messaggi di errore:

  • Collegare il driver USB che ha la chiave BitLocker

  • Sei bloccato! Inserisci la chiave di ripristino per ricominciare (Layout tastiera: Stati Uniti) Le informazioni di accesso errate sono state inserite troppe volte, quindi il tuo PC è stato bloccato per proteggere la tua privacy. Per recuperare la chiave di ripristino, andare su https://windows.microsoft.com/recoverykeyfaq da un altro PC o dispositivo mobile. Nel caso ne avessi bisogno, l'ID della chiave è XXXXXXX. Oppure puoi resettare il tuo PC.

  • Immettere la password per sbloccare questa unità [ ] Premere il tasto Inserisci per visualizzare la password durante la digitazione.

  • Inserisci la tua chiave di ripristino Carica la tua chiave di ripristino da un dispositivo USB.

Causa

Questo problema può verificarsi se la macchina virtuale non è in grado di individuare il file BEK (BitLocker Recovery Key) per decrittografare il disco crittografato.

Decrittografare il disco del sistema operativo crittografato

Consiglio

Se disponi di un backup recente della VM, puoi provare a ripristinare la VM dal backup per risolvere il problema di avvio.

Per risolvere questo problema, arrestare e deallocare la macchina virtuale, quindi avviarla. Questa operazione forza la macchina virtuale a recuperare il file BEK da Azure Key Vault e quindi a inserirlo nel disco crittografato.

Se questo metodo non risolve il problema, attenersi alla seguente procedura per ripristinare manualmente il file BEK:

  1. Eseguire un'istantanea del disco del sistema operativo della macchina virtuale interessata come backup. Per ulteriori informazioni, consultare Istantanea del disco.

  2.               Collegare il disco del sistema operativo a una macchina virtuale di ripristino. Quando colleghi un disco gestito, potresti ricevere un messaggio di errore "contiene impostazioni di crittografia e pertanto non può essere utilizzato come disco dati". In questa situazione, esegui il seguente script per riprovare ad allegare il disco:

    $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
    

    Non è possibile collegare un disco gestito a una macchina virtuale ripristinata da un'immagine BLOB.

  3. Dopo aver collegato il disco, effettuare una connessione desktop remoto alla macchina virtuale di ripristino.

  4. Installare il modulo Az PowerShell e Az.Account 1.9.4 nella macchina virtuale di ripristino.

  5. Aprire una sessione di Azure PowerShell con privilegi elevati (Esegui come amministratore). Eseguire i seguenti comandi per accedere alla sottoscrizione di Azure:

    Add-AzAccount -SubscriptionID [SubscriptionID]
    
  6. Eseguire il seguente script per controllare il nome del file BEK (nome segreto):

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

    Di seguito è riportato un esempio dell'output. In questo caso, supponiamo che il nome del file sia 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 vedi due volumi duplicati, il volume con il timestamp più recente è il file BEK corrente utilizzato dalla VM di ripristino.

    Se il valore Tipo di contenuto è Wrapped BEK, andare su Scenari Key Encryption Key (KEK).

    Ora che è disponibile il nome del file BEK per l'unità, è necessario creare il file secret-file-name.BEK per sbloccare l'unità.

  7. Scarica il file BEK sul disco di ripristino. L'esempio seguente salva il file BEK nella cartella C:\BEK. Assicurarsi che il percorso C:\BEK\ esista prima di eseguire gli script.

    $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. Per sbloccare il disco collegato utilizzando il file BEK, eseguire il comando seguente.

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

    In questo esempio, il disco del sistema operativo collegato è l'unità F. Assicurarsi di utilizzare la lettera di unità corretta.

  9. Dopo che il disco è stato sbloccato correttamente usando la chiave BEK, scollegare il disco dalla macchina virtuale di ripristino e quindi ricreare la macchina virtuale usando questo nuovo disco del sistema operativo.

    Nota

    Lo scambio del disco del sistema operativo è disponibile per qualsiasi macchina virtuale crittografata con la versione ADE a singolo passaggio, ma non è supportato per il doppio passaggio.

  10. Se la nuova VM non riesce ancora ad avviarsi normalmente, prova uno dei seguenti passaggi dopo aver sbloccato l'unità:

    • Sospendere la protezione per disattivare temporaneamente BitLocker eseguendo quanto segue:
    manage-bde -protectors -disable F: -rc 0
    
    • Decrittografare completamente l'unità. A tale scopo, utilizzare il seguente comando:
    manage-bde -off F:
    

Scenario chiave di crittografia della chiave (BEK avvolto)

Per uno scenario Chiave di crittografia chiave, attenersi alla seguente procedura:

  1. Assicurarsi che l'account utente che ha eseguito l'accesso richieda l'autorizzazione "per rimuovere il wrapping" nei criteri di accesso a Key Vault in USER|Key permissions|Cryptographic Operations|Unwrap Key.

  2. Salva il seguente script in un file .PS1:

    Nota

    Gli assembly ADAL (file dll) utilizzati in questo script sono disponibili solo in Az.Account 1.9.4 e nelle versioni precedenti. Per installare il modulo Az.Account, vedere Installare il modulo 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. Impostare i parametri. Lo script elaborerà il segreto KEK per creare la chiave BEK e quindi la salverà in una cartella locale nella VM di ripristino. Se ricevi errori durante l'esecuzione dello script, consulta la sezione Risoluzione dei problemi relativi agli script.

  4. Quando lo script inizia, viene visualizzato l'output segiuente:

    Posizione della versione GAC


    False v4.0.30319 C:\Programmi\WindowsPowerShell\Modules\Az.Accounts... False v4.0.30319 C:\Programmi\WindowsPowerShell\Modules\Az.Accounts...

    Al termine dello script, viene visualizzato il seguente output:

    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. Per sbloccare il disco collegato utilizzando il file BEK, eseguire il seguente comando:

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

    In questo esempio, il disco del sistema operativo collegato è l'unità F. Assicurarsi di utilizzare la lettera di unità corretta.

  6. Dopo che il disco è stato sbloccato correttamente utilizzando la chiave BEK, scollegare il disco dalla VM di ripristino, quindi utilizzare la funzionalità Scambia disco del sistema operativo per sostituire il disco del sistema operativo della VM originale con questo disco riparato.

  7. Se la nuova VM non riesce ancora ad avviarsi normalmente, prova uno dei seguenti passaggi dopo aver sbloccato l'unità:

    • Sospendere la protezione per disattivare temporaneamente BitLocker eseguendo il seguente comando:
    manage-bde -protectors -disable F: -rc 0
    
    • Decrittografare completamente l'unità. A tale scopo, utilizzare il seguente comando:
    manage-bde -off F:
    

Risoluzione dei problemi di script

Errore: impossibile caricare il file o l'assembly

Questo errore si verifica perché i percorsi degli assembly ADAL sono errati. È possibile cercare la cartella Az.Accounts per trovare il percorso corretto.

Errore: Get-AzKeyVaultSecret o Get-AzKeyVaultSecret non è riconosciuto come nome di un cmdlet

Se si utilizza il modulo Az PowerShell precedente, è necessario modificare i due comandi in Get-AzureKeyVaultSecret e Get-AzureKeyVaultSecret.

Parametri dello script KEK

Parametri Esempio Procedure di controllo
$keyVaultName myKeyVault2707 Eseguire Get-AzVM -ResourceGroupName $rgName -Name $vmName -DisplayHint Expand e verificare Impostazioni e KeyEncryptionKeyURL nell'output. Ecco un esempio:
"KeyEncryptionKeyURL": https://myKeyVault2707.vault.azure.net/keys/mykey/000072b987145a3b79b0ed415f0000
$kekNome mykey Eseguire Get-AzVM -ResourceGroupName $rgName -Name $vmName -DisplayHint expand e verificare Impostazioni e KeyEncryptionKeyURL nell'output. Ecco un esempio:
"KeyEncryptionKeyURL": https://myKeyVault2707.vault.azure.net/keys/mykey/000072b987145a3b79b0ed415f0000
$secretName 7EB4F531-5FBA-4970-8E2D-C11FD6B0C69D Il nome del segreto della chiave della macchina virtuale.               
Per trovare il nome segreto corretto, verifica il passaggio 6 nella sezione Decrittografare il disco del sistema operativo crittografato.
$bekFilePath c:\bek\7EB4F531-5FBA-4970-8E2D-C11FD6B0C69D.BEK Un percorso locale in cui si desidera salvare il file BEK. Nell'esempio, è necessario creare la cartella "bek" prima di eseguire lo script o si verificherà un errore.
$adTenant contoso.onmicrosoft.com FQDN o GUID dell'ID Microsoft Entra che ospita l'insieme di credenziali delle chiavi

Installare il modulo Az PowerShell

Per installare il modulo Az PowerShell per la macchina virtuale di ripristino, attenersi alla seguente procedura:

  1. Apri una sessione di PowerShell come amministratore e imposta il protocollo di sicurezza delle API HTTP su TLS 1.2 per la sessione corrente. Il protocollo di sicurezza verrà ripristinato al valore predefinito dopo aver chiuso la sessione corrente.

    [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
    
  2. Scarica l'ultima versione del pacchetto Nuget:

     Install-PackageProvider -Name "Nuget" -Force
    
    
  3. Installa la versione più recente del pacchetto PowerShellGet, quindi riavvia PowerShell.

    Install-Module -Name PowerShellGet -Force
    
  4. Eseguire il comando seguente per installare la versione più recente del modulo Azure Az:

    Install-Module -Name Az -Scope AllUsers -Repository PSGallery -Force
    
  5. Installa il pacchetto Az.Account 1.9.4:

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

Contattaci per ricevere assistenza

In caso di domande o bisogno di assistenza, creare una richiesta di supporto tecnico oppure formula una domanda nel Supporto della community di Azure. È possibile anche inviare un feedback sul prodotto al feedback della community di Azure.