解锁用于脱机修复的加密 Linux 磁盘
本文介绍如何解锁 Azure 磁盘加密 (已启用 ADE) 的 OS 磁盘,以便进行脱机修复。
Azure 磁盘加密可以应用于 Microsoft 认可的 Linux 虚拟机 (VM) 。 下面是在 Linux VM 中启用 Azure 磁盘加密的一些基本要求:
- Azure Key Vault
- Azure CLI 或 Windows PowerShell cmdlet
- Device-mapper (DM) -Crypt
症状
如果在 OS 磁盘上启用了 ADE,则尝试在修复 VM 上装载磁盘后,可能会收到以下错误消息:
mount:错误的 fs 类型、错误的选项、/dev/sda2 上的错误超级锁、缺少代码页或帮助程序或其他错误
mount:未知文件系统类型“LVM2_member”
准备
在解锁加密的 OS 磁盘进行脱机修复之前,请完成以下任务:
- 确认磁盘上已启用 ADE。
- 确定 OS 磁盘是使用 ADE 版本 0 (双通道加密) 还是使用 ADE 版本 1 (单通道加密) 。
- 确定 OS 磁盘是托管磁盘还是非托管磁盘。
- 选择解锁加密磁盘的方法。
验证磁盘上是否启用了 ADE
可以在 Azure 门户、PowerShell 或 Azure 命令行界面中执行此步骤, (Azure CLI) 。
Azure 门户
查看Azure 门户中发生故障的 VM 的“概述”边栏选项卡。 在 “磁盘”下, Azure 磁盘加密 项将显示为 “已启用” 或 “未启用”,如以下屏幕截图所示。
PowerShell
可以使用 Get-AzVmDiskEncryptionStatus
cmdlet 来确定是否使用 ADE 加密 VM 的 OS 或数据卷。 以下示例输出指示在 OS 卷上启用了 ADE 加密:
Get-AzVmDiskEncryptionStatus -ResourceGroupName "ResourceGroupName" -VMName "VmName"
有关 cmdlet 的详细信息 Get-AzureRmDiskEncryptionStatus
,请参阅 Get-AzVMDiskEncryptionStatus (Az.Compute) 。
Azure CLI
可以使用 az vm encryption show
命令检查是否在 VM 磁盘上启用了 ADE:
az vm encryption show --name MyVM --resource-group MyResourceGroup --query "disks[].encryptionSettings[].enabled"
有关 命令的详细信息 az vm encryption show
,请参阅 az vm encryption show。
注意
如果未在磁盘上启用 ADE,请参阅以下文章,了解如何将磁盘附加到修复 VM: 通过将 OS 磁盘附加到修复 VM 来排查 Linux VM 问题。
确定 OS 磁盘是使用 ADE 版本 0 (双传递加密) 还是使用 ADE 版本 1 (单通道加密)
可以通过打开 VM 的属性,然后选择“扩展”打开“扩展”边栏选项卡,在Azure 门户中标识 ADE 版本。 在“ 扩展” 边栏选项卡上,查看 AzureDiskEncryptionForLinux 的版本号。
- 如果版本号为
0.*
,则磁盘使用双传递加密。 - 如果版本号为
1.*
或更高版本,则磁盘使用单通道加密。
如果磁盘使用 ADE 版本 0 (双传递加密) ,请使用 方法 3 解锁磁盘。
确定 OS 磁盘是托管磁盘还是非托管磁盘
如果不知道 OS 磁盘是托管磁盘还是非托管磁盘,请参阅 确定 OS 磁盘是托管磁盘还是非托管磁盘。
如果 OS 磁盘是非托管磁盘,请按照 方法 3 中的步骤解锁磁盘。
选择解锁加密磁盘的方法
选择以下方法之一来解锁加密磁盘:
- 如果使用 ADE 版本 1 管理和加密磁盘,并且基础结构和公司策略允许将公共 IP 地址分配给修复 VM,请使用 方法 1:使用 az vm repair 命令自动解锁加密磁盘。
- 如果磁盘使用 ADE 版本 1 进行管理和加密,但基础结构或公司策略阻止将公共 IP 地址分配给修复 VM,请使用 方法 2:通过 BEK 卷中的密钥文件解锁加密的磁盘。 选择此方法的另一个原因是你缺乏在 Azure 中创建资源组的权限。
- 如果上述任一方法失败,或者磁盘使用 ADE 版本 1 (双传递加密) 进行非托管或加密,请按照 方法 3 中的步骤解锁磁盘。
方法 1:使用 az vm repair 命令自动解锁加密磁盘
此方法依赖于 az vm repair 命令自动创建修复 VM,将发生故障的 Linux VM 的 OS 磁盘附加到该修复 VM,然后解锁磁盘(如果已加密)。 此方法要求对修复 VM 使用公共 IP 地址,并且无论使用密钥加密密钥 (KEK) 解包还是包装 ADE 密钥,它都会解锁加密磁盘。
若要使用此自动方法修复 VM,请按照 使用 Azure 虚拟机修复命令修复 Linux VM 中的步骤操作。
如果基础结构和公司策略不允许分配公共 IP 地址,或者命令 az vm repair
无法解锁磁盘,请转到下一个方法。
方法 2:通过 BEK 卷中的密钥文件解锁加密的磁盘
若要手动解锁和装载加密磁盘,请执行以下步骤:
创建新的修复 VM,并在创建 VM 期间将加密磁盘附加到此 VM。
创建修复 VM 时,必须附加加密磁盘。 这是因为系统检测到附加磁盘已加密。 因此,它会从 Azure 密钥保管库提取 ADE 密钥,然后创建名为“BEK VOLUME”的新卷来存储密钥文件。
装载分区: LVM、 RAW 或非 LVM。
创建修复 VM
从快照创建磁盘。 对于新磁盘,请选择与要修复的问题 VM 相同的位置和可用性区域。
创建基于以下准则的 VM:
- 在Azure 市场中,为故障 VM 使用的修复 VM 选择同一映像。 (OS 版本应相同。)
- 选择至少向 VM 分配 8 GB 内存的大小。
- 将此新 VM 分配到在步骤 2 中创建的新磁盘所用的同一资源组、区域和可用性设置。
在“创建虚拟机”向导的“磁盘”页上,附加刚从 快照) 创建的新磁盘 (作为数据磁盘。
重要
由于仅在创建 VM 期间检测到加密设置,因此请确保在创建 VM 时附加磁盘。 这样,包含 ADE 密钥文件的卷即可自动添加到 VM。
卸载加密磁盘上已装载的任何分区
创建修复 VM 后,通过 SSH 连接到修复 VM,使用适当的凭据登录,然后将帐户提升到 root:
sudo -s
使用 lsblk 命令列出附加的设备。 在输出中,应会看到多个附加磁盘。 这些磁盘包括活动 OS 磁盘和加密磁盘。 它们可以按任意顺序显示。
使用以下信息标识加密磁盘:
- 磁盘将有多个分区
- 磁盘不会列出根目录 (“/”) 作为其任何分区的装入点。
- 磁盘将与从快照创建磁盘时记录的大小匹配。
在以下示例中,输出指示“sdd”是加密磁盘。 这是唯一具有多个分区且未将“/”列为装入点的磁盘。
卸载已在文件系统中装载的加密数据磁盘上的任何分区。 例如,在前面的示例中,必须卸载“/boot/efi”* 和“/boot”。
umount /boot/efi umount /boot
标识 ADE 密钥文件
必须同时具有密钥文件和头文件才能解锁加密磁盘。 密钥文件存储在 BEK 卷中,头文件位于加密 OS 磁盘的启动分区中。
确定哪个分区是 BEK 卷:
lsblk -fs | grep -i bek
以下示例输出指示 sdb1 是 BEK 卷:
>sdb1 vfat BEK VOLUME 04A2-FE67
如果没有 BEK 卷,请通过附加加密磁盘来重新创建修复 VM。 如果 BEK 卷仍未自动附加, 请尝试方法 3 来检索 BEK 卷。
在“/mnt”文件夹下创建名为“azure_bek_disk”的目录:
mkdir /mnt/azure_bek_disk
在“/mnt/azure_bek_disk”目录中装载 BEK 卷。 例如,如果 sdb1 是 BEK 卷,请输入以下命令:
mount /dev/sdb1 /mnt/azure_bek_disk
再次列出可用设备:
lsblk -o NAME,SIZE,LABEL,PARTLABEL,MOUNTPOINT
注意: 你将看到确定为 BEK 卷的分区现在已装载到“/mnt/azure_bek_disk”。
查看“/mnt/azure_bek_disk/”目录中的内容:
ls -l /mnt/azure_bek_disk
输出中应看到以下文件, (ADE 密钥文件为“LinuxPassPhraseFileName”) :
>total 1 -rwxr-xr-x 1 root root 148 Aug 4 01:04 CRITICAL_DATA_WARNING_README.txt -r-xr-xr-x 1 root root 172 Aug 4 01:04 LinuxPassPhraseFileName
如果多个磁盘附加到加密的 VM,可能会看到多个“LinuxPassPhraseFileName”。 将根据磁盘数枚举“LinuxPassPhraseFileName”,其顺序与其逻辑单元号 (LUN) 相同。
标识头文件
加密磁盘的启动分区包含头文件。 你将使用此文件以及“LinuxPassPhraseFileName”密钥文件来解锁加密的磁盘。
使用以下命令显示可用磁盘和分区的选定属性:
lsblk -o NAME,SIZE,LABEL,PARTLABEL,MOUNTPOINT
在加密磁盘上,标识 os 分区 (根分区) 。 这是加密磁盘上最大的分区。 在前面的示例输出中,OS 分区为“sda4”。运行 unlock 命令时必须指定此分区。
在文件结构的根目录 (“/”) 中,创建一个目录,以将加密磁盘的根分区装载到其中。 磁盘解锁后,稍后将使用此目录。 若要将其与修复 VM 的活动 OS 分区区分开来,请将其命名为“investigateroot”。
mkdir /{investigateboot,investigateroot}
在加密磁盘上,标识包含头文件的启动分区。 在加密磁盘上,启动分区是第二大分区,在 LABEL 或 PARTLABEL 列中不显示任何值。 在前面的示例输出中,加密磁盘的启动分区为“sda2”。
将步骤 4 中标识的启动分区装载到 /investigateboot/ 目录中。 在以下示例中,加密磁盘的启动分区为 sda2。 但是,系统上的位置可能有所不同。
mount /dev/sda2 /investigateboot/
如果装载分区失败并返回“错误的 fs 类型,错误的选项,错误的超级锁”错误消息,请使用 命令重试
mount -o nouuid
,如以下示例所示:mount -o nouuid /dev/sda2 /investigateboot/
列出 /investigateboot/ 目录中的文件。 “luks”子目录包含解锁磁盘必须具有的头文件。
列出 /investigateboot/luks/ 目录中的文件。 头文件名为“osluksheader”。
ls -l /investigateboot/luks
使用 ADE 密钥文件和头文件解锁磁盘
cryptsetup luksOpen
使用 命令解锁加密磁盘上的根分区。 例如,如果包含加密 OS 的根分区的路径为 /dev/sda4,并且你想要将名称“osencrypt”分配给已解锁的分区,请运行以下命令:cryptsetup luksOpen --key-file /mnt/azure_bek_disk/LinuxPassPhraseFileName --header /investigateboot/luks/osluksheader /dev/sda4 osencrypt
解锁磁盘后,请从 /investigateboot/ 目录卸载加密磁盘的启动分区:
umount /investigateboot/
注意: 稍后必须将此分区装载到另一个目录。
下一步是装载刚刚解锁的分区。 用于装载分区的方法取决于磁盘使用的设备映射器框架 (LVM 或非 LVM) 。
列出设备信息以及文件系统类型:
lsblk -o NAME,FSTYPE
在示例中,你将看到未锁定的分区和分配给它的名称 (,该名称为“osencrypt”) :
- 对于 LVM 分区(例如“LVM_member”),请参阅 装载 LVM 分区RAW 或非 LVM。
- 有关非 LVM 分区,请参阅 装载非 LVM 分区。
装载未锁定的分区,并仅) (LVM 进入 chroot 环境
如果磁盘使用 LVM 设备映射器框架,则必须执行额外的步骤来装载磁盘并进入 chroot 环境。 若要将 chroot 工具与加密磁盘一起使用,必须将未锁定的分区 (“osencrypt”) 及其逻辑卷识别为名为 rootvg 的卷组。 但是,默认情况下,修复 VM 的 OS 分区及其逻辑卷已分配给名为 rootvg 的卷组。 我们必须解决这一冲突,然后才能继续。
pvs
使用 命令可显示 LVM 物理卷的属性。 你可能会看到警告消息,如以下示例所示,指示已解锁分区 (“/dev/mapper/osencrypt”) 和另一个设备正在使用重复的通用唯一标识符 (UUID) 。 或者,你可能会看到分配给 rootvg 的两个分区。注意
你只希望将未锁定的分区 (“osencrypt”) 分配给 rootvg 卷组,以便可以通过 chroot 实用工具访问其逻辑卷。 若要解决此问题,需要暂时将分区导入其他卷组,并激活该卷组。 接下来,将重命名当前 rootvg 卷组。 只有在进入 chroot 环境后,才会将加密磁盘的卷组重命名为“rootvg”。
分配未锁定的分区 (示例)
将新解锁的分区导入到新的卷组中。 在此示例中,我们将新卷组临时命名为“rescuemevg”。 将新解锁的分区导入到新的卷组中。 在此示例中,我们将新卷组临时命名为“rescuemevg”。
激活新的卷组:
vgimportclone -n rescuemevg /dev/mapper/osencrypt vgchange -a y rescuemevg
重命名旧的 rootvg 卷组。 在此示例中,我们将使用名称“oldvg”。
vgrename rootvg oldvg
运行
lsblk -o NAME,SIZE,LABEL,PARTLABEL,MOUNTPOINT
以查看可用的设备。 现在应会看到两个卷组都按分配给它们的名称列出。在不使用重复的 UUID 的情况下,将 rescuemevg/rootlv 逻辑卷装载到 /investigateroot/ 目录:
umount /investigateboot mount -o nouuid /dev/rescuemevg/rootlv /investigateroot/
现在,已解锁并装载失败的 VM 的根分区,你应该能够访问根分区来排查问题。 有关详细信息,请参阅 排查由于文件系统错误而导致的 Linux 虚拟机启动问题。
但是,如果要使用 chroot 实用工具进行故障排除,请继续执行以下步骤。
将加密磁盘的启动分区装载到目录 /investigateroot/boot/,而不使用重复的 UUID。 (请记住,加密磁盘的启动分区是未分配分区标签的第二大分区。) 在我们的当前示例中,加密磁盘的启动分区为 sda2。
mount -o nouuid /dev/sda2 /investigateroot/boot
将加密磁盘的 EFI 系统分区装载到 /investigateroot/boot/efi 目录。 可以通过标签标识此分区。 在当前示例中,EFI 系统分区为 sda1。
mount /dev/sda1 /investigateroot/boot/efi
将加密磁盘卷组中剩余未装载的逻辑卷装载到“/investigateroot/”的子目录:
mount -o nouuid /dev/mapper/rescuemevg-varlv /investigateroot/var mount -o nouuid /dev/mapper/rescuemevg-homelv /investigateroot/home mount -o nouuid /dev/mapper/rescuemevg-usrlv /investigateroot/usr mount -o nouuid /dev/mapper/rescuemevg-tmplv /investigateroot/tmp mount -o nouuid /dev/mapper/rescuemevg-optlv /investigateroot/opt
将 Active directory 更改为加密磁盘上装载的根分区:
cd /investigateroot
输入以下命令来准备 chroot 环境:
mount -t proc proc proc mount -t sysfs sys sys/ mount -o bind /dev dev/ mount -o bind /dev/pts dev/pts/ mount -o bind /run run/
输入 chroot 环境:
chroot /investigateroot/
将 rescuemevg 卷组重命名为“rootvg”,以避免 grub 和 initramfs 发生冲突或可能出现的问题。 重新生成 initramfs 时,请保留相同的命名约定。 由于 vg 名称发生更改,因此请在救援 VM 上工作。 如果重启,它将不再有用。 救援 VM 应被视为临时 VM。
vgrename rescuemevg rootvg
排查 chroot 环境中的问题。 例如,可以读取日志或运行脚本。 有关详细信息,请参阅 在 chroot 环境中执行修复。
装载未锁定的磁盘,并 (RAW/非 LVM) 进入 chroot 环境
在文件结构的根目录 (“/”) 中,创建一个目录,将加密磁盘的根分区装载到其中。 磁盘解锁后,稍后将使用此目录。 若要将其与修复 VM 的活动 OS 分区区区分开来,请将其命名为“investigateroot”。
mkdir /{investigateboot,investigateroot}
将新解锁的分区 (“osencrypt”) 装载到 /investigateroot/ 目录:
mount /dev/mapper/osencrypt /investigateroot/
如果装载分区失败并返回“错误的 fs 类型,错误的选项,错误的超级锁”错误消息,请使用装载
-o nouuid
命令重试:mount -o nouuid /dev/mapper/osencrypt /investigateroot/
尝试显示 /investigateroot/ 目录的内容,验证装载的分区现在是否已解锁:
ls /investigateroot/
现在,已解锁并装载失败的 VM 的根分区,可以访问根分区来排查问题。 有关详细信息,请参阅 排查由于文件系统错误而导致的 Linux 虚拟机启动问题。
但是,如果要使用 chroot 实用工具进行故障排除,请转到下一步。
使用 命令
lsblk -o NAME,SIZE,LABEL,PARTLABEL,MOUNTPOINT
查看可用的设备。 将加密磁盘上的启动分区标识为未分配标签的第二大分区。将加密磁盘上的启动分区装载到“/investigateroot/boot/”目录,如以下示例所示:
mount /dev/sdc2 /investigateroot/boot/
将 Active directory 更改为加密磁盘上装载的根分区:
cd /investigateroot
输入以下命令来准备 chroot 环境:
mount -t proc proc proc mount -t sysfs sys sys/ mount -o bind /dev dev/ mount -o bind /dev/pts dev/pts/ mount -o bind /run run/
输入 chroot 环境:
chroot /investigateroot/
排查 chroot 环境中的问题。 可以读取日志或运行脚本。 有关详细信息,请参阅 在 chroot 环境中执行修复。
方法 3:重新加密磁盘以检索密钥文件,并解锁加密的磁盘
创建修复 VM,并将锁定磁盘的副本附加到修复 VM:
- 对于托管磁盘,请参阅 通过将托管 OS 磁盘附加到修复 VM 来排查 Linux VM 问题。
- 对于非托管磁盘,请使用 存储资源管理器创建受影响 VM 的 OS 磁盘的副本。 有关详细信息,请参阅 将非托管磁盘附加到 VM 进行脱机修复。
将加密磁盘作为数据磁盘附加到修复 VM 后,请使用用于原始 VM 的 密钥保管库 和 Key Encrypted 密钥 (KEK) 重新加密此数据磁盘。 此过程将使用修复 VM 中的 BKE 密钥文件自动生成并装载 BEK 卷。 不能使用 EncryptFormatAll 选项,因为 ADE 扩展可以加密数据磁盘上的启动扇区。
如果原始 VM 由 包装的 BEK 加密,请运行以下命令。
az vm encryption enable -g "resource group" --name "VMName" --disk-encryption-keyvault "keyvault" --key-encryption-key "kek" --volume-type "data"
如果原始 VM 由 BEK 加密,请运行以下命令:
az vm encryption enable -g "resource group" --name "VMName" --disk-encryption-keyvault "keyvault" --volume-type "data"
若要确定 disk-encryption-keyvault 和 key-encryption-key 的值,请运行以下命令:
az vm encryption show --name "OriginalVmName" --resource-group "ResourceGroupName"
在下表中,在输出中找到值。 如果 keyEncryptionKey 值为空,则 BEK 会对 VM 进行加密。
参数 输出中的值 示例 disk-encryption-keyvault diskEncryptionKey:id /subscriptions/deb73ff9-0000-0000-0000-0000c7a96d37/resourceGroups/Thomas/providers/Microsoft.KeyVault/vaults/ContosoKeyvault key-encryption-key keyEncryptionKey:KeyURI https://ContosoKeyvault.vault.azure.net/keys/mykey/00000000987145a3b79b0ed415fa0000
运行以下命令以检查是否附加了新磁盘:
lsblk -f
如果附加了新磁盘,请转到 “识别 BEK 卷中的 ADE 密钥文件”,然后继续按照提供的步骤解锁磁盘。
后续步骤
如果在连接到 VM 时遇到问题,请参阅 排查与 Azure VM 的 SSH 连接问题。
联系我们寻求帮助
如果你有任何疑问或需要帮助,请创建支持请求或联系 Azure 社区支持。 还可以向 Azure 反馈社区提交产品反馈。
反馈
https://aka.ms/ContentUserFeedback。
即将发布:在整个 2024 年,我们将逐步淘汰作为内容反馈机制的“GitHub 问题”,并将其取代为新的反馈系统。 有关详细信息,请参阅:提交和查看相关反馈