Partager via


Erreurs de démarrage BitLocker dans une machine virtuelle Azure

S’applique à : ✔️ Machine virtuelles Windows

Cet article décrit les erreurs BitLocker que vous pouvez rencontrer lorsque vous démarrez une machine virtuelle Windows dans Microsoft Azure.

Symptôme

Une machine virtuelle Windows ne démarre pas. Lorsque vous regardez les captures d’écran de la fenêtre Diagnostics de démarrage, vous voyez l’un des messages d’erreur suivants :

  • Connectez le pilote USB qui contient la clé BitLocker.

  • Votre compte est verrouillé. Entrez la clé de récupération pour poursuivre (disposition du clavier : américain) Le nombre maximal de tentatives de connexion a été atteint. Votre PC a été verrouillé pour des raisons de sécurité. Pour récupérer la clé de récupération, accédez à https://windows.microsoft.com/recoverykeyfaq à partir d’un autre PC ou appareil mobile. Si vous en avez besoin, voici l’ID de la clé : XXXXXXX. Vous pouvez aussi réinitialiser votre PC.

  • Entrez le mot de passe pour déverrouiller le lecteur [] Appuyez sur la touche Insertion pour afficher le mot de passe à mesure que vous le tapez.

  • Entrez votre clé de récupération. Chargez votre clé de récupération à partir d’un périphérique USB.

Cause

Ce problème peut se produire lorsque la machine virtuelle ne peut pas localiser le fichier BEK pour déchiffrer le disque chiffré.

Déchiffrer le disque de système d’exploitation chiffré

Conseil

Si vous disposez d’une sauvegarde récente de la machine virtuelle, vous pouvez essayer de restaurer la machine virtuelle à partir de la sauvegarde pour résoudre le problème de démarrage.

Pour résoudre ce problème, arrêtez et libérez la machine virtuelle, et puis démarrez-la. Cette opération force la machine virtuelle à récupérer le fichier BEK à partir d’Azure Key Vault, puis à la placer sur le disque chiffré.

Si cette méthode ne résout pas le problème, effectuez les étapes suivantes pour restaurer le fichier BEK manuellement :

  1. Prenez un instantané du disque du système d’exploitation de la machine virtuelle affectée en guise de sauvegarde. Pour plus d’informations, consultez Créer un instantané.

  2. Attachez le disque du système d’exploitation à une machine virtuelle de récupération. Lorsque vous attachez un disque managé, vous pouvez recevoir un message d’erreur du type « Contient des paramètres de chiffrement et ne peut donc pas être utilisé comme disque de données ». Dans ce cas, exécutez le script suivant pour réessayer d’attacher le disque :

    $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
    

    Vous ne pouvez pas attacher un disque managé à une machine virtuelle qui a été restaurée à partir d’une image d’objet blob.

  3. Une fois le disque attaché, effectuez une connexion bureau à distance à la machine virtuelle de récupération.

  4. Installez le module Az PowerShell et Az.Account 1.9.4 dans la machine virtuelle de récupération.

  5. Ouvrez une session Azure PowerShell avec élévation de privilèges (Exécuter en tant qu’administrateur). Pour vous connecter à l’abonnement Azure, exécutez les commandes suivantes :

    Add-AzAccount -SubscriptionID [SubscriptionID]
    
  6. Exécutez le script suivant pour vérifier le nom du fichier BEK (nom du secret) :

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

    Voici un exemple de sortie : Dans ce cas, nous supposons que le nom de fichier est 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
    

    Si vous voyez un volume en double, celui dont l’horodatage est le plus récent correspond au fichier BEK qui est actuellement utilisé par la machine virtuelle de récupération.

    Si le Content Type (Type de contenu) est Wrapped BEK (Clé BEK wrappée), accédez aux scénarios impliquant des clés KEK (clés de chiffrement principales).

    Maintenant que vous connaissez le nom du fichier BEK pour le lecteur, vous devez créer le fichier secret-file-name.BEK pour déverrouiller le lecteur.

  7. Téléchargez le fichier BEK sur le disque de récupération. L’exemple suivant enregistre le fichier BEK dans le dossier C:\BEK. Vérifiez que le chemin C:\BEK\ existe avant d’exécuter les 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. Pour déverrouiller le disque attaché à l’aide du fichier BEK, exécutez la commande suivante.

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

    Dans cet exemple, le disque du système d’exploitation attaché est le lecteur F. Vérifiez que vous utilisez la bonne lettre de lecteur.

  9. Une fois que le disque a été déverrouillé à l’aide de la clé BEK, détachez le disque de la machine virtuelle de récupération, puis recréez la machine virtuelle à l’aide de ce nouveau disque de système d’exploitation.

    Note

    L’échange du disque du système d’exploitation est disponible pour n’importe quelle machine virtuelle chiffrée avec une version ADE à passe unique, mais n’est pas prise en charge pour double passe.

  10. Si la nouvelle machine virtuelle ne peut toujours pas démarrer normalement, essayez l’une des étapes suivantes après avoir déverrouillé le lecteur :

    • Suspendez la protection pour désactiver temporairement BitLocker en exécutant la commande suivante :
    manage-bde -protectors -disable F: -rc 0
    
    • Déchiffrez entièrement le lecteur. Pour ce faire, exécutez la commande suivante :
    manage-bde -off F:
    

Scénario de clé de chiffrement de clé (BEK encapsulé)

