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