在Systemd 248上使用TPM2,FIDO2,PKCS#11安全性硬件解锁LUKS2卷

2021-01-22 02:49:54

TL; DR:现在可以轻松地使用FIDO2安全令牌(例如YubiKey或Nitrokey FIDO2)解锁LUKS2卷。 TPM2解锁现在也很容易。

博客是一项繁重的工作,其乐趣远少于黑客。因此,我主要关注后者,但是我不时地猜测东西太有趣了,以至于无法被关注。因此,这里终于有了另一个有关systemd令人兴奋的新功能的博客故事。

借助即将推出的systemd v248,systemd的systemd-cryptsetupup组件(负责在引导过程中组装加密卷)获得了对使用三种类型的安全硬件解锁加密存储的直接支持:

使用FIDO2安全令牌解锁(至少,使用实现hmac-secret扩展的令牌可以解锁)。即您的YubiKeys(系列5及更高版本)或Nitrokey FIDO2等。

使用PKCS#11安全令牌(即您的智能卡和较旧的YubiKeys(实现PIV的))解锁。 (严格来说,这已在较旧的systemd上得到了支持,但&man"则要多得多。)

为了完整性因此,请记住,该组件还允许使用以下更传统的机制进行解锁:

使用用户输入的密码进行交互解锁(即,大多数人可能已经部署了该密码,并一直受到支持)

通过磁盘上的密钥文件解锁(可选在启动时插入的可移动媒体上),从一开始就受到支持。

通过恢复密钥解锁。这些与常规密码几乎相同(并且实际上可以在要求密码的任何地方输入)–主要区别在于它们始终由计算机生成,因此保证了较高的熵,通常高于用户。选择的密码短语。即使在本地密钥映射配置不正确的情况下,它们也以易于键入的方式生成。 (v248的新功能)

在这个博客故事中,让我们集中讨论前三个项目,即那些与实现解锁的特定类型的硬件相关的项目。

为了简化使用安全令牌和TPM2的工作,已在systemd工具集中添加了一个新的小型工具:systemd-cryptenroll。这样做的唯一目的是使将安全令牌/选择码轻松注册到加密卷中的目的。它可与任何LUKS2卷配合使用,并将少量的元信息嵌入具有解锁操作所需参数的LUKS2标头中。

因此,让我们看一下这在FIDO2案例中如何组合在一起。如果您拥有这些精美的FIDO2令牌(需要实现hmac-secret扩展,如前所述)之一,则很可能要使用此令牌。假设您已经设置了LUKS2卷,并且以前使用简单的密码将其解锁。插入令牌,然后运行:

这会将密钥注册为解锁卷的另一种方式,并将所有必需的信息嵌入到LUKS2卷头中。在启动时使用此功能解锁卷之前,我们需要允许通过/ etc / crypttab解锁FIDO2。为此,在该文件中找到适合您的卷的正确条目,并按如下方式进行编辑:

用正确的卷名和下面的设备替换myvolume和/ dev / sda5。此处的关键是您需要添加到文件第四栏中的fido2-device = autooption。它告诉systemd-cryptsetup使用现在嵌入在LUKS2头中的FIDO2元数据,等待FIDO2令牌在引导时插入(利用systemd-udevd,…)并用其解锁卷。

请注意,所有这些都不会修改FIDO2令牌本身。此外,您可以根据需要在多个卷中注册相同的令牌。由于所有注册信息都存储在LUKS2标头中(而不是存储在令牌中),因此任何一个都没有界限。 (当然,可以确定每个卷的LUKS2键槽有上限,也就是说,每个卷注册的键不能超过一堆。)

现在,让我们仔细了解一下如何使用与PKCS#11兼容的安全令牌或智能卡。为此,您需要一种可以存储RSA密钥对的设备。我认为大多数实现PIV资格的安全令牌/智能卡。但是,您实际将密钥获取到设备上的方式可能有所不同。这是对实现PIV功能的任何YubiKey进行的操作:

#ykman piv reset#ykman piv generate-key -a RSA2048 9d pubkey.pem#ykman piv generate-certificate --subject" Knobelei" 9d pubkey.pem#rm pubkey.pem

(此命令链会删除之前存储在yourtoken的PIV功能中的内容,请小心!)

对于其他供应商提供的令牌/智能卡,可能会使用其他一系列命令。一旦有了密钥对,就可以使用LUKS2卷注册它,如下所示:

就像FIDO2情况下的相同命令调用一样,此方法会将安全令牌注册为解锁卷的另一种方式,您已经注册的任何密码短语仍会保留。

如果您拥有同时实现PKCS#11 PIV和FIDO2的安全令牌,则考虑到它是更现代的,面向未来的标准,则可能会将其注册为FIDO2设备。此外,它不需要特殊准备即可将RSA密钥带到设备上:FIDO2密钥通常可以正常工作。

如今,大多数现代(非预算)PC硬件(以及其他类型的硬件)都带有TPM2安全芯片。在许多方面,TPM2芯片是一种智能卡,可焊接到系统主板上。因此,与您通常的USB连接的安全令牌不同,您无法从PC上将其删除,这意味着它们解决了完全不同的安全方案:它们不能立即与您可以随身携带的用于打开某些门的物理密钥相提并论,但是它们是密钥您留在门口,但是除了您之外,其他任何人都不会拒绝。

