解锁加密磁盘进行脱机修复

本文介绍如何在单独的虚拟机上解锁加密的 OS 磁盘, (称为修复 VM) ,以便在该磁盘上启用脱机修正和故障排除。

症状

如果要脱机修复 Windows VM 的 OS 磁盘,则磁盘在附加到修复 VM 时可能显示为锁定,如下所示。 在这种情况下,在磁盘上启用了 Azure 磁盘加密 (ADE) 。 在磁盘解锁之前,无法从修复 VM 对该磁盘执行任何缓解措施。

“我的 P C”的屏幕截图,其中显示了带锁图标的卷 G。

背景

某些故障排除方案要求对 Azure 中的虚拟磁盘执行脱机修复。 例如,如果 Windows VM 不可访问、显示磁盘错误或无法启动,可以通过将 OS 磁盘附加到单独的修复 VM, (也称为 恢复 VM救援 VM) ,在 OS 磁盘上运行故障排除步骤。

但是,如果磁盘是使用 ADE 加密的,则磁盘在附加到修复 VM 时将保持锁定和不可访问状态,直到解锁磁盘。 若要解锁磁盘,必须使用最初用于加密磁盘的 BitLocker 加密密钥 (BEK) 。 此 BEK (,还可以将加密或“包装”BEK) 的密钥加密密钥 [KEK] 存储在组织管理的 Azure 密钥保管库中。

目标

本文中的过程介绍了可用于将加密的 OS 磁盘附加到修复 VM,然后解锁该磁盘的方法。 解锁磁盘后,可以修复它。 最后一步,可以将原始 VM 上的 OS 磁盘替换为此新修复的版本。

准备

在将失败的 OS 磁盘附加到修复 VM 之前,请执行以下步骤:

  1. 确认磁盘上已启用 ADE
  2. 确定 OS 磁盘是使用 ADE 版本 1 (双传递加密) 还是使用 ADE 版本 2 (单通道加密)
  3. 确定 OS 磁盘是托管磁盘还是非托管磁盘
  4. 选择将磁盘附加到修复 VM 并解锁磁盘的方法

确认磁盘上已启用 ADE

可以在 Azure 门户、PowerShell 或 Azure 命令行界面中执行此步骤, (Azure CLI) 。

Azure 门户

查看Azure 门户中发生故障的 VM 的“概述”边栏选项卡。 在 “磁盘”下, Azure 磁盘加密 将显示为 “已启用”“未启用”,如以下屏幕截图所示。

Azure 门户中 V M 的“概述”边栏选项卡的屏幕截图,其中显示了磁盘上启用了 D E。

PowerShell

可以使用 Get-AzVmDiskEncryptionStatus cmdlet 来确定是否使用 ADE 加密 VM 的 OS 和/或数据卷。 以下示例输出指示在 OS 卷上启用了 ADE 加密:

PS /home/me> Get-AzVmDiskEncryptionStatus -ResourceGroupName "MyRg01" -VMName "MyVm01" 
OsVolumeEncrypted          : Encrypted
DataVolumesEncrypted       : NoDiskFound
OsVolumeEncryptionSettings : Microsoft.Azure.Management.Compute.Models.DiskEncryptionSettings
ProgressMessage            : Extension status not available on the VM

有关 cmdlet 的详细信息 Get-AzureRmDiskEncryptionStatus ,请参阅 Get-AzVMDiskEncryptionStatus (Az.Compute)

Azure CLI

可以将 Azure CLI 中的 命令与 az vm encryption show 追加的查询 disks[].encryptionSettings[].enabled 一起使用,以确定是否在 VM 的磁盘上启用了 ADE。 以下输出指示已启用 ADE 加密。

az vm encryption show --name MyVM --resource-group MyResourceGroup --query "disks[].encryptionSettings[].enabled"
[
  true
]

有关 命令的详细信息 az vm encryption show ,请参阅 az vm encryption show

