解锁用于脱机修复的加密 Linux 磁盘

本文介绍如何解锁 Azure 磁盘加密 (已启用 ADE) 的 OS 磁盘,以便进行脱机修复。

Azure 磁盘加密可以应用于 Microsoft 认可的 Linux 虚拟机 (VM) 。 下面是在 Linux VM 中启用 Azure 磁盘加密的一些基本要求:

症状

如果在 OS 磁盘上启用了 ADE,则尝试在修复 VM 上装载磁盘后,可能会收到以下错误消息:

mount:错误的 fs 类型、错误的选项、/dev/sda2 上的错误超级锁、缺少代码页或帮助程序或其他错误

mount:未知文件系统类型“LVM2_member”

准备

在解锁加密的 OS 磁盘进行脱机修复之前,请完成以下任务:

  1. 确认磁盘上已启用 ADE
  2. 确定 OS 磁盘是使用 ADE 版本 0 (双通道加密) 还是使用 ADE 版本 1 (单通道加密)
  3. 确定 OS 磁盘是托管磁盘还是非托管磁盘
  4. 选择解锁加密磁盘的方法

验证磁盘上是否启用了 ADE

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

Azure 门户

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

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

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 中的步骤解锁磁盘。

选择解锁加密磁盘的方法

选择以下方法之一来解锁加密磁盘:

方法 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 卷中的密钥文件解锁加密的磁盘

若要手动解锁和装载加密磁盘,请执行以下步骤:

  1. 创建新的修复 VM,并在创建 VM 期间将加密磁盘附加到此 VM

    创建修复 VM 时,必须附加加密磁盘。 这是因为系统检测到附加磁盘已加密。 因此,它会从 Azure 密钥保管库提取 ADE 密钥,然后创建名为“BEK VOLUME”的新卷来存储密钥文件。

  2. 登录到修复 VM,然后卸载加密磁盘上所有装载的分区

  3. 标识 BEK 卷中的 ADE 密钥文件

  4. 标识加密 OS 的启动分区中的头文件

  5. 使用 ADE 密钥文件和头文件解锁加密磁盘

  6. 装载分区: LVMRAW 或非 LVM

