GRUB 找不到加密的引导分区

GRUB 找不到加密的引导分区

Arch Linux 安装(在加密的 LVM 上)并尝试加密启动分区。

对于具有非加密启动分区的“全盘加密”,这让我感到困扰。这个问题是关于我的安装中可能出了什么问题,但我非常感谢关于有或没有未加密的启动分区。未加密的启动分区确实是系统上的漏洞吗?什么仍然是脆弱的?加密启动分区是否有助于更好地保护系统?

那指出,我打算尽力详细提供有关安装和系统的必要信息,以帮助解决问题为什么grub找不到boot分区,但我也很感谢您在理解需要详细说明的内容方面的支持,我只是对可能的决定因素以及系统启动过程如何工作有一些提示,我就像在探索Linux系统、试验它和学习的过程中一样从中。

安装后启动时

Welcome to GRUB!

error: no such device: dbf12ef6-156f-43ac-980d-ee41ao17b917
error: unknown filesystem.
Entering rescue mode...
grub rescue>

安装

# iwctl to connect to a wifi
root@archiso ~ # iwctl

# update package repository index
root@archiso ~ # pacman -Syyy

# securely erase the disk
root@archiso ~ # dd if=/dev/urandom of=/dev/sda bs=4096 status=progress

# partition the table
root@archiso ~ # fdisk /dev/sda
    g (GPT Partition Table)
    /dev/sda1 EFI System (type alias 1) +500M
    /dev/sda2 Linux FileSystem (type alias 20) +500M
    /dev/sda3 Linux LVM (type alias 30) +100%FREE

root@archiso ~ # fdisk -l /dev/sda
#result
Disk /dev/sda: 298.09 GiB, 320072933376 bytes, 625142448 sectors
Disk model: Hitachi HTS54503
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes /4096 bytes
Disklabel type: gpt
Disk identifier: A9C36FBB-D67F-5840-9BD9-28326588F6BA

Device       Start       End       Sectors      Size    Type
/dev/sda1     2048   1026047       1024000      500M    EFI System
/dev/sda2  1026048   2050047       1024000      500M    Linux filesystem
/dev/sda3  2050047 625142414     623092367    297.1G    EFI System

root@archiso ~ # lsblk -f

NAME    FSTYPE      FSVER    LABEL    UUID    FSAVAIL    FSUSE%    MOUNTPOINT
loop    squashfs    4.0                             0      100%    /rub/archiso/sfs/airootfs
sda
-sda1   vfat        FAT32             7D44-F492
-sda2   crypto_LUKS 2                 60f94adc-1e6f-425d-a120-4888fa9bacd3
-sda3   crypto_LUKS 2                 5ab19132-685d-479b-8425-acaa133ed7a8

# format EFI partition
root@archiso ~ # mkfs.fat -F32 /dev/sda1

# encrypt boot partition
root@archiso ~ # cryptsetup luksFormat /dev/sda2

# open encrypted boot partition
root@archiso ~ # cryptsetup open --type luks /dev/sda2 cryptboot

# format encrypted boot partition
root@archiso ~ # mkfs.ext4 /dev/mapper/cryptboot

# encrypt LVM partition
root@archiso ~ # cryptsetup luksFormat /dev/sda3

# open encrypted LVM partition
root@archiso ~ # cryptsetup open --type luks /dev/sda3 cryptlvm

# create physical volume
root@archiso ~ # pvcreate /dev/mapper/cryptlvm

# create volume group
root@archiso ~ # vgcreate volgroup0 /dev/mapper/cryptlvm

# create logical volume 
root@archiso ~ # lvcreate -L 50GB volgroup0 -n root

# format root filesystem logical volume
root@archiso ~ # mkfs.ext4 /dev/volgroup0/root

# mount root logical volume
root@archiso ~ # mount /dev/volgroup0/root /mnt

# create directory to mount the encrypted boot partition
root@archiso ~ # mkdir /mnt/boot

# mount the encrypted boot partition
root@archiso ~ # mount /dev/mapper/cryptboot /mnt/boot