注意

未加密磁盘的脱机修复

如果确定磁盘上未启用 ADE,请参阅以下文章,获取有关如何将磁盘附加到修复 VM 的说明:通过 Azure 门户,将 OS 磁盘附加到恢复 VM,对 Windows VM 进行故障排除Azure 门户

确定 OS 磁盘是使用 ADE 版本 1 (双传递加密) 还是使用 ADE 版本 2 (单通道加密)

可以通过打开 VM 的属性,然后单击“扩展”打开“扩展”边栏选项卡,了解Azure 门户中的 ADE 版本号。 在“ 扩展” 边栏选项卡上,查看分配给 AzureDiskEncryption 的版本号。 如果版本号为 1,则磁盘使用双传递加密。 如果版本号为 2 或更高版本,则磁盘使用单次加密。

扩展边栏选项卡的屏幕截图,其中显示了 Azure 磁盘加密版本 2。

如果确定磁盘使用 ADE 版本 1 (双传递加密) ,则可以转到 解决方法 #3:手动方法解锁修复 VM 上的加密磁盘

确定 OS 磁盘是托管磁盘还是非托管磁盘

如果不知道 OS 磁盘是托管磁盘还是非托管磁盘,请参阅 确定 OS 磁盘是托管磁盘还是非托管磁盘

如果知道 OS 磁盘是非托管磁盘,请转到 解决方法 #3:手动方法解锁修复 VM 上的加密磁盘

选择将磁盘附加到修复 VM 并解锁磁盘的方法

应选择以下三种方法之一,将磁盘附加到修复 VM 并解锁磁盘:

解决方法 #1:自动方法解锁修复 VM 上的加密磁盘

此方法依赖于 az vm repair 命令自动创建修复 VM、附加失败的 OS 磁盘,以及解锁磁盘(如果已加密)。 它仅适用于单传递加密的托管磁盘,并且需要使用公共 IP 地址来修复 VM。 无论 BitLocker 加密密钥 (BEK) 是使用密钥加密密钥 (KEK) 解包还是包装,此方法都会解锁加密磁盘。

若要使用此自动化方法修复 VM,请参阅 使用 Azure 虚拟机修复命令修复 Windows VM

注意

如果自动故障排除失败,请继续 执行解决方法 #2:半自动方法以解锁修复 VM 上的加密磁盘

解决方法 #2:用于解锁修复 VM 上加密磁盘的半自动化方法

半自动解析可解锁单传递加密的托管磁盘,而无需修复 VM 的公共 IP 地址。

