看起来两个主要的 LUKS 加密选项是:
- USB 密钥文件(请参阅https://superuser.com/questions/149578/how-can-i-use-a-keyfile-on-a-removable-usb-drive-for-my-encrypted-root-in-debian)
- 输入密码
这两者都有弱点。第一个可以通过窃取 USB 驱动器来克服。在第二种情况下,可以使用键盘记录器,或者我可能被迫交出密码。
是否有可能创建一个需要这两个选项的加密方案?然后,如果我被要求提供密码,我就可以销毁 USB 驱动器(例如在炉灶上烧掉它);相反,如果有人偷了我的 USB 驱动器,他们也需要获取我的密码。
看来现有的 LUKS 钥匙槽想法是为任何钥匙槽将解锁设备,而不需要提供钥匙全部,或者说“3个中的2个”密钥槽(iirc,后者可以使用伽罗瓦域以加密安全的方式来完成)。
(另外,我碰巧使用的是 OpenSuSE 系统,因此请保留与发行版无关的答案或可以在 SuSE 上运行的答案。)
答案1
我不认为这样的东西是现成的,但它应该是可能的。我给大家整理一些参考资料。
首先是 /etc/crypttab - 通常您在第三个插槽中指定密钥文件或密码,但某些发行版允许您在第四个字段中指定一个名为的选项keyscript
(debian 和 opensuse 支持此功能:http://linux.frank4dd.com/en/man5/crypttab.htm)。该脚本(必须位于“/lib/cryptsetup/scripts”iirc 中)可以使用第三个字段(通常只是密钥文件或密码)作为参数。 keyscript 的工作是将实际的解密密钥发送到 stdout,然后 cryptsetup 以正常方式将其用作 luks 密钥。
其次,您可能需要编写关键脚本。netkeyscript
(在 github 中)是一个在 UDP 多播套接字上侦听密码的 keyscript 示例;这是自定义按键脚本的另一个更详细的示例,完整的实现如下sh
:http://wejn.org/how-to-make-passwordless-cryptsetup.html。如何编写关键脚本(我将其称为multifactor
),我将作为练习留给您;)
三是秘密分裂。您可以使用名为“ssss”的开源工具(谷歌搜索“ssss-split”)以您描述的方式拆分 luks 密码。假设您将其分成 3 部分(a、b、c)并需要其中的任意 2 部分。将“a”存储在 USB 驱动器上,将“b”存储在保管库中,将“c”存储在计算机上(未加密的分区)或其他任何位置。当然,您不希望“c”被暴露,因此使用您可以记住的密码短语使用您选择的方案对其进行加密,并将该密码短语称为“ ”,并且磁盘上的c0
加密“ ”是“ ”。现在你的 crypttab 看起来像这样c
c'
root /dev/disk/<blah blah> /dev/<usb>:/path/to/a+$/dev/<blah>:/path/to/c' keyscript=multifactor
当然,第三个字段实际上将取决于您的键盘脚本愿意接受的内容
理想情况下,密钥脚本应该能够确定它需要您的输入来解密一个或多个密钥(例如:在本例中为c'
-> c
),但您可以根据需要使用第三个字段来指定。在上面的示例中,我使用了行距$
来表示这一点。
我不确定是否可以让键盘脚本提示输入(可能在 stderr 上),因为 stdout 上的任何输出都被视为 luks 密码。如果有一个明智的后备方案那就太好了。
不管怎样,祝你好运,黑客快乐:)
答案2
简短回答:不。
您可以在不同的插槽中拥有多个密钥,但这与您的问题无关。
为了安全起见,我维护了 ramdisk 的校验和,并且 cryptsetup 是静态链接的,并且每次启动时都会自动检查它们。
更新
校验和存储在加密的 FS 上,在挂载该分区之前您无法修改它。
也就是说,除非您被远程利用或者您的二进制程序(例如 rootfs 上的 ramdisk/cryptsetup)被修改,否则是安全的。 (顺便说一句:我的 rootfs 是加密的,只有内核/ramdisk 是裸露的,这就是为什么我只检查它们,但要为缓慢的 CPU/HDD 加载速度做好准备)
答案3
和卢克斯2和系统 v248(从 2021 年 3 月起)您可以使用FIDO2USB 硬件安全令牌多重身份验证(外交部)。您必须插入安全令牌设备(您拥有的东西)并输入设备 PIN(您知道的东西)才能解锁。虽然 PIN 可能会被记录(如密码),但安全密钥无法被复制(与 U 盘/密钥文件不同)——尽管它可能被盗(如 U 盘)。
设备在插入/连接/被盗时可能具有针对 PIN 暴力攻击的保护;重置至少需要不同的管理 PIN。请注意,客户端 PIN 支持是可选的且特定于型号;物理上也是如此用户存在和设备上的用户验证特征。
使用systemd-cryptenroll
配置 LUKS2 卷键槽,特别是系统磁盘或其他始终连接的磁盘/etc/crypttab
。 FIDO2 密钥是据说很容易使用以此目的。还特别支持高熵“恢复”密码,这在安全令牌丢失(或在可怕的炉灶事故中被破坏)时可能会有所帮助,但除了很少使用之外,它还受到通用密码的影响缺点。
注意cryptsetup
依赖于systemd-fido2
令牌类型插件,该插件管理额外的 FIDO2 键槽元数据(调试示例)。默认情况下,该插件/库可能不可用,特别是在启动时initramfs
;在删除非 FIDO2 键槽之前,请注意创建(临时、外部)LUKS2 标头备份并验证设置。也可以看看/usr/lib/systemd/systemd-cryptsetup
。
奖金:自系统 v246(自2020年7月起),systemd 宿主$HOME
通过设备 PIN 启用对具有 FIDO2 安全令牌(与系统磁盘相同或不同)的各个 LUKS2 目录的支持。使用homectl
管理JSON 用户记录(与经典 UNIX 用户不同),主目录/磁盘,以及它们的加密密钥。这是更大的一部分致力于加密、不变性和可移植性等等。除此之外,这允许$HOME
直接从(特别是)LUKS2 加密的 USB 记忆棒存储和使用加密的便携式目录。