我已经问过一次有关 LUKS 解锁多个硬盘的问题Linux:LUKS 和多个硬盘驱动器。
现在我想知道如何安全存储用于自动解锁关联分区的密钥文件。
我的计划是(如果可能的话):
使用需要密码的 LUKS 加密小型 USB 驱动器
使用密码在启动时将其解锁为第一个驱动器
将其安装到给定的安装点,例如 /test (这可能吗?)
现在可以安全地读取密钥文件:/test/keyfile
使用密钥文件解锁其他驱动器,无需询问密码
Luks在其他驱动器解锁后立即关闭 USB 驱动器以确保一定程度的安全
照常自动挂载 /、/usr、/var 和其他挂载点
这可以吗?基本上,我将 LUKS 密钥文件存储在密码加密的 LUKS USB 驱动器上,该驱动器只要求输入一次密码,而所有其他驱动器都可以解锁,无需进一步操作。我不确定是否有某种方法可以使 USB 驱动器首先解锁,然后安装,然后其他驱动器才尝试访问密钥文件。此外,在自动化方面,我认为 /etc/fstab 和 /etc/crypttab 应该可以在安装其他驱动器之前访问,但如果整个 / 文件系统是 LUKS 加密的,则这是不可能的。
除非有可能完全手动配置 LUKS 的工作方式:
Luks打开 /dev/sdc1 usb_keyfile
mount /dev/mapper/usb_keyfile /keyfile (这可能吗?)
LuksOpen --keyfile /keyfile/key /dev/sda1 disk1
LuksOpen --keyfile /keyfile/key /dev/sdb1 disk2
Luks关闭 /dev/sdc1
基本上能够在加载所需模块后立即运行 shell 脚本并禁用自动 LUKS 密码提示。
其他细节
- 使用的发行版:Gentoo GNU/Linux (amd64) 或 Debian GNU/Linux (amd64),因为我想将此过程应用于多个安装
答案1
你的方法看起来不错。但有一些评论:
如果要加密 rootfs,则需要使用 initrd(拥有一些最小的未加密系统来处理加密分区)。
如果 USB 设备是可移动的,initrd 和内核都可以存储在 USB 上,以增强防篡改能力(假设您确保 USB 不会落入未经授权的手中)——这通常就是加密 rootfs 的原因。一旦内核和 initrd 都位于可移动介质上,您只需删除介质即可确保没有人从正在运行的系统更改内核(或 initrd)。
如果您想将其安装在服务器内,这当然不是一个选择,但问题又是拥有这样一个设备而不是在其中一个硬盘驱动器上使用小分区是否有意义。例如,如果机器中的所有驱动器都处于 RAID 中,则可能也希望将 rootfs 放在 USB 上。顺便说一句,内部连接的 USB 闪存设备的一个有趣的替代方案是通过适配器连接到 ATA 接口的 CompactFlash 卡。
有些发行版为加密根提供了准备好的解决方案,有些则没有 - 但主要是在尝试挂载“真实”根之前在 initrd 脚本中放入几行代码的问题(例如,请参阅 的手册页
pivot_root
,通常在第 2 节中( syscall)和 8(bonary),如果您不熟悉该过程)。请记住备份密钥和密码,以防您的 USB 驱动器损坏。 LUKS 在损坏其标头时采用了相当片面的方法 - 一旦其标头的单个扇区(更准确地说是键槽)死亡,您就无法安装它。这是为了确保擦除标头不会受到设备本身执行的块重新分配的有效阻碍(因为这是基于闪存的设备经常做的事情)——密钥分布在整个密钥插槽上,并且需要所有重建它的数据 - 没有冗余。看克莱门斯·弗鲁沃斯的网站进行更深入的讨论。
也就是说,也许 USB 上的简单加密设备就足够了(查看 参考资料
PLAIN MODE
中的部分man cryptsetup
)。或者使用例如加密的文件openssl enc
。甚至对于加密分区本身来说,前者实际上也可能是一种选择。