尽管这听起来比FIDO2 / PKCS#11模型弱得多,但TPM2仍为保护系统带来了好处:因为如果您绑定了TPM2设备,则无法提取存储在TPM2设备中的加密密钥材料(至少是理论上的)。硬盘加密工具,这意味着攻击者不能只复制您的磁盘并离线分析它-他们总是也需要访问TPM2芯片才能获得必要的加密密钥。因此,他们仍然可以窃取您的整个PC并对其进行分析,但是如果您不注意并分析副本,他们将无法仅复制磁盘。

此外,您可以将解锁硬盘的功能绑定到特定的软件版本:例如,您可以说只有可信任的Fedora Linux可以解锁设备,但是任何黑客都不会从他们插入的USB闪存盘中启动任何任意操作系统。因此,如果您信任您的OS供应商,您可以将存储解锁与该供应商的OS一起委托给您的TPM2设备,因此可以合理地确保入侵者无法解密您的数据,除非他们既入侵了OSvendor并且窃取/破坏了您的TPM2芯片。

这看起来几乎和前面的两个sytemd-cryptenroll命令行一样简单-如果--tpm2-pcrs =部分不是。使用该选项,您可以指定要将注册绑定到哪些TPM2PCR。 TPM2 PCR是一组(通常为24个)哈希值,在启动过程中,每个配备TPM2的系统都以安全,可靠的方式从引导序列期间调用的所有软件中计算出这些值(这称为“测量”)。如果将解锁绑定到特定PCR的特定值,则您需要系统在启动时遵循相同的软件顺序才能重新获取磁盘加密密钥。听起来复杂吗?好吧,那是因为。

这部分再次变得很简单:tpm2-device =选项告诉systemd-cryptsetup使用LUKS2标头中的TPM2元数据并等待TPM2设备显示。

FIDO2,PKCS#11和TPM2安全令牌和芯片与恢复密钥配对很好:由于您不再需要每天输入密码,因此摆脱它很有意义,而是注册一个高熵恢复密钥,然后打印外出或扫描屏幕并存储安全的物理位置。即忘记良好的基于​​密码的解锁方式,而是去找FIDO2加恢复密钥吧!这是怎么做的:

这将生成一个密钥,将其注册到LUKS2卷中,在屏幕上向您显示,并生成您可以在屏幕外扫描的QR码(如果愿意)。该密钥具有最高的熵,可以在您可以输入任何密码短语的任何地方输入。因此,您不必修改/ etc / crypttab即可使恢复密钥起作用。

在所有这些方面仍有很大的改进空间。对于TPM2情况尤其如此:上面的文字并没有真正提到将加密的卷解锁绑定到特定的软件版本(即内核+ initrd + OS版本)实际上很困难:如果您天真地将系统更新为较新的版本,则可能无法访问到您的TPM2注册密钥(这很糟糕,毕竟您确实注册了一个恢复密钥-对吗?然后您就可以使用它来重新获得访问权限)。为解决此问题,必须与分布进行更多集成:每当他们升级系统时,都必须确保再次注册TPM2-PCR哈希必须与新版本匹配。而且,每当他们删除系统的旧版本时,都需要删除旧的TPM2注册。另外,TPM2也知道带符号的PCRhash值的概念。在这种模式下,发行版可能只发行了一组PCR签名,可以解锁TPM2密钥。 (但坦率地说,Idon并没有真正明白这一点:无论您是在每次系统更新时放入签名文件,还是在LUKS2header中注册一组新的PCR哈希值,都无济于事)。无论哪种方式,为了使TPM2注册更加顺利,都需要与发行版系统更新机制进行更多的集成。是的,由于操作系统更新的复杂性,上面的示例(我引用了您的TrustedFedora Linux)实际上并没有使用IRL(但还是希望如此)。最初注册后,什么也不会自动更新,因此,在第一次内核/初始更新之后,您必须一次又一次地手动重新注册…每次更新之后。

TPM2也可以用于其他类型的关键策略,我们以后也可能会考虑添加。例如,Windows使用TPM2填充来允许短(4位左右)" PINs"。用于解锁硬盘,即您输入的是一种低熵密码。之所以如此安全,是因为在这种情况下,PIN传递给了TPM2,这强制要求在一定时间内进行不超过一定数量的解锁尝试,并且在此之后多次尝试PIN完全无效。因此,使字典攻击更加困难(鉴于PIN的长度较短,通常会更容易)。

(顺便说一句:Yubico给我发送了两个YubiKeys进行测试,Nitrokey给了我一个NitrokeyFIDO2,谢谢!! —这就是为什么您在上面的文本中看到所有对YubiKey / Nitrokey设备的引用的原因:我必须对此硬件进行测试就是说,我还用我购买的aSoloKey测试了FIDO2的东西,它也可以正常工作。是的,您!,其他供应商!,可能正在阅读此书的人,也请免费将安全令牌发送给我,我可能还要和他们一起测试东西。尽管没有承诺,如果您愿意的话,我也不会退还给他们,对不起。