故障排除指南 - /boot 已加密,我无法启动

故障排除指南 - /boot 已加密,我无法启动

我正在运行 13.10 Saucy。如果我在安装期间没有启用磁盘加密,有什么方法可以事后启用它吗?

我发现,其中说加密必须在安装时进行,但它也指 Fedora。如果有任何方法可以从那里启动实时磁盘,我可以轻松启动实时磁盘。

答案1

如果您想启用主文件夹加密,您需要安装并使用这些软件包:ecryptfs-utilscryptsetup。您还需要另一个具有管理员 (sudo) 权限的用户帐户。完整文档在此处:

如果您想在安装后启用全盘加密,目前的简短答案可能是:不可以。无论如何,如果您对此感兴趣,您的问题是重复的:

答案2

后续问题:与仅有 /home 相比,完整磁盘有哪些优点和缺点?

加密/home是使用名为加密文件系统。它做得非常好,并且与默认的身份验证系统紧密结合,因此您不会遇到任何可用性缺陷:当您输入您的帐户时(从远程 shell 或默认登录屏幕),您的密码用于解开安全密钥,然后使用该密钥动态加密/解密您主目录中的文件(挂载的文件系统将直接驻留在 中/home/username)。当您注销时,/home/username 将被卸载,并且只有加密文件在系统中可见(通常在 中/home/.ecryptfs/username/.Private/)。它们看起来像一堆乱七八糟/随机的文件,因为文件名也是加密的。唯一的信息泄露是:文件大小、时间戳和文件数量(使用全盘加密,这些也被隐藏)。

如果您的系统要在多个用户之间共享,那么这是一个非常好的功能,即使您决定同时添加全盘加密:当机器启动并运行时,全盘加密的安全性是关闭的,而只要您注销,主页(ecryptfs)加密就会打开。

因此,全盘加密和家庭加密不一定互相排斥。

根据不同的安全需求,以下是可能的设置列表:

  • 仅限全盘加密:如果您是唯一使用计算机的人,并且您的机器可以处理全盘加密的开销(所有现代台式机都可以在用户不知情的情况下做到这一点,上网本和旧笔记本电脑则不然),您可以使用全盘加密并将其放在与您的操作系统相同的分区中(/)。
  • 全盘加密主页 ECRYPTFS 加密:如果您担心您的私人数据在您的电脑开启时被读取或者您与其他用户共享您的电脑,那么您可以将家放在与 / 不同的分区中,并使用 ecryptfs 进行全盘加密(即通过 LUKS 对 / 进行加密)
  • 主页 ECRYPTFS 仅加密:如果您不太担心有人在您外出时篡改您的系统,但仍想保护您的私人数据安全,那么请跳过全盘加密,直接使用 ecryptfs(家庭加密)。此方案的一个额外好处是,这很容易设置甚至通过使用 ,您已安装 Ubuntu ecryptfs-migrate-home。此外,在更改几个版本之前,这一直是默认的 Ubuntu 设置,增加了全盘加密的可能性。由于大多数现代台式机都可以轻松处理全盘加密,并且它增加了一层薄薄的安全层来防止离线代码注入,因此安装程序中添加了全盘加密。但请注意,对于大多数用户来说,仅使用 ecryptfs 加密他们的家庭就足以满足他们的需求:让他们的朋友和普通笔记本电脑窃贼无法获取他们的私人数据。此外,如果您被一个拥有正确手段的组织单独瞄准,那么拥有全盘加密或仅家庭加密不会有太大区别,除非您还建立了许多其他偏执行为(例如:将内核保存在始终随身携带的单独 U 盘中;不断检查硬件篡改/键盘记录器等)

如果我在安装期间没有启用磁盘加密,有什么方法可以事后启用它吗?

