我安装了全新的 11.04 系统,并使用 LUKS 设置了全盘加密。起初,它要求我输入三个加密分区的密码:
/
/home
swap
输入三次密码短语很烦人,所以我尝试设置 /home 和 swap 以从存储在 / 上的密钥文件解密。我创建了密钥文件并在两个分区上启用了它。我的 crypttab 现在如下所示:
root-root_crypt UUID=13c21bf6-4d92-42a7-877a-87cc31b1aa19 none luks
home-home_crypt UUID=ba90ce5b-9df7-4764-8a72-011bbb164db4 /root/keyfile luks
home-home_crypt UUID=ba90ce5b-9df7-4764-8a72-011bbb164db4 none luks
sda3_crypt UUID=e4677895-2114-4054-9f23-d36f6bb0e6a2 /root/keyfile luks,swap
这对于 /home 来说很有效,它会自动挂载而无需输入密码。但是 cryptsetup 仍然要求输入交换空间的密码。我甚至尝试将 noauto 添加到交换空间,这样它就根本不需要设置了——一旦系统启动,我就可以启用它而不需要密码,所以我想只需添加一个后期初始化脚本就可以做到这一点,但即使没有自动,cryptsetup 仍然会要求输入密码。
谢谢!
答案1
有同样的问题,以下是我在 ubuntu 12.04.1 和 12.10 上的做法,
--开始之前请确保您有备份,并且可以使用 ubuntu cd 或 usb 启动系统;如果您犯了一个错误,您的系统可能无法再启动,或者您可能会丢失数据。我假设您有一个使用 LUKS 加密的 ubuntu 系统,在 LUKS 里面您有 3 个分区,SYSTEM-BOOT(未加密)、SYSTEM-SWAP(加密)和 SYSTEM-OS(加密)--
您需要根据系统上使用的变体调整 UUID、SYSTEM-SWAP_crypt、SYSTEM-OS_crypt、SYSTEM-SWAP、SYSTEM-OS,请参阅我的解决方案下方的参考链接以获取更多信息
获取 UUID:
blkid
准备 >
swapoff /dev/mapper/SYSTEM-SWAP_crypt
cryptsetup luksClose SYSTEM-SWAP_crypt
告诉 cryptsetup 从保存根文件系统的卷的解密密钥计算交换分区的密码 >
/lib/cryptsetup/scripts/decrypt_derived SYSTEM-OS_crypt | cryptsetup luksFormat /dev/mapper/SYSTEM-SWAP --key-file -
/lib/cryptsetup/scripts/decrypt_derived SYSTEM-OS_crypt | cryptsetup luksOpen /dev/mapper/SYSTEM-SWAP SYSTEM-SWAP_crypt --key-file -
mkswap /dev/mapper/SYSTEM-SWAP_crypt
告诉系统有关交换分区的信息,编辑 crypttab>
nano /etc/crypttab
=? 确保两行匹配
SYSTEM-OS_crypt UUID=uuid-of-luks-containing-osroot none luks
SYSTEM-SWAP_crypt UUID=uuid-of-luks-containing-swap SYSTEM-OS_crypt luks,keyscript=/lib/cryptsetup/scripts/decrypt_derived
告诉系统有关交换分区的信息,编辑 fstab>
nano /etc/fstab
=? 确保你有这行
/dev/mapper/SYSTEM-SWAP_crypt swap swap sw 0 0
告诉系统有关交换分区的信息,编辑简历>
nano /etc/initramfs-tools/conf.d/resume
=? 确保你有这行
RESUME=UUID=uuid-of-encrypted-swap-SYSTEM-SWAP_crypt
更新启动分区上的 initramfs >
update-initramfs -u -k all
参考
答案受到以下启发设置加密的 Debian 系统(存档链接):
如果您使用的是加密的 Debian 系统,您可能需要满足一些安全要求。如果是这种情况,您还必须使用加密的交换分区。
交换分区可以通过两种方式加密:
- 每次启动时都可以使用随机密码重新创建,或者
- 它可以像其他加密卷一样使用永久密码创建
如果您想使用挂起到磁盘,则不能使用第一种方法,因为它会覆盖存储在交换分区中的内存占用。此外,您不能像其他分区一样使用密钥文件,因为在恢复过程启动并需要读取解密的交换分区时,根文件系统尚未(也不应该)挂载。
我解决这个问题的方法是告诉 cryptsetup 从保存根文件系统的卷的解密密钥计算交换分区的密码;cryptsetup 包使用 实现此功能
/lib/cryptsetup/scripts/decrypt_derived
。因此,要设置交换分区,我执行以下操作,假设hda2
是保存加密交换的分区,并且根文件系统位于hda5_crypt
:
swapoff /dev/mapper/hda2_crypt
cryptsetup luksClose hda2_crypt
dd if=/dev/urandom of=/dev/hda2
/lib/cryptsetup/scripts/decrypt_derived hda5_crypt \
| cryptsetup luksFormat /dev/hda2 --key-file -
/lib/cryptsetup/scripts/decrypt_derived hda5_crypt \
| cryptsetup luksOpen /dev/hda2 hda2_crypt --key-file -
mkswap /dev/mapper/hda2_crypt
为了告诉系统这个交换分区,我们需要将其添加到
/etc/crypttab
并/etc/fstab
;确保这些文件包含如下行:
/etc/crypttab:
hda2_crypt /dev/hda2 hda5_crypt luks,keyscript=/lib/cryptsetup/scripts/decrypt_derived
/etc/fstab:
/dev/mapper/hda2_crypt swap swap sw 0 0
有了这些,只要您将系统配置为挂起到磁盘,交换分区就会在启动序列的早期自动与根文件系统一起设置。要确定此时哪个交换分区可用,cryptsetup 将检查以下内容:asfasfafs - 类似中的一行
RESUME=/dev/mapper/hda2_crypt
-/etc/initramfs-tools/conf.d/resume
中的恢复设备设置/etc/uswsusp.conf
(请参阅uswsusp.conf(5)
) - 中的条目/etc/suspend.conf
-resume=/dev/mapper/hda2_crypt
内核命令行中的
/usr/share/initramfs-tools/hooks/cryptroot
如果您想了解更多相关信息,可以进行检查。
答案2
这可能表示在启动过程中正在访问交换分区initramfs
。此时根文件系统尚未挂载,因此存储在那里的任何配置文件都不可见。
虽然交换空间是在根文件系统之后安装的,但初始化过程访问交换空间是有原因的initramfs
:当您休眠计算机时,内存和系统状态的内容将写入交换空间。为了从休眠状态恢复,需要检查交换空间是否包含需要密码的休眠映像。
如果您不介意失去从休眠状态恢复的能力,您可以通过编辑/etc/initramfs-tools/conf.d/resume
并注释掉以 开头的行来禁用此行为RESUME=
。进行更改后,运行update-initramfs -u
以更新initramfs
图像。