#create /etc directory
root@archiso ~ # mkdir /mnt/etc

# generate fstab file (required for successful boot)
root@archiso ~ # genfstab -U -p /mnt >> /mnt/etc/fstab

# sanity check on file
root@archiso ~ # cat /mnt/etc/fstab

# /dev/mapper/volgroup0-root
UUID=71d35768-2e3b-4aad-bd88-313544742d72    /        ext4    rw,relatime             0 1

# /dev/mapper/cryptboot
UUID=dbf12ef6-156f-43ac-980d-ee41a017b917    /boot    ext4    rw,relatime,stripe=4    0 2

#install packages on file system
#(obs
#linux <defaultLinuxKernel> linux-lts <alternateLinuxKernel
#   -makes possibly a selection at the start process of the computer in which you can set the alternate kernel, which is very useful if you run into a problem
#
#efibootmgt dosfstools os-prober mtools
#   -packages to support grub
#)
root@archiso ~ # pacstrap -i /mnt base base-devel linux linux-lts linux-headers linux-lts-headers networkmanager wpa_supplicant wireless_tools netctl openssh dialog lvm2 grub efibootmgr dosfstools os-prober mtools vim

# change to archroot to access in progress installation to make additional changes
root@archiso ~ # arch-chroot /mnt

# enable openssh NetworkManager by default (start automatically at boot time)
[root@archiso /]# systemctl enable sshd NetworkManager

# edit the very specific file /etc/mkinitcpio.conf
# line -- HOOKS=(base udev autodetect keyboard keymap consolefont modconf block lvm2 encrypt filesystems fsck)
[root@archiso /]# vim /etc/mkinitcpio.conf

# run mkinitcpio -p against whatever kernel decided to go along with
[root@archiso /]# mkinitcpio -p linux
[root@archiso /]# mkinitcpio -p linux-lts

# set time zone
[root@archiso /]# ln -sf /usr/share/zoneinfo/Brazil/East /etc/localtime

# generate /etc/adjtime
[root@archiso /]# hwclock --systohc

# Localization - edit /etc/locale.gen uncommenting appropriate locale
[root@archiso /]# vim /etc/locale.gen

# generate the locale(s)
[root@archiso /]# locale-gen

# set the LANG variable in a file named /etc/locale.conf
[root@archiso /]# vim /etc/locale.conf

# set the keyboard layout in a file named /etc/vconsole.font
[root@archiso /]# vim /etc/vconsole.conf

# configure bootloader (grub has the most compatibility, applications such as timeshift have an issue when not using grub)
# (obs
# GRUB_ENABLE_CRYPTODISK=y
# GRUB_CMDLINE_LINUX_DEFAULT="loglevel=3 cryptdevice=/dev/sda3:volgroup0:allow-discards quiet"
# )
[root@archiso /]# vim /etc/default/grub

# create file for EFI information (files that are required for booting the system)
[root@archiso /]# mkdir /boot/EFI

# mount the EFI System partition
[root@archiso /]# mount /dev/sda1 /boot/EFI

# install grub bootloader on the hard drive
# no errors were reported
[root@archiso /]# grub-install --target=x86_64-efi --bootloader-id=grub_uefi --recheck

# create directory /boot/grub/locale
[root@archiso /]# mkdir /boot/grub/locale

# copy file into directory
[root@archiso /]# cp /usr/share/locale/en\@quot/LC_MESSAGES/grub.mo /boot/grub/locale/en.mo
    
# Generate GRUB's configuration file:
[root@archiso /]# grub-mkconfig -o /boot/grub/grub.cfg

# create a swap file
# (obs
# it's preferable to create a swap file instead of a swap partition because it is easier to change the size of swap just deleting and recreating the file with a bigger size whereas with a swap partition. With a swap partition it's needed to resize the partitions which is a lot more risky
# )
[root@archiso /]# fallocate -l 4G /swapfile

# adjust the swap file permissions to be more restrictive
[root@archiso /]# chmod 600 /swapfile

# Make swap
[root@archiso /]# mkswap /swapfile

# create a backup of fstab file
[root@archiso /]# cp /etc/fstab /etc/fstab.bak