创建修复 VM

  1. 获取加密 OS 磁盘的快照

  2. 从快照创建磁盘。 对于新磁盘,请选择与要修复的问题 VM 相同的位置和可用性区域。

  3. 创建基于以下准则的 VM:

    • 在Azure 市场中,为故障 VM 使用的修复 VM 选择同一映像。 (OS 版本应相同。)
    • 选择至少向 VM 分配 8 GB 内存的大小。
    • 将此新 VM 分配到在步骤 2 中创建的新磁盘所用的同一资源组、区域和可用性设置。
  4. “创建虚拟机”向导的“磁盘”页上,附加刚从 快照) 创建的新磁盘 (作为数据磁盘。

重要

由于仅在创建 VM 期间检测到加密设置,因此请确保在创建 VM 时附加磁盘。 这样,包含 ADE 密钥文件的卷即可自动添加到 VM。

卸载加密磁盘上已装载的任何分区

  1. 创建修复 VM 后,通过 SSH 连接到修复 VM,使用适当的凭据登录,然后将帐户提升到 root:

    sudo -s 
    
  2. 使用 lsblk 命令列出附加的设备。 在输出中,应会看到多个附加磁盘。 这些磁盘包括活动 OS 磁盘和加密磁盘。 它们可以按任意顺序显示。

  3. 使用以下信息标识加密磁盘:

    • 磁盘将有多个分区
    • 磁盘不会列出根目录 (“/”) 作为其任何分区的装入点。
    • 磁盘将与从快照创建磁盘时记录的大小匹配。

    在以下示例中,输出指示“sdd”是加密磁盘。 这是唯一具有多个分区且未将“/”列为装入点的磁盘。

    有关第一个示例的图像

  4. 卸载已在文件系统中装载的加密数据磁盘上的任何分区。 例如,在前面的示例中,必须卸载“/boot/efi”* 和“/boot”。

    umount /boot/efi 
    
    umount /boot 
    

标识 ADE 密钥文件

必须同时具有密钥文件和头文件才能解锁加密磁盘。 密钥文件存储在 BEK 卷中,头文件位于加密 OS 磁盘的启动分区中。

  1. 确定哪个分区是 BEK 卷:

    lsblk -fs | grep -i bek 
    

    以下示例输出指示 sdb1 是 BEK 卷:

    >sdb1  vfat   BEK VOLUME      04A2-FE67 
    

    如果没有 BEK 卷,请通过附加加密磁盘来重新创建修复 VM。 如果 BEK 卷仍未自动附加, 请尝试方法 3 来检索 BEK 卷。

  2. 在“/mnt”文件夹下创建名为“azure_bek_disk”的目录:

    mkdir /mnt/azure_bek_disk 
    
  3. 在“/mnt/azure_bek_disk”目录中装载 BEK 卷。 例如,如果 sdb1 是 BEK 卷,请输入以下命令:

    mount /dev/sdb1 /mnt/azure_bek_disk 
    
  4. 再次列出可用设备:

    lsblk -o NAME,SIZE,LABEL,PARTLABEL,MOUNTPOINT  
    

    注意: 你将看到确定为 BEK 卷的分区现在已装载到“/mnt/azure_bek_disk”。

  5. 查看“/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”密钥文件来解锁加密的磁盘。

  1. 使用以下命令显示可用磁盘和分区的选定属性:

    lsblk -o NAME,SIZE,LABEL,PARTLABEL,MOUNTPOINT
    
  2. 在加密磁盘上,标识 os 分区 (根分区) 。 这是加密磁盘上最大的分区。 在前面的示例输出中,OS 分区为“sda4”。运行 unlock 命令时必须指定此分区。

  3. 在文件结构的根目录 (“/”) 中,创建一个目录,以将加密磁盘的根分区装载到其中。 磁盘解锁后,稍后将使用此目录。 若要将其与修复 VM 的活动 OS 分区区分开来,请将其命名为“investigateroot”。

    mkdir /{investigateboot,investigateroot}
    
  4. 在加密磁盘上,标识包含头文件的启动分区。 在加密磁盘上,启动分区是第二大分区,在 LABEL 或 PARTLABEL 列中不显示任何值。 在前面的示例输出中,加密磁盘的启动分区为“sda2”。

  5. 将步骤 4 中标识的启动分区装载到 /investigateboot/ 目录中。 在以下示例中,加密磁盘的启动分区为 sda2。 但是,系统上的位置可能有所不同。

    mount /dev/sda2 /investigateboot/ 
    

    如果装载分区失败并返回“错误的 fs 类型,错误的选项,错误的超级锁”错误消息,请使用 命令重试 mount -o nouuid ,如以下示例所示:

    mount -o nouuid /dev/sda2 /investigateboot/ 
    
  6. 列出 /investigateboot/ 目录中的文件。 “luks”子目录包含解锁磁盘必须具有的头文件。

  7. 列出 /investigateboot/luks/ 目录中的文件。 头文件名为“osluksheader”。

    ls -l /investigateboot/luks 
    

使用 ADE 密钥文件和头文件解锁磁盘

  1. cryptsetup luksOpen使用 命令解锁加密磁盘上的根分区。 例如,如果包含加密 OS 的根分区的路径为 /dev/sda4,并且你想要将名称“osencrypt”分配给已解锁的分区,请运行以下命令:

    cryptsetup luksOpen --key-file /mnt/azure_bek_disk/LinuxPassPhraseFileName --header /investigateboot/luks/osluksheader /dev/sda4 osencrypt 
    
  2. 解锁磁盘后,请从 /investigateboot/ 目录卸载加密磁盘的启动分区:

    umount /investigateboot/ 
    

    注意: 稍后必须将此分区装载到另一个目录。

    下一步是装载刚刚解锁的分区。 用于装载分区的方法取决于磁盘使用的设备映射器框架 (LVM 或非 LVM) 。

  3. 列出设备信息以及文件系统类型:

    lsblk -o NAME,FSTYPE 
    

    在示例中,你将看到未锁定的分区和分配给它的名称 (,该名称为“osencrypt”) :

装载未锁定的分区,并仅) (LVM 进入 chroot 环境

如果磁盘使用 LVM 设备映射器框架,则必须执行额外的步骤来装载磁盘并进入 chroot 环境。 若要将 chroot 工具与加密磁盘一起使用,必须将未锁定的分区 (“osencrypt”) 及其逻辑卷识别为名为 rootvg 的卷组。 但是,默认情况下,修复 VM 的 OS 分区及其逻辑卷已分配给名为 rootvg 的卷组。 我们必须解决这一冲突,然后才能继续。

  1. pvs使用 命令可显示 LVM 物理卷的属性。 你可能会看到警告消息,如以下示例所示,指示已解锁分区 (“/dev/mapper/osencrypt”) 和另一个设备正在使用重复的通用唯一标识符 (UUID) 。 或者,你可能会看到分配给 rootvg 的两个分区。

    注意

    你只希望将未锁定的分区 (“osencrypt”) 分配给 rootvg 卷组,以便可以通过 chroot 实用工具访问其逻辑卷。 若要解决此问题,需要暂时将分区导入其他卷组,并激活该卷组。 接下来,将重命名当前 rootvg 卷组。 只有在进入 chroot 环境后,才会将加密磁盘的卷组重命名为“rootvg”。

分配未锁定的分区 (示例)

  1. 将新解锁的分区导入到新的卷组中。 在此示例中,我们将新卷组临时命名为“rescuemevg”。 将新解锁的分区导入到新的卷组中。 在此示例中,我们将新卷组临时命名为“rescuemevg”。

  2. 激活新的卷组:

    vgimportclone -n rescuemevg /dev/mapper/osencrypt
    vgchange -a y rescuemevg
    
  3. 重命名旧的 rootvg 卷组。 在此示例中,我们将使用名称“oldvg”。

    vgrename rootvg oldvg 
    
  4. 运行 lsblk -o NAME,SIZE,LABEL,PARTLABEL,MOUNTPOINT 以查看可用的设备。 现在应会看到两个卷组都按分配给它们的名称列出。

  5. 在不使用重复的 UUID 的情况下,将 rescuemevg/rootlv 逻辑卷装载到 /investigateroot/ 目录:

    umount /investigateboot
    mount -o nouuid /dev/rescuemevg/rootlv /investigateroot/ 
    

    现在,已解锁并装载失败的 VM 的根分区,你应该能够访问根分区来排查问题。 有关详细信息,请参阅 排查由于文件系统错误而导致的 Linux 虚拟机启动问题

    但是,如果要使用 chroot 实用工具进行故障排除,请继续执行以下步骤。

  6. 将加密磁盘的启动分区装载到目录 /investigateroot/boot/,而不使用重复的 UUID。 (请记住,加密磁盘的启动分区是未分配分区标签的第二大分区。) 在我们的当前示例中,加密磁盘的启动分区为 sda2。

    mount -o nouuid /dev/sda2 /investigateroot/boot
    
  7. 将加密磁盘的 EFI 系统分区装载到 /investigateroot/boot/efi 目录。 可以通过标签标识此分区。 在当前示例中,EFI 系统分区为 sda1。

    mount /dev/sda1 /investigateroot/boot/efi
    
  8. 将加密磁盘卷组中剩余未装载的逻辑卷装载到“/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
    
  9. 将 Active directory 更改为加密磁盘上装载的根分区:

    cd /investigateroot
    
  10. 输入以下命令来准备 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/
    
  11. 输入 chroot 环境:

    chroot /investigateroot/
    
  12. 将 rescuemevg 卷组重命名为“rootvg”,以避免 grub 和 initramfs 发生冲突或可能出现的问题。 重新生成 initramfs 时,请保留相同的命名约定。 由于 vg 名称发生更改,因此请在救援 VM 上工作。 如果重启,它将不再有用。 救援 VM 应被视为临时 VM。

    vgrename rescuemevg rootvg
    
  13. 排查 chroot 环境中的问题。 例如,可以读取日志或运行脚本。 有关详细信息,请参阅 在 chroot 环境中执行修复

  14. 退出 chroot 并交换 OS 磁盘

装载未锁定的磁盘,并 (RAW/非 LVM) 进入 chroot 环境

  1. 在文件结构的根目录 (“/”) 中,创建一个目录,将加密磁盘的根分区装载到其中。 磁盘解锁后,稍后将使用此目录。 若要将其与修复 VM 的活动 OS 分区区区分开来,请将其命名为“investigateroot”。

    mkdir /{investigateboot,investigateroot}
    
  2. 将新解锁的分区 (“osencrypt”) 装载到 /investigateroot/ 目录:

    mount /dev/mapper/osencrypt /investigateroot/ 
    

    如果装载分区失败并返回“错误的 fs 类型,错误的选项,错误的超级锁”错误消息,请使用装载 -o nouuid 命令重试:

    mount -o nouuid /dev/mapper/osencrypt /investigateroot/ 
    
  3. 尝试显示 /investigateroot/ 目录的内容,验证装载的分区现在是否已解锁:

    ls /investigateroot/ 
    
  4. 现在,已解锁并装载失败的 VM 的根分区,可以访问根分区来排查问题。 有关详细信息,请参阅 排查由于文件系统错误而导致的 Linux 虚拟机启动问题

    但是,如果要使用 chroot 实用工具进行故障排除,请转到下一步。

  5. 使用 命令 lsblk -o NAME,SIZE,LABEL,PARTLABEL,MOUNTPOINT 查看可用的设备。 将加密磁盘上的启动分区标识为未分配标签的第二大分区。

  6. 将加密磁盘上的启动分区装载到“/investigateroot/boot/”目录,如以下示例所示:

    mount /dev/sdc2 /investigateroot/boot/ 
    
  7. 将 Active directory 更改为加密磁盘上装载的根分区:

    cd /investigateroot 
    
  8. 输入以下命令来准备 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/ 
    
  9. 输入 chroot 环境:

    chroot /investigateroot/ 
    
  10. 排查 chroot 环境中的问题。 可以读取日志或运行脚本。 有关详细信息,请参阅 在 chroot 环境中执行修复

  11. 退出 chroot 并交换 OS 磁盘

方法 3:重新加密磁盘以检索密钥文件,并解锁加密的磁盘

  1. 创建修复 VM,并将锁定磁盘的副本附加到修复 VM:

  2. 将加密磁盘作为数据磁盘附加到修复 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-keyvaultkey-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
  3. 运行以下命令以检查是否附加了新磁盘:

    lsblk -f
    

    如果附加了新磁盘,请转到 “识别 BEK 卷中的 ADE 密钥文件”,然后继续按照提供的步骤解锁磁盘。

后续步骤

如果在连接到 VM 时遇到问题,请参阅 排查与 Azure VM 的 SSH 连接问题

联系我们寻求帮助

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