解锁加密磁盘进行脱机修复
适用于:✔️ Windows VM
本文介绍如何在单独的虚拟机(称为修复 VM)上解锁加密的 OS 磁盘,以便在该磁盘上实现脱机修正和故障排除。
现象
如果正在脱机修复 Windows VM 的 OS 磁盘,当磁盘附加到修复 VM 时,磁盘可能会锁定,如下所示。 在这种情况下,Azure 磁盘加密(ADE)在磁盘上启用。 在磁盘解锁之前,无法从修复 VM 在该磁盘上执行任何缓解措施。
背景
某些故障排除方案要求你在 Azure 中对虚拟磁盘执行脱机修复。 例如,如果 Windows VM 不可访问、显示磁盘错误或无法启动,可以通过将其附加到单独的修复 VM(也称为 恢复 VM 或 救援 VM)在 OS 磁盘上运行故障排除步骤。
但是,如果使用 ADE 对磁盘进行加密,则在磁盘附加到修复 VM 时磁盘将保持锁定且不可访问,直到解锁磁盘。 若要解锁磁盘,必须使用最初用于加密磁盘的同一 BitLocker 加密密钥(BEK)。 此 BEK(以及(可选)用于加密或“包装”BEK 的密钥加密密钥 [KEK] 将存储在组织管理的 Azure 密钥保管库中。
目标
本文中的过程介绍了可用于将加密 OS 磁盘附加到修复 VM,然后解锁该磁盘的方法。 磁盘解锁后,可以修复它。 最后一步,可以将原始 VM 上的 OS 磁盘替换为此新修复的版本。
准备
在将失败的 OS 磁盘附加到修复 VM 之前,请执行以下步骤:
- 确认磁盘上已启用 ADE。
- 确定 OS 磁盘使用 ADE 版本 1(双传递加密)还是 ADE 版本 2(单传递加密)。
- 确定 OS 磁盘是托管还是非托管磁盘。
- 选择将磁盘附加到修复 VM 并解锁磁盘的方法。
确认磁盘上已启用 ADE
可以在 Azure 门户、PowerShell 或 Azure 命令行接口(Azure CLI)中执行此步骤。
Azure 门户
在Azure 门户中查看失败的 VM 的“概述”边栏选项卡。 在“磁盘”下,Azure 磁盘加密将显示为“已启用”或“未启用”,如以下屏幕截图所示。
PowerShell
可以使用 Get-AzVmDiskEncryptionStatus
cmdlet 来确定 VM 的 OS 和/或数据卷是使用 ADE 加密的。 以下示例输出指示 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
可以将 az vm encryption show
Azure CLI 中的命令与追加的查询 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 进行故障排除
确定 OS 磁盘使用 ADE 版本 1(双传递加密)还是 ADE 版本 2(单传递加密)
可以通过打开 VM 的属性,然后单击“扩展”打开“扩展”边栏选项卡,了解Azure 门户中的 ADE 版本号。 在“ 扩展 ”边栏选项卡上,查看分配给 AzureDiskEncryption 的版本号。 如果版本号为 1,则磁盘使用双通道加密。 如果版本号为 2 或更高版本,则磁盘使用单传递加密。
如果确定磁盘使用 ADE 版本 1(双重传递加密),可以转到 Resolution #3:手动方法解锁修复 VM 上的加密磁盘。
确定 OS 磁盘是托管磁盘还是非托管磁盘
如果不知道 OS 磁盘是托管磁盘还是非托管磁盘,请参阅 确定 OS 磁盘是托管还是非托管磁盘。
如果知道 OS 磁盘是非托管磁盘,请转到 Resolution #3:手动方法解锁修复 VM 上的加密磁盘。
选择将磁盘附加到修复 VM 并解锁磁盘的方法
应选择三种方法之一,将磁盘附加到修复 VM 并解锁磁盘:
- 如果已确定磁盘是使用 ADE 版本 2 或更高版本(单传递加密)进行管理和加密的,并且基础结构和公司策略允许将公共 IP 地址分配给修复 VM,请使用 Resolution #1:自动方法解锁修复 VM 上的加密磁盘。
- 如果磁盘是使用 ADE 版本 2 或更高版本(单一传递加密)进行管理和加密的,但基础结构或公司策略会阻止向修复 VM 分配公共 IP 地址,请使用 Resolution #2:半自动化方法解锁修复 VM 上的加密磁盘。 (选择此方法的另一个原因是缺少在 Azure 中创建资源组的权限。
- 如果上述任一方法失败,或者磁盘是非托管的,或者通过使用 ADE 版本 1(双传递加密)进行加密,请使用 Resolution #3:手动方法解锁修复 VM 上的加密磁盘。
解决方法 #1:在修复 VM 上解锁加密磁盘的自动化方法
此方法依赖于 az vm repair 命令自动创建修复 VM、附加失败的 OS 磁盘,并在磁盘加密时解锁磁盘。 它仅适用于单传递加密托管磁盘,并且需要对修复 VM 使用公共 IP 地址。 无论 BitLocker 加密密钥(BEK)是使用密钥加密密钥(KEK)解包还是包装,此方法都会解锁加密磁盘。
若要使用此自动化方法修复 VM,请参阅 使用 Azure 虚拟机修复命令修复 Windows VM。
注意
如果自动故障排除失败,请 继续执行 Resolution #2:半自动方法,以解锁修复 VM 上的加密磁盘。
解决方法 #2:在修复 VM 上解锁加密磁盘的半自动化方法
半自动解析可解锁单传递加密托管磁盘,而无需修复 VM 的公共 IP 地址。
使用此过程手动创建一个 VM,该 VM 附加了源(失败)VM 的 OS 磁盘。 在创建 VM 时附加加密磁盘时,VM 会自动从 Azure 密钥保管库提取 BEK 并将其存储在 BEK 卷中。 然后,使用一系列简短的步骤访问 BEK 并解锁加密磁盘。 在此过程中,BEK 会在必要时自动解包。
在Azure 门户中,拍摄源 VM 上加密 OS 磁盘的快照(失败)。
从该快照创建磁盘。
对于新磁盘,请选择分配给源 VM 的相同位置和可用性区域。 请注意,在下一步中创建修复 VM 时,还需要复制这些相同的设置。
创建基于 Windows Server 2016 Datacenter 的 VM,用作修复 VM。请确保将 VM 分配到用于步骤 2 中创建的新磁盘的同一区域和可用性区域。
在“创建虚拟机”向导的“磁盘”页上,附加为刚刚从快照创建的新磁盘的数据磁盘。
重要
请确保在创建 VM 期间添加磁盘。 仅在 VM 创建期间检测到加密设置。 这允许自动添加包含 BEK 的卷。
创建修复 VM 后,登录到 VM,并打开磁盘管理(Diskmgmt.msc)。 在磁盘管理中,找到 BEK 卷。 默认情况下,不会为此卷分配驱动器号。
若要将驱动器号分配给 BEK 卷,请右键单击 BEK 卷,然后选择“ 更改驱动器号和路径”。
选择“ 添加” 以将驱动器号分配给 BEK 卷。 在此过程中,默认字母最常为 H。选择“ 确定”。
在文件资源管理器中,选择左窗格中的“此电脑”。 现在会看到列出的 BEK 卷。 另请注意锁图标标记的卷。 这是创建 VM 时附加的加密磁盘。 (在以下示例中,已加密磁盘分配驱动器号 G.)
若要解锁加密磁盘,必须在 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 文件路径名。 下一步将使用完整路径名。
在命令提示符处输入以下命令:
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 文件已成功解锁指定的卷。 在文件资源管理器中,可以看到驱动器不再锁定。
访问卷后,可以根据需要完成故障排除和缓解措施,例如,通过读取日志或运行脚本。
修复磁盘后, 使用以下过程 将源 VM 的 OS 磁盘替换为新修复的磁盘。
解决方法 #3:在修复 VM 上解锁加密磁盘的手动方法
如果必须解锁双传递加密磁盘(ADE 版本 1)或非托管磁盘,或者其他方法失败,则可以按照此过程手动解锁磁盘。
创建修复 VM 并附加源 VM 的 OS 磁盘
如果源 VM 的加密 OS 磁盘是托管磁盘,请按照方法 2 中的步骤 1-4 将锁定磁盘的副本附加到修复 VM。
如果创建具有附加加密磁盘的新修复 VM 挂起或失败(例如,它会返回一条消息,指出它“包含加密设置,因此不能用作数据磁盘”),可以首先创建 VM 而不附加加密磁盘。 创建修复 VM 后,通过Azure 门户将加密磁盘附加到 VM。
如果源 VM 的加密 OS 磁盘是非托管磁盘,请参阅 将非托管磁盘附加到 VM 进行脱机修复。
在修复 VM 中安装 Az PowerShell 模块
脱机解锁加密磁盘的手动解析方法依赖于 PowerShell 中的 Az 模块。 因此,必须在修复 VM 上安装此模块。
通过 RDP 连接到修复 VM。
在修复 VM 上,在服务器管理器中选择“本地服务器”,然后关闭管理员的 IE 增强的安全配置。
在修复 VM 上,打开提升的 PowerShell 窗口。
输入以下命令,将 HTTP API 安全协议设置为当前会话的 TLS 1.2。
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
注意
关闭当前会话后,安全协议将还原为默认值。
下载最新版本的 Nuget 包:
Install-PackageProvider -Name "Nuget" -Force
当提示返回时,请安装最新版本的 PowerShellGet 包。
Install-Module -Name PowerShellGet -Force
提示返回时,关闭 PowerShell 窗口。 然后,打开具有提升权限的新 PowerShell 窗口以启动新的 PowerShell 会话。
在 PowerShell 提示符下,安装最新版本的 Azure Az 模块:
Install-Module -Name Az -Scope AllUsers -Repository PSGallery -Force
当提示返回时,请安装 Az.Account 1.9.4 包:
Install-Module -Name Az.Accounts -Scope AllUsers -RequiredVersion "1.9.4" -Repository PSGallery -Force
检索 BEK 文件名
在Azure 门户中,导航到用于加密源 VM 的密钥保管库。 如果不知道密钥保管库的名称,请在 Azure Cloud Shell 中的提示符处输入以下命令,并在输出中查找“sourceVault”旁边的值:
az vm encryption show --name MyVM --resource-group MyResourceGroup
在左侧菜单中,选择“ 访问策略”。
在密钥保管库的访问策略中,确保你用于登录 Azure 订阅的用户帐户被授予以下权限: 密钥管理操作:获取、列出、更新、创建 加密操作:解包密钥 机密权限:获取、列出、设置
返回到修复 VM 和提升的 PowerShell 窗口。
输入以下命令,将 HTTP API 安全协议设置为当前会话的 TLS 1.2。
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
输入以下命令开始登录到 Azure 订阅的过程,将“[SubscriptionID]”替换为 Azure 订阅 ID:
Add-AzAccount -SubscriptionID <SubscriptionID>
按照提示完成登录到 Azure 订阅的过程。
在修复 VM 中,打开提升的 Windows PowerShell ISE 窗口并展开脚本(顶部)窗格。
在提升的 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" }
选择“运行脚本”以运行脚本。
在输出中,查找 DiskEncryptionKeyFileName 下的值以获取 BEK 文件的名称。
在以下示例输出中,BEK 文件名(机密名称 + “)。BEK“文件扩展名为 AB4FE364-4E51-4034-8E09-0087C3D51C18。BEK。 记录此值,因为它将在下一步中使用。 (如果看到两个重复卷,具有较新时间戳的卷是修复 VM 使用的当前 BEK 文件。
如果输出中的内容类型值是包装 BEK,如上例所示,请转到“下载并解包 BEK”。 如果输出中的内容类型值只是 BEK,如以下示例所示,请转到下一部分,将 BEK 下载到修复 VM。
将 BEK 下载到修复 VM
在修复 VM 上,在 C 卷的根目录中创建一个名为“BEK”(无引号)的文件夹。
将以下示例脚本复制并粘贴到空的 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)
在 PowerShell ISE 窗口中,选择“ 运行脚本”。 如果脚本成功运行,则不会显示输出或完成消息。 但是,将在 C:\BEK 文件夹中创建新文件。 (The C:\BEK 文件夹必须已存在。
跳到 验证脚本是否已成功完成。
下载并解包 BEK
在修复 VM 上,在 C 卷的根目录中创建一个名为“BEK”(无引号)的文件夹。
在记事本中记录以下值。 在脚本运行时,系统会提示你提供它们。
secretUrl。 这是密钥保管库中存储的机密的 URL。 有效的机密 URL 使用以下格式: <<
https://[key
> vault name].vault.azure.net/secrets/[BEK Name]/[version ID]>若要在Azure 门户中找到此值,请导航到密钥保管库中的“机密”边栏选项卡。 选择在上一步中确定的 BEK 名称, 检索 BEK 文件名。 选择当前版本标识符,然后读取“属性”下面的机密标识符 URL。 (可以将此 URL 复制到剪贴板。
keyVaultResourceGroup。 密钥保管库的资源组。
kekUrl。 这是用于保护 BEK 的密钥的 URL。 有效的 kek URL 使用以下格式: <<
https://[key
> vault name].vault.azure.net/keys/[key name]/[version ID]>可以通过导航到密钥保管库中的“密钥”边栏选项卡,选择用作 KEK 的密钥的名称,选择当前版本标识符,然后在属性下方读取密钥标识符 URL,从而在Azure 门户中获取此值。 (可以将此 URL 复制到剪贴板。
secretFilePath。 这是要在其中存储 BEK 文件的位置的完整路径名。 例如,如果 BEK 文件名 AB4FE364-4E51-4034-8E06-0087C3D51C18。BEK,可以输入 C:\BEK\AB4FE364-4E51-4034-8E06-0087C3D51C18。BEK。 (The C:\BEK 文件夹必须已存在。
导航到 以下页面 ,下载用于生成 BEK 文件以解锁加密磁盘的脚本。
在页面上,选择“ 原始”。
将脚本的内容复制并粘贴到修复 VM 中提升的 PowerShell ISE 窗口中的空脚本窗格中。
选择“ 运行脚本”。
出现提示时,请提供在运行脚本之前记录的值。 如果系统提示输入“不受信任的存储库”消息,请选择“ 是到全部”。 如果脚本成功运行,则会在 C:\BEK 文件夹中创建一个新文件。 (此文件夹必须已存在。
验证脚本是否已成功运行
导航到 本地计算机上的 C:\BEK 文件夹,找到新的输出文件。
在记事本中打开 文件。 如果脚本运行正确,则滚动到右侧时,会在文件的顶部行中找到短语 BitLocker 扩展密钥保护程序 。
解锁附加磁盘
现已准备好解锁加密磁盘。
在修复 VM 上,在磁盘管理中,如果附加的加密磁盘尚未联机,请将其联机。 记下 BitLocker 加密卷的驱动器号。
在命令提示符处,输入以下命令。
注意
在此命令中,将“<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:.
访问卷后,可以根据需要进行故障排除和缓解,例如,通过读取日志或运行脚本。
重要
解锁过程提供对磁盘的访问权限,但它 不会解密磁盘。 解锁磁盘后仍保持加密状态。 如果需要解密磁盘,请使用命令 manage-bde <卷> -off 开始解密过程并管理 bde <驱动器> -status 来检查解密的进度。
修复完成后,如果磁盘是托管的,则可以继续替换源 VM 的 OS 磁盘(托管磁盘)。 如果磁盘不是托管的,则可以使用此处所述的基于 CLI 的步骤: 替换源 VM 上的 OS 磁盘
替换源 VM 的 OS 磁盘(托管磁盘)
修复磁盘后,在Azure 门户中打开修复 VM 的“磁盘”边栏选项卡。 分离源 VM OS 磁盘的副本。 为此,请在“数据磁盘”下找到关联的磁盘名称的行,选择该行右侧的“X”,然后选择“保存”。
在Azure 门户中,导航到源 VM(已断开)VM,然后打开“磁盘”边栏选项卡。 然后选择“交换 OS 磁盘”,将现有 OS 磁盘替换为已修复的 OS 磁盘。
选择修复的新磁盘,然后输入 VM 的名称以验证更改。 如果未在列表中看到磁盘,请在从故障排除 VM 分离磁盘后等待 10 到 15 分钟。
选择“确定”。
后续步骤
如果在连接到 VM 时遇到问题,请参阅 排查与 Azure VM 的远程桌面连接问题。 有关访问 VM 上运行的应用程序时出现的问题,请参阅 排查 Windows VM 上的应用程序连接问题。
联系我们寻求帮助
如果你有任何疑问或需要帮助,请创建支持请求或联系 Azure 社区支持。 你还可以将产品反馈提交到 Azure 反馈社区。