通过使用此过程,可以手动创建一个 VM,该 VM 具有源的 OS 磁盘 (连接失败) VM。 在创建 VM 时附加加密磁盘时,VM 会自动从 Azure 密钥保管库提取 BEK 并将其存储在 BEK 卷中。 然后,使用一系列简短的步骤访问 BEK 并解锁加密磁盘。 在此过程中,BEK 将在必要时自动解包。

  1. 在 Azure 门户 中,获取源上的加密 OS 磁盘快照, (失败) VM。

  2. 从该快照Create磁盘。

    快照的“概述”边栏选项卡的屏幕截图,其中突出显示了“创建磁盘”选项。

    对于新磁盘,请选择分配给源 VM 的相同位置和可用性区域。 请注意,在下一步创建修复 VM 时,还需要复制这些相同的设置。

  3. Create一个基于 Windows Server 2016 Datacenter 的 VM,用作修复 VM。请确保将 VM 分配到用于步骤 2 中创建的新磁盘的同一区域和可用性区域。

  4. 虚拟机向导Create的“磁盘”页上,将刚从 快照创建的新磁盘作为数据磁盘附加。

    “创建虚拟机”向导的“磁盘”页的屏幕截图,其中突出显示了磁盘以及附加现有磁盘的选项。

    重要

    请确保在 VM 创建期间添加磁盘。 只有在 VM 创建期间才会检测到加密设置。 这样可以自动添加包含 BEK 的卷。

  5. 创建修复 VM 后,登录到 VM,并打开“磁盘管理” (Diskmgmt.msc) 。 在“磁盘管理”中,找到 BEK 卷。 默认情况下,不会为此卷分配驱动器号。

    突出显示 bek 卷的磁盘管理的屏幕截图

  6. 若要将驱动器号分配给 BEK 卷,请右键单击 BEK 卷,然后选择“ 更改驱动器号和路径”。

    bek 卷快捷菜单的屏幕截图,其中突出显示了“更改驱动器号和路径”选项

  7. 选择“ 添加 ”,将驱动器号分配给 BEK 卷。 在此过程中,默认字母最常为 H。选择“确定”。

    “添加驱动器号或路径”对话框,其中突出显示了用于分配以下驱动器号的选项。

  8. 在“文件资源管理器”中,选择左窗格中的“这台电脑”。 现在,你将看到列出的 BEK 卷。 此外,请注意由锁图标标记的卷。 这是创建 VM 时附加的加密磁盘。 (在以下示例中,已为加密磁盘分配驱动器号 G.)

    Windows 中此 P C 的屏幕截图,其中包含锁定的卷和 bek 卷

  9. 若要解锁加密磁盘,必须在 BEK 卷中具有 .bek 文件名。 但是,默认情况下,BEK 卷中的文件是隐藏的。 在命令提示符下,输入以下命令以显示隐藏的文件:

    dir <DRIVE LETTER ASSIGNED TO BEK VOLUME>: /a:h /b /s
    

    例如,如果分配给 BEK 卷的驱动器号为 H,则输入以下命令:

    dir H: /a:h /b /s
    

    应会看到如下所示的输出:

    H:\66ABF036-E331-4B67-A667-D1A8B47B4DAB.BEK
    H:\System Volume Information
    

    第一个条目是 BEK 文件路径名。 下一步将使用完整路径名。

  10. 在命令提示符下,输入以下命令:

    manage-bde -unlock <ENCRYPTED DRIVE LETTER>: -RecoveryKey <.BEK FILE PATH>
    

    例如,如果 G 是加密驱动器,并且 BEK 文件与上一个示例中列出的文件相同,则可以输入以下内容:

    manage-bde -unlock G: -RecoveryKey H:\66ABF036-E331-4B67-A667-D1A8B47B4DAB.BEK
    

    你将看到一条消息,指示 BEK 文件已成功解锁指定的卷。 在文件资源管理器中,可以看到驱动器不再锁定。

    此 P C 的屏幕截图,其中驱动器标有打开的挂锁图标。

  11. 访问卷后,可以根据需要完成故障排除和缓解措施,例如,通过读取日志或运行脚本。

  12. 修复磁盘后, 使用以下过程 将源 VM 的 OS 磁盘替换为新修复的磁盘。

解决方法 #3:手动方法解锁修复 VM 上的加密磁盘

如果需要解锁双通道加密磁盘 (ADE 版本 1) 或非托管磁盘,或者其他方法失败,则可以按照此过程手动解锁磁盘。

Create修复 VM 并附加源 VM 的 OS 磁盘

  1. 如果源 VM 的加密 OS 磁盘是托管磁盘,请按照方法 2 中的步骤 1-4 将锁定磁盘的副本附加到修复 VM。

    例如,如果创建附加加密磁盘的新修复 VM 的过程挂起或失败 (,则会返回一条消息,指出它“包含加密设置,因此不能用作数据磁盘”) ,可以先创建 VM,而不附加加密磁盘。 创建修复 VM 后,通过Azure 门户将加密磁盘附加到 VM。

  2. 如果源 VM 的加密 OS 磁盘是非托管磁盘,请参阅 将非托管磁盘附加到 VM 以便脱机修复