Dans un scénario impliquant une clé de chiffrement principale, effectuez les étapes suivantes :

  1. Vérifiez que le compte d’utilisateur connecté nécessite l’autorisation « unwrapped » (non wrappée) dans les stratégies d’accès au coffre de clés sous Utilisateur|Autorisations de clé|Opérations de chiffrement|Ne pas inclure la clé.

  2. Enregistrez le script suivant dans un fichier .PS1 :

    Note

    Les assemblys ADAL (fichiers dll) utilisés dans ce script ne sont disponibles que dans Az.Account 1.9.4 et les versions antérieures. Pour installer le module Az.Account, consultez Le module Installer 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. Définissez les paramètres. Le script va traiter le secret KEK pour créer la clé BEK, puis l’enregistrer dans un dossier local de la machine virtuelle de récupération. Si vous recevez des erreurs lors de l’exécution du script, consultez la section Résolution des problèmes de script.

  4. La sortie suivante s’affiche au début de l’exécution du script :

    GAC Version Emplacement


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

    Une fois l’exécution du script terminée, vous voyez la sortie suivante :

    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. Pour déverrouiller le disque attaché à l’aide du fichier BEK, exécutez la commande suivante :

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

    Dans cet exemple, le disque du système d’exploitation attaché est le lecteur F. Vérifiez que vous utilisez la bonne lettre de lecteur.

  6. Une fois le disque déverrouillé à l’aide de la clé BEK, détachez le disque de la machine virtuelle de récupération, puis utilisez la fonctionnalité Permuter le disque du système d’exploitation pour remplacer le disque du système d’exploitation de la machine virtuelle d’origine par ce disque réparé.

  7. Si la nouvelle machine virtuelle ne peut toujours pas démarrer normalement, essayez l’une des étapes suivantes après avoir déverrouillé le lecteur :

    • Suspendez la protection pour désactiver temporairement BitLocker en exécutant la commande suivante :
    manage-bde -protectors -disable F: -rc 0
    
    • Déchiffrez entièrement le lecteur. Pour ce faire, exécutez la commande suivante :
    manage-bde -off F:
    

Résolution des problèmes de script

Erreur : Impossible de charger le fichier ou l’assembly

Cette erreur se produit parce que les chemins d’accès des assemblys ADAL sont incorrects. Vous pouvez rechercher le dossier Az.Accounts pour trouver le chemin d’accès correct.

Erreur : Get-AzKeyVaultSecret ou Get-AzKeyVaultSecret n’est pas reconnu comme nom d’une applet de commande

Si vous utilisez l’ancien module Az PowerShell, vous devez modifier les deux commandes en Get-AzureKeyVaultSecret et Get-AzureKeyVaultSecret.

Paramètres de script KEK

Paramètres Exemple Comment vérifier
$keyVaultName myKeyVault2707 Exécutez et vérifiez Get-AzVM -ResourceGroupName $rgName -Name $vmName -DisplayHint ExpandParamètres et KeyEncryptionKeyURL dans la sortie. Voici un exemple :
« KeyEncryptionKeyURL » :https://myKeyVault2707.vault.azure.net/keys/mykey/000072b987145a3b79b0ed415f0000
$kekName mykey Exécutez et vérifiez Get-AzVM -ResourceGroupName $rgName -Name $vmName -DisplayHint expand Paramètres et KeyEncryptionKeyURL dans la sortie. Voici un exemple :
« KeyEncryptionKeyURL » :https://myKeyVault2707.vault.azure.net/keys/mykey/000072b987145a3b79b0ed415f0000
$secretName 7EB4F531-5FBA-4970-8E2D-C11FD6B0C69D Nom du secret de la clé de machine virtuelle.
Pour trouver le nom de secret correct, vérifiez l’étape 6 dans la section Déchiffrer le disque du système d’exploitation chiffré.
$bekFilePath c:\bek\7EB4F531-5FBA-4970-8E2D-C11FD6B0C69D.BEK Chemin d’accès local dans lequel vous souhaitez enregistrer le fichier BEK. Dans l’exemple, vous devez créer le dossier « bek » avant d’exécuter le script, ou il se produit une erreur.
$adTenant contoso.onmicrosoft.com Nom de domaine complet ou GUID de votre ID Microsoft Entra qui héberge le coffre de clés

Installer le module Az PowerShell

Pour installer le module Az PowerShell pour la machine virtuelle de récupération, procédez comme suit :

  1. Ouvrez une session PowerShell en tant qu’administrateur et définissez le protocole de sécurité DES API HTTP sur TLS 1.2 pour la session active. Le protocole de sécurité est rétabli à la valeur par défaut après avoir fermé la session active.

    [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
    
  2. Téléchargez la dernière version du package Nuget :

     Install-PackageProvider -Name "Nuget" -Force
    
    
  3. Installez la dernière version du package PowerShellGet, puis redémarrez PowerShell.

    Install-Module -Name PowerShellGet -Force
    
  4. Exécutez la commande suivante pour installer la dernière version du module Azure Az :

    Install-Module -Name Az -Scope AllUsers -Repository PSGallery -Force
    
  5. Installez le package Az.Account 1.9.4 :

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

Contactez-nous pour obtenir de l’aide

Pour toute demande ou assistance, créez une demande de support ou posez une question au support de la communauté Azure. Vous pouvez également soumettre des commentaires sur les produits à la communauté de commentaires Azure.