# Make swap activate as soon as computer is started adding to fstab file
[root@archiso /]# echo "/swapfile none swap sw 0 0" | tee -a /etc/fstab

# sanity check on file
[root@archiso /]# cat /mnt/etc/fstab

# /dev/mapper/volgroup0-root
UUID=71d35768-2e3b-4aad-bd88-313544742d72    /        ext4    rw,relatime             0 1

# /dev/mapper/cryptboot
UUID=dbf12ef6-156f-43ac-980d-ee41a017b917    /boot    ext4    rw,relatime,stripe=4    0 2

/swapfile none swap sw 0 0

# install micro code package for the actual CPU (if AMD cpu - amd-ucode; elseif intel cpu - intel-ucode)
[root@archiso /]# pacman -S intel-ucode

# package to facilitate a desktop environment
[root@archiso /]# pacman -S xorg-server

# consider installing a video driver, if intel or AMD gpu - mesa; elseif NVIDIA gpu - nvidia nvidia-lts nvidia-utils
[root@archiso /]# pacman -S mesa

# back to arch linux install media
[root@archiso /]# exit

# umount -a
root@archiso ~ # umount -a

# poweroff or reboot
root@archiso ~ # poweroff

简单地说,这就是安装。写问题时,我注意到 GRUB 尝试查找设备 iddbf12ef6-156f-43ac-980d-ee41ao17b917

error: no such device: dbf12ef6-156f-43ac-980d-ee41ao17b917

这恰好是设备 ID/dev/mapper/cryptboot正如文件中所示/mnt/etc/fstab要不就/etc/fstab并在安装过程中安装在/boot上

# /dev/mapper/cryptboot
UUID=dbf12ef6-156f-43ac-980d-ee41a017b917    /boot    ext4    rw,relatime,stripe=4    0 2

在我看来,它只是在命令之后存在root@archiso ~ # cryptsetup open --type luks /dev/sda2 cryptboot

这可能是问题所在吗?有什么提示可能是什么问题,我错在哪里以及如何解决它吗?

我非常感激,任何缺少的信息我都会提供更详细的信息。

答案1

正如 TelcomM 所建议的,在安装之前我已经彻底查看了 Arch Wiki 中的两个链接,但我错过了一个具体说明:

注意:/boot 不需要保留在单独的分区中;它也可能位于系统的根/目录树下。

即使这没有回答我的安装中“为什么 grub 找不到加密的启动分区”的问题,也没有解决让 grub 找到分区的问题,但在我看来,在同一个磁盘上加密两个不同的分区是没有意义的,一个用于系统根目录,另一个用于系统引导。

在系统根目录下只有一个带有 /boot 的加密分区可以正常工作并且系统可以正常启动。

如上所述,在我看来,这个解决方案完全足以解决我在带有非加密启动分区的假装“全盘加密”中遇到的麻烦。所以,对于我来说,关于 /boot 分区的问题似乎已经解决了。

然而,在这个安装中,我们仍然有一个“令人烦恼的”未加密的 EFI 系统分区,并且对我来说仍然有一个问题:“这个分区未加密是否会使其成为系统上可能的脆弱点?”

我非常感谢任何讨论观点。

答案2

Arch Wiki 有关于配置启动分区和 grub 使其相互兼容的具体说明: 加密的 /boot 分区 - Arch Wiki

您是否有机会彻底检查并确保您在创建加密启动分区时已完成其中列出的步骤?

还有这个Arch Wiki 完整系统加密指南

未加密的启动分区确实是系统上的漏洞吗?

我对 /boot 上的内容了解不够,无法确定,但我怀疑那里会有很多内容会造成有人破坏其余磁盘上的加密的额外风险。

也许攻击者可以找到有关您正在运行的内核的信息。

答案3

# encrypt boot partition
root@archiso ~ # cryptsetup luksFormat /dev/sda2

改成:

# encrypt boot partition
root@archiso ~ # cryptsetup --type luks1 luksFormat /dev/sda2