在修复 VM 中安装 Az PowerShell 模块

脱机解锁加密磁盘的手动解析方法依赖于 PowerShell 中的 Az 模块。 因此,必须在修复 VM 上安装此模块。

  1. 通过 RDP 连接到修复 VM。

  2. 在修复 VM 上的 服务器管理器,选择“本地服务器”,然后关闭“管理员 IE 增强的安全配置”。

    Internet Explorer 增强安全配置的对话框的屏幕截图,其中关闭了管理员的设置。

    服务器管理器的屏幕截图,其中显示了已关闭 Internet Explorer 增强安全配置。

  3. 在修复 VM 上,打开提升的 PowerShell 窗口。

  4. 通过输入以下命令,将当前会话的 HTTP API 安全协议设置为 TLS 1.2。

    [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
    

    注意

    关闭当前会话后,安全协议将还原为默认值。

  5. 下载最新版本的 Nuget 包:

    Install-PackageProvider -Name "Nuget" -Force
    
  6. 当提示返回时,安装最新版本的 PowerShellGet 包。

    Install-Module -Name PowerShellGet -Force
    
  7. 当提示返回时,关闭 PowerShell 窗口。 然后,使用提升的权限打开新的 PowerShell 窗口,以启动新的 PowerShell 会话。

  8. 在 PowerShell 提示符下,安装最新版本的 Azure Az 模块:

    Install-Module -Name Az -Scope AllUsers -Repository PSGallery -Force
    
  9. 当提示返回时,安装 Az.Account 1.9.4 包:

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

检索 BEK 文件名

  1. 在Azure 门户中,导航到用于加密源 VM 的密钥保管库。 如果不知道密钥保管库的名称,请在 Azure Cloud Shell 中的提示符处输入以下命令,并在输出中查找“sourceVault”旁边的值:

    az vm encryption show --name MyVM --resource-group MyResourceGroup
    
  2. 在左侧菜单中,选择“ 访问策略”。

  3. 在密钥保管库的访问策略中,确保用于登录到 Azure 订阅的用户帐户被授予以下权限:密钥管理操作:获取、列表、更新Create加密操作:解包密钥机密权限:获取、列出、设置

  4. 返回到修复 VM 和提升的 PowerShell 窗口。

  5. 通过输入以下命令,将当前会话的 HTTP API 安全协议设置为 TLS 1.2。

    [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
    
  6. 输入以下命令以开始登录到 Azure 订阅的过程,并将“[SubscriptionID]”替换为 Azure 订阅 ID:

    Add-AzAccount -SubscriptionID <SubscriptionID>
    
  7. 按照提示完成登录到 Azure 订阅的过程。

  8. 在修复 VM 中,打开提升的Windows PowerShell ISE 窗口, (顶部) 窗格展开脚本。

  9. 在提升的 PowerShell ISE 窗口中,将以下脚本粘贴到空脚本窗格中。 将“myVM”替换为源 (失败) VM,将“myKeyVault”替换为密钥保管库的名称。

        if ((Get-AzContext) -ne $Null)
    {
    
    $vmName = "MyVM"
    $vault = "myKeyVault"
    
    # Get the Secrets for all VM Drives from Azure Key Vault
    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 ="Volume"; Expression = {$_.Tags.VolumeLetter}}, `
            @{Label ="DiskEncryptionKeyFileName"; Expression = {$_.Tags.DiskEncryptionKeyFileName}}, `
            @{Label ="URL"; Expression = {$_.Id}}
    }
    else 
    {
        Write-Output "Please log in first with Add-AzAccount"
    }
    
  10. 选择“ 运行脚本” 以运行脚本。

  11. 在输出中,查找 DiskEncryptionKeyFileName 下面的值以获取 BEK 文件的名称。

    在以下示例输出中,BEK 文件名 (机密名称 + “。BEK“文件扩展名) 为 AB4FE364-4E51-4034-8E09-0087C3D51C18。BEK。 记录此值,因为它将在下一步中使用。 (如果看到两个重复的卷,则具有较新时间戳的卷是修复 VM 使用的当前 BEK 文件。)

    表中 PowerShell 输出的屏幕截图,其中显示了包装 bek 的磁盘加密密钥文件名。

  12. 如果输出中的 “内容类型” 值为 “包装 BEK”,如上例所示,请转到 “下载并解包 BEK”。 如果输出中的 “内容类型” 值只是 BEK,如以下示例所示,请转到下一部分 ,将 BEK 下载到修复 VM

    表中 PowerShell 输出的屏幕截图,其中显示了 bek 内容类型的磁盘加密密钥文件名。

将 BEK 下载到修复 VM

  1. 在修复 VM 上,创建名为“BEK”的文件夹, (C 卷根目录中没有引号) 。

  2. 将以下示例脚本复制并粘贴到空的 PowerShell ISE 脚本窗格中。

    注意

    将“$vault”和“$bek”的值替换为环境的值。 对于$bek值,请使用在上一个过程中获取的机密名称。 (机密名称是没有“.bek”文件扩展名的 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)
    
  3. 在 PowerShell ISE 窗口中,选择“ 运行脚本”。 如果脚本成功运行,则不会有输出或完成消息。 但是,将在 C:\BEK 文件夹中创建新文件。 (C:\BEK 文件夹必须已存在。)

  4. 跳到 验证脚本是否已成功完成

下载并解包 BEK

  1. 在修复 VM 上,创建一个名为“BEK”的文件夹, (C 卷根目录中没有引号) 。

  2. 在记事本中记录以下值。 脚本运行时,系统会提示你提供它们。

    • secretUrl。 这是密钥保管库中存储的机密的 URL。 有效的机密 URL 使用以下格式: <<https://[key> 保管库名称].vault.azure.net/secrets/[BEK 名称]/[版本 ID]>

      若要在Azure 门户中找到此值,请导航到密钥保管库中的“机密”边栏选项卡。 选择在上一步“ 检索 BEK 文件名”中确定的 BEK 名称。 选择当前版本标识符,然后读取 “属性”下面的“机密标识符 URL”。 (可以将此 URL 复制到剪贴板。)

      Azure 门户中机密属性的屏幕截图,其中机密标识符为 U R L。

    • keyVaultResourceGroup。 密钥保管库的资源组。

    • kekUrl。 这是用于保护 BEK 的密钥的 URL。 有效的 kek URL 使用以下格式: <<https://[key> 保管库名称].vault.azure.net/keys/[密钥名称]/[版本 ID]>

      可以在Azure 门户中获取此值,方法是导航到密钥保管库中的“密钥”边栏选项卡,选择用作 KEK 的密钥名称,选择当前版本标识符,然后读取“属性”下面的“密钥标识符 URL”。 (可以将此 URL 复制到剪贴板。)

    • secretFilePath。 这是存储 BEK 文件的位置的完整路径名。 例如,如果 BEK 文件名 为 AB4FE364-4E51-4034-8E06-0087C3D51C18。BEK,可以输入 C:\BEK\AB4FE364-4E51-4034-8E06-0087C3D51C18。BEK。 (C:\BEK 文件夹必须已存在。)

  3. 导航到以下页面,下载用于生成 BEK 文件以解锁加密磁盘的脚本。

  4. 在页面上,选择“ 原始”。

  5. 将脚本的内容复制并粘贴到修复 VM 中提升的 PowerShell ISE 窗口中的空脚本窗格中。

  6. 选择 “运行脚本”。

  7. 出现提示时,请提供在运行脚本之前记录的值。 如果系统提示“不受信任的存储库”消息,请选择“ 是”至“全部”。 如果脚本成功运行,将在 C:\BEK 文件夹中创建一个新文件。 (此文件夹必须已存在。)

验证脚本是否成功运行

  1. 导航到本地计算机上的 C:\BEK 文件夹,并找到新的输出文件。

  2. 在记事本中打开文件。 如果脚本运行正确,如果向右滚动,则会在文件的上行找到 短语 BitLocker 扩展密钥保护程序

    在记事本中打开的文本文件的屏幕截图,其中突出显示了“Bitlocker 扩展密钥保护程序”一词。

解锁附加的磁盘

现在可以解锁加密磁盘了。

  1. 在修复 VM 上,在“磁盘管理”中,如果附加的加密磁盘尚未联机,则将其联机。 请注意 BitLocker 加密卷的驱动器号。

  2. 在命令提示符下,输入以下命令。

    注意

    在此命令中,将“<ENCRYPTED DRIVE LETTER>”替换为加密卷的字母和“<。BEK 文件路径>“,其中包含 C:\BEK 文件夹中新创建的 BEK 文件的完整路径。

    manage-bde -unlock <ENCRYPTED DRIVE LETTER>: -RecoveryKey <.BEK FILE PATH>
    

    例如,如果加密驱动器为 F 且 BEK 文件名为“DiskEncryptionKeyFileName.BEK”,则可以运行以下命令:

    manage-bde -unlock F: -RecoveryKey C:\BEK\DiskEncryptionKeyFileName.BEK
    

    如果加密驱动器为 F,并且 BEK 文件名为“EF7B2F5A-50C6-4637-9F13-7F599C12F85C。BEK,“你将运行以下命令:

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

    你将看到类似于以下示例的输出:

    The file "C:\BEK\0D44E996-4BF3-4EB0-B990-C43C250614A4.BEK" successfully unlocked volume F:.
    
  3. 现在,你可以访问卷,可以根据需要执行故障排除和缓解措施,例如,通过读取日志或运行脚本。

    重要

    解锁过程允许你访问磁盘, 但它不会解密磁盘。 解除锁定后,磁盘将保持加密状态。 如果需要解密磁盘,请使用命令 manage-bde <volume> -off 开始解密过程,并使用 manage-bde <drive> -status 检查解密进度。

  4. 修复完成后,如果磁盘是托管的,则可以继续将 源 VM 的 OS 磁盘 (托管磁盘) 。 如果磁盘是非托管的,则可以使用此处所述的基于 CLI 的步骤: 替换源 VM 上的 OS 磁盘

将源 VM 的 OS 磁盘 (托管磁盘)

  1. 修复磁盘后,打开Azure 门户中修复 VM 的“磁盘”边栏选项卡。 分离源 VM OS 磁盘的副本。 为此,请在 “数据磁盘”下找到关联磁盘名称的行,选择该行右侧的“X”,然后选择“ 保存”。

    在 Azure 门户 的“磁盘”边栏选项卡上选择的数据磁盘的屏幕截图,旁边突出显示了 X 符号。

  2. 在Azure 门户中,导航到源 (损坏) VM,然后打开“磁盘”边栏选项卡。 然后,选择“ 交换 OS 磁盘 ”,将现有 OS 磁盘替换为已修复的 OS 磁盘。

    “磁盘”边栏选项卡的屏幕截图,其中突出显示了“交换 O S 磁盘”选项。

  3. 选择修复的新磁盘,然后输入 VM 的名称以验证更改。 如果在列表中看不到磁盘,请在从故障排除 VM 分离磁盘后等待 10 到 15 分钟。

  4. 选择“确定”

后续步骤

如果在连接到 VM 时遇到问题,请参阅 排查与 Azure VM 的远程桌面连接问题。 有关访问 VM 上运行的应用程序的问题,请参阅 排查 Windows VM 上的应用程序连接问题

联系我们寻求帮助

如果你有任何疑问或需要帮助,请创建支持请求联系 Azure 社区支持。 还可以向 Azure 反馈社区提交产品反馈。