是的,如果您当前正在使用 LVM,并且系统上有足够的空间将所有未加密的系统文件复制到加密的 LUKS 分区中,那么这将更加容易。我现在不讨论细节,因为我不知道您是否正在使用 LVM,以及您是否宁愿暂时不使用 ecrypfs,而跳过全盘加密的麻烦,直到下一次全新安装。

答案3

由于这仍然是谷歌上最热门的结果,我想用一些新信息来更新它。作为用户弗雷德里克·诺德提及于: 安装后有没有办法进行全盘加密?

有一个名为 luksipc(Luks 就地加密)的工具,经过进一步研究,我发现了最新的文档和警告该工具的作者说道:

luksipc 是在 dm-crypt/cryptsetup/LUKS 端的任何替代方案可用之前创建的。现在情况已经不同了。因此,我建议切换到 cryptsetup-reencrypt,即使 LUKS 标头的格式发生变化(据我所知,这种情况至少发生过两次,可能会导致 luksipc 灾难性地失败,即在最坏的情况下销毁所有数据),它也得到了适当的维护和上游测试。

所以这cryptsetup-reencrypt似乎是推荐的方式。

高层概述:

  1. 建议的工具只能在未使用的分区上工作,因此请使用现场 CD/USB
  2. 调整分区,让 LUKS Headers 在正确的位置有足够的空间
  3. 使用 cryptsetup-reencrypt 加密分区
  4. 对每个分区重复此操作(启动分区除外)

简短指南取自Ubuntu 文档

   Add LUKS encryption to not yet encrypted device 

          First, be sure you have space added to disk.  Or alternatively shrink filesystem in
          advance.
          Here we need 4096 512-bytes sectors (enough for 2x128 bit key).
          fdisk -u /dev/sdb # move sdb1 partition end + 4096 sectors

          cryptsetup-reencrypt /dev/sdb1 --new --reduce-device-size 4096

详细指南取自Arch Wiki - 加密未加密的文件系统

umount /mnt # As mentioned this only works on partitions/devices which aren't mounted. You can skip this if you used a live cd and didn't mount this partition yet - but be sure to check
e2fsck -f /dev/sdaX # check that the file system is ok -f == force validation even if it looks ok
resize2fs -M /dev/sdaX # Shrink the filesystem to the minimum size.
cryptsetup-reencrypt /dev/sdaX --new  --reduce-device-size 16M # Encrypt the unencrypted partition
cryptsetup open /dev/sdaX recrypt # Open the encrypted partition so we can give it back the disk space we removed by using the -M option on resize2fs
resize2fs /dev/mapper/recrypt # enlarge partition again
mount /dev/mapper/recrypt /mnt # Mount if you want to access data

问题:为什么要缩小到最小尺寸?

答案:假设 - 这样做是因为 LUKS 标头的大小将来可能会发生变化,因此这些步骤是通用的,不会过时。标头大小在过去从 LUKSv1 = 2MB 更改为 Luksv2 = 16MB

故障排除指南 - /boot 已加密,我无法启动

更新 12/2020

所以对我来说,我只有一个包含 /boot 的分区。之后我无法再启动我的系统。如果您遇到同样的问题,本指南可能会帮助您恢复正常运行的系统。

高层概述

  1. 确保您拥有 grub 和 initramfs 中解密所需的软件。
  2. 知道如何启动

