Mr.*_*ann 12 encryption partitioning luks
在我的 Ubuntu 分区上设置 LUKS 加密的过程中,我遇到--type luks2了 cryptsetup 手册页中的选项。从我读到的内容来看,似乎没有任何理由不使用 LUKS2,但 cryptsetup 默认情况下仍然使用 LUKS1。
有什么理由我不应该使用 LUKS2?
谢谢。
LUKS2 是用于磁盘加密管理的 Linux 统一密钥设置的第二个版本。它是 LUKS1 [1, 2] 格式的后续版本,它扩展了磁盘格式的功能并消除了一些已知问题和限制。LUKS1 的大部分基本概念都保留在硬盘加密新方法2 中的设计中克莱门斯·弗鲁沃斯 (Clemens Fruhwirth)。LUKS 在磁盘的专用区域提供通用密钥存储,能够使用多个密码 1 来解锁存储的密钥。LUKS2 扩展了这一概念,以提供更灵活的元数据存储方式、冗余信息以在元数据区域损坏的情况下提供恢复,以及存储外部管理的元数据以与其他工具集成的接口。虽然 LUKS2 的实现旨在与基于 Linux 的 dm-crypt 3磁盘加密一起使用,但它是一种通用格式
基本上,虽然它已经可用,但根据用户/定义标准,它是一种相当完善的格式。进一步引用 2.0.0 版本的 cryptsetup 官方发行说明,仅在 6 个月前(重点是我的):
Cryptsetup 2.0.0 发行说明
具有实验性功能的稳定版本。
此版本引入了新的磁盘 LUKS2 格式。
传统的 LUKS(称为 LUKS1)以及传统且完全向后兼容的格式将永远得到完全支持。
注意:此版本更改了 libcryptsetup 库的 soname 并增加了所有公共符号的主要版本。大多数旧功能完全向后兼容,因此只需重新编译程序即可。
请注意,经过身份验证的磁盘加密、非加密数据完整性保护 (dm-integrity)、使用 Argon2 基于密码的密钥派生函数和 LUKS2 磁盘格式本身是新功能,可能包含一些错误。
为了提供认证加密的所有安全特性,我们需要在内核中使用更好的抗随机数重用算法(见下面的注释)。现在,请使用经过身份验证的加密作为实验性功能。
请不要在没有正确配置备份的情况下或在 需要与旧系统兼容的生产系统中使用 LUKS2 。
因此,除非您需要其中一项新功能,否则最好和最安全的选择是使用默认/稳定的LUKS1。另一方面,如果您不介意进行一些测试或设置问题,您可以使用LUKS2选项并将您发现的任何问题报告给cryptsetup 问题跟踪器。
您绝对应该尽可能使用 LUKS2。它是较新的标头格式,克服了(传统)LUKS1 标头的限制。这是自 cryptsetup 2.1 版以来的默认设置,但仅此而已并不能说明太多。在基于口令的密钥导出函数(PBKDF)是很大的变化。
如果您使用 PBKDF2 算法,那么您是否拥有 LUKS1 或 LUKS2 标头并不重要(即使 LUKS2 更具弹性,因为它具有关键数据的备份副本)。cryptsetup 2.0 版引入的较新的 Argon2i 或 Argon2id 算法占用更多空间,这就是 Argon2 不适合较小的 LUKS1 标头的原因。
此外,Argon2,因为它是一种较新的算法,可能比 PBKDF2 更安全,但它的代价是更多的内存 (RAM) 消耗以及需要 LUKS2 标头。
从cryptsetup.8联机帮助页:
对于 PBKDF2,仅适用时间成本(迭代次数)。对于 Argon2i/id,还有内存开销(密钥派生过程中需要的内存)和并行成本(密钥派生过程中并行运行的线程数)。
由于 cryptsetup 2.1 默认为更大的 LUKS2 标头,因此它似乎也默认为 Argon2i 而不是 PBKDF2。我最近在我的 Debian Linux 上手动创建了一个 LUKS 分区,当前稳定版本为 10.4(在撰写本文时;当我创建 LUKS 分区时可能是 10.2 或 10.3),并且它被设置为带有 Argon2i 的 LUKS2。
问题是 GRUB2 在大多数发行版上不支持 LUKS2(在撰写本文时),因此默认安装将(必须)默认为 LUKS1,至少在 /boot 受到影响的情况下,否则无法启动。有这个指南关于如何在 Debian 10“Buster”上正确执行此操作。Ubuntu 最初是基于 Debian 的,所以它可能是类似的。诀窍是有一个单独的 LUKS 分区,它自己有一个 /boot 分区,然后将该分区转换回 LUKS1 以便 GRUB2 找到 Linux 内核和 initramfs。或者,如果根分区包含 /boot 并且是 LUKS2,则可以将其整体转换回 LUKS1。在这两种情况下,最好为一个额外的 LUKS 密钥槽添加一个密钥文件并将此密钥文件复制到 initramfs(或配置 initramfs 以查找密钥文件)。GRUB2 会要求输入 /boot 的密码,但是在引导内核和 initramfs 时,必须再次输入密码 - 如果 /boot 位于根分区(或其他密码),则必须再次输入同一分区的密码为了 /,如果它与 /boot 分区不同)。如果 initramfs 使用密钥文件,则可以避免这种情况,该文件无论如何都安全地存储在加密的 /boot 上。
同样值得注意的是:2020 年 1 月,GRUB2获得了一个补丁,现在能够处理 LUKS2 标头,但只能使用传统的 PBKDF2 算法。这里有两个问题。首先是这样的补丁进入发布版本需要时间,甚至需要更多时间才能分发。例如,Debain 10.4(稳定分支)仍然有一个旧版本的 GRUB2,它无法处理 LUKS2。其次,即使使用提到的初始 LUKS2 补丁,GRUB2 也不支持 Argon2。
如果您要创建一个 LUKS2 /boot 分区,它很可能会默认为 Argon2i。对于 /boot,您必须在--pbkdf pbkdf2为 GRUB2(使用 LUKS2-patch)创建新的密钥槽时指定才能使其工作。
cryptsetup luksAddKey --pbkdf pbkdf2 /dev/<device>
我强烈建议阅读Arch Wiki页面以获取有关如何使用 cryptsetup 和 LUKS 卷的更多信息。