grub2 不支持完全 luks2 加密,这是格式化分区时默认选项设置的。对于其他需要与 grub 配合的分区也是如此。 :)

答案4

从提供的信息中我看不出 GRUB 无法启动的原因。你是对的,grub 无法找到“dbf12...”设备,因为它只有在解密启动后才可用。但是,GRUB 应该推断它位于加密分区中,并包含在可以解密启动分区的核心映像加密模块中。一些提示:检查/etc/默认/grub它启用了加密盘(GRUB_ENABLE_CRYPTODISK=y)并检查/boot/grub.cfg。在救援模式下,您可以尝试通过 cryptomount 命令解锁启动分区(尽管在救援模式下可能不可用 - 这取决于是否真正启用了 cryptodisk 扩展)。您可以在详细模式 (-v) 下运行 grub-install 来检查它使用什么路径来安装模块(详细输出提供了可以指出问题根源的附加信息)。

作为一种可能的解决方案,您可以使用以下选项在未加密的 EFI 分区上安装 grub“--boot-directory=/boot/EFI”(假设它安装到/启动/EFI这似乎是你的情况)。在此设置中,grub 核心映像和所有模块都位于未加密的分区中。即使 grub.cfg 配置错误,您也可以从 grub 控制台手动加载 Linux。严格来说,这不是问题的答案(因为 GRUB 可以按照您尝试的方式安装),但您似乎正在评估加密磁盘的不同方法。

关于启动加密的一般问题。对于 GRUB(并非所有引导加载程序都支持加密),FDE 有几个“程度”,它们的不同之处在于隐藏在加密分区中的引导文件的数量。

  1. GRUB、内核和 initramfs 映像位于未加密的分区中,可能是 EFI(可以创建单独的分区来包含这些文件,但没有必要,因此为简单起见,所有启动文件都可以保存在 EFI 分区中 - 500MiB 应该足够了)。在此设置中,攻击者可以篡改内核或 initramfs 映像,任何有权访问磁盘的人都可以擦除这些文件。密码应在加载内核后输入,或与密钥文件一起提供,密钥文件应具有单独的保护。回答您的问题 - 在此设置中,系统的脆弱点是内核 + initramfs + GRUB。

  2. GRUB 位于未加密的 EFI 分区中,内核和 initramfs 位于加密的 /boot 文件夹中,该文件夹是根分区的一部分。在这种情况下,应在加载内核之前在 GRUB 引导期间提供密码。它也应该在内核启动后提供,但为了简单起见,密钥文件可以嵌入 initramfs 中(在选项 1 中这是不可能的,因为 initramfs 不受保护)。在这种情况下,攻击者无法篡改内核或 initramfs 映像,但他/她可以(理论上)篡改 grub 核心文件或模块(漏洞点)以“窃取”密码。

  3. GRUB 核心映像和加密模块位于未加密的 EFI 分区中,GRUB 的其他部分位于加密的根分区中。在此设置中,GRUB 核心映像(在多个“嵌入”到单个 EFI 文件中的与加密相关的模块的帮助下)要求密码来解密其自身的其余部分,并访问内核和 initramfs 映像。在这种情况下,攻击者只能篡改核心映像(为了简单起见,“EFI 文件”),因此应该通过其他方式对其进行保护,例如 UEFI SecureBoot。尽管如此,即使没有 SecureBoot,攻击面也从选项 2 中的“任何 GRUB 文件”减少到“GRUB 核心文件”。

因此,理论上您可以在启用 Secureboot 的情况下保护全链 GRUB 核心映像 -> GRUB 模块 -> 内核映像 + initramfs。然而,这实际上取决于感知到的威胁以及您想要保护启动过程的哪些部分。有些人可能认为选项 3 太过分了。还应该注意的是,在某些司法管辖区,国家可以合法地强迫您交出密码,而在其他国家/地区,国家可以字面上“强迫”(非法)您交出密码。考虑到这一点 - 国家不会费心编写 GRUB 恶意软件,因为为了保护数据免受公众侵害,选项 1 就足够了。这是一个非常大且普遍的话题,有点超出了原来的问题。

相关内容