蛴螬

  1. 启动“live cd” ubuntu
  2. 解密分区
  3. Chroot 切换到解密系统(如果你不知道这有什么帮助:https://superuser.com/questions/111152/whats-the-proper-way-to-prepare-chroot-to-recover-a-broken-linux-installation
  4. 在 chroot 环境中
root@ubuntu:~# echo "GRUB_ENABLE_CRYPTODISK=y" >>/etc/default/grub
root@ubuntu:~# update-grub
root@ubuntu:~# grub-install /dev/sda???
  1. 留在 chroot 中!

初始化文件系统

  1. 创建一个 initramfs hoock 脚本,通过 copy-exec 复制 cryptestup
  2. update-initramfs -u -k all

如何开机

  1. 您将获得一个空的 grub 菜单,按“c”以获取命令行。
  2. 执行以下操作:
insmod luks # load kernel module
cryptomount hd0,gpt6 # decrypt your encrypted partition
configfile (crypto0)/boot/grub/grub.cfg # tell grub the path to the now unecrypted config file
  1. 现在您应该获得具有适当启动项的 grub 菜单。
  2. 选择“Ubuntu”后,您应该进入 initramfs。
  3. 现在执行以下操作
cryptsetup luksOpen /dev/sda6 system
exit

选择

也许可以考虑使用下面的指南。它似乎可以解决上述问题。虽然我没有尝试过,所以我不能确定它是否有效。但可能值得研究。 https://cryptsetup-team.pages.debian.net/cryptsetup/encrypted-boot.html

PS 故障排除指南是根据记忆编写的,因此可能有一些缺失的部分。但我还是想写出来,因为它可能对某些人有帮助。但是,如果您发现某些内容缺失/不准确,请在评论中告诉我,以便我可以更新指南,谢谢。

答案4

从运行良好的 Ubuntu 16.04 开始,我成功实现了安装后根分区加密,根分区包含除 /boot 之外的所有内容。我将 /boot 放在单独的可移动 USB 上。值得注意的是,我在升级到 Ubuntu 18 之前就这样做了,并且升级在加密磁盘版本上运行良好。

加密不是“就地”完成的,这对我来说没问题,因为无论如何,在新的设置正常工作之前,我不想覆盖工作版本。

执行正确的程序非常简单快捷。(尽管由于我遵循了一些错误的线索,找出正确的程序非常耗时。)

大纲

  1. 创建一个实时 Linux USB 磁盘 - 启用持久性会很方便。在该实时 USB 磁盘上启动。
  2. 在空分区上创建 luks 加密卷组。(在我的情况下,它与原始 linux 位于同一磁盘上,但它可能是另一个磁盘。)在该加密分区上创建 /(根)和交换逻辑卷。就复制的 linux 而言,这些将充当虚拟分区。
  3. 将文件从旧根目录复制到新根目录。
  4. 设置并分区另一个 USB 作为可移动启动盘。
  5. 在新的根目录中设置一些文件,做一些魔术,然后 chroot 到新的根目录中,然后从 chroot 的新根环境中将 grub 安装到启动磁盘上。

细节

1-使用实时 Linux USB 磁盘启动-启用持久性会很方便。

使用 unetbootin 在 USB 上安装了 Ubuntu 16。GUI 允许指定“持久性”,但还需要另一个步骤才能使持久性正常工作 - 修改/boot/grub/grub.cfg以添加--- persistent如下内容:

menuentry "Try Ubuntu without installing" {
    set gfxpayload=keep
    linux   /casper/vmlinuz  file=/cdrom/preseed/ubuntu.seed boot=casper quiet splash --- persistent
    initrd  /casper/initrd
}

使用实时 USB 启动

2- 在空分区上创建 luks 加密卷组。在该加密分区上创建 /(根)并交换逻辑卷。

假设要加密的未使用的分区是/dev/nvme0n1p4

可选,如果您想隐藏加密和格式化之前分区上的旧数据,您可以随机擦除该分区。请参阅此处的讨论

dd if=/dev/urandom of=/dev/nvme0n1p4 bs=4096 status=progress

设置加密。

cryptsetup -y -v luksFormat /dev/nvme0n1p4

系统会要求您设置密码。

cryptsetup luksOpen /dev/nvme0n1p4 crypt1

系统会要求您输入密码。请注意,这crypt1是用户任意决定的名称。现在创建卷和格式。

pvcreate /dev/mapper/crypt1
vgcreate crypt1-vg /dev/mapper/crypt1

lvcreate -L 8G crypt1-vg -n swap
mkswap /dev/crypt1-vg/swap

lvcreate -l 100%FREE crypt1-vg -n root
mkfs.ext4 /dev/crypt1-vg/root

使用这些实用程序来查看卷并了解层次结构。

pvscan
vgscan
lvscan
ls -l /dev/mapper
ls -l /dev/crypt1

3-将文件从旧根目录复制到新根目录

mkdir /tmp/old-root 
mount /dev/ubuntu-vg/root /tmp/old-root/
mkdir /tmp/new-root
mount /dev/crypt1-vg/root /tmp/new-root/
cp -a /tmp/old-root/. /tmp/new-root/

umount /tmp/old-root
umount /tmp/new-root

cp -a ...以存档模式复制,保留所有文件模式和标志。

4-设置并分区另一个 USB 作为可移动启动盘。

我为此使用了 gparted。设置两个分区。第一个分区是vfat,第二个分区是ext2。每个分区都是 512 MB,你可以用更少的。假设设备是/dev/sdf

# The first partition: (will be /dev/sdf1)
Free space preceding (leave default value)
New size 512 MiB
Free space following (leave default value)
Create as: Primary Partition
Partition Name: (leave)
File System: fat32
Label: (leave)

# The second partition: (will be /dev/sdf2)
Free space preceding (leave default value)
New size 512 MiB
Free space following (leave default value)
Create as: Primary Partition
Partition Name: (leave)
File System: ext4
Label: (leave) 

5- 在新的根目录中设置一些文件,做一些魔术,然后 chroot 到新的根目录中,然后从 chroot 的新根环境中将 grub 安装到启动盘上。

找到一些 UUID 以供稍后使用。请注意以下命令的输出:

blkid /dev/sdf1
blkid /dev/sdf2
blkid /dev/nvme0n1p4

挂载根分区和启动分区

sudo mount /dev/mapper/crypt1--vg-root /mnt
sudo mount /dev/sdf2 /mnt/boot
sudo mount /dev/sdf1 /mnt/boot/efi

设置文件/mnt/etc/fstab

/dev/mapper/crypt1--vg-root /               ext4    errors=remount-ro 0       1
/dev/mapper/crypt1--vg-swap none    swap    sw              0       0
UUID=[uuid of /dev/sdf2] /boot           ext2    defaults        0       2
UUID=[uuid of /dev/sdf1]  /boot/efi       vfat    umask=0077      0       1

其中“[uuid of ...]”只是一个字母-数字-连字符的组合。

创建文件/mnt/etc/cryptab

# <target name> <source device>     <key file>  <options>
crypt1 UUID=[uuid of /dev/nvme0n1p4] none luks,discard,lvm=crypt1--vg-root

进入根目录环境需要一些魔法:

sudo mount --bind /dev /mnt/dev
sudo mount --bind /proc /mnt/proc
sudo mount --bind /sys /mnt/sys
chroot /mnt

现在使用以下命令设置启动 USB 磁盘grub

apt install --reinstall grub-efi-amd64
grub-install --efi-directory=/boot/efi --boot-directory=/boot --removable
update-initramfs -k all -c
update-grub

现在您应该能够使用新创建的 USB 启动盘重新启动并启动。

故障排除-

(A)必须连接网络才能执行该apt install --reinstall grub-efi-amd64命令。如果网络已连接但 DNS 失败,请尝试

echo "nameserver 8.8.8.8" | sudo tee /etc/resolv.conf > /dev/null

(二)在调用 之前initramfs,原始 linux 中使用的当前vmlinuz...文件必须存在于新的根目录中。如果不存在,则找到它并将其放在那里。

(C)grub-install命令默认会搜索它能找到的所有其他 Linux 磁盘,即使它们没有被mount激活,也会将它们放入新启动 USB 上的启动菜单中。通常这是不希望的,因此可以通过将此行添加到来避免/boot/default/grub.cfg

GRUB_DISABLE_OS_PROBER=true

笔记: 可以将包含加密密钥的文本文件添加到可移动启动 USB。

相关内容