使用 FIDO U2F 安全密钥 Fedora Linux

FIDO U2F 安全密钥是一种基于 USB 和/或 NFC 的小型设备。 它是一个硬件安全令牌,带有用于许多安全相关用例的模块。 有多个品牌的 FIDO 兼容密钥,包括 NitroKey、SoloKey v2 和 YubiKey。 与 Yubico OTP 等专有协议相比,FIDO 是硬件令牌不可知论者,所使用的工具与制造商无关。

这篇文章介绍了 FIDO 协议,并展示了如何安装和启用 FIDO U2F 安全密钥作为登录终端、GDM 或进行身份验证的替代身份验证因素 sudo.

对于 YubiKeys,尤其是不支持 FIDO2/U2F 的旧款,请参阅上一篇标题为“如何使用 YubiKey 与 Fedora Linux”。

如何使用 YubiKey Fedora Linux

这篇文章不会涉及存储 OpenPGP 密钥或 X.509 证书,因为这些功能依赖于硬件,而不是 FIDO U2F 标准的一部分。

保留备份安全密钥

一旦开始使用安全令牌,您就必须考虑将自己锁定在与这些令牌相关的帐户之外的可能性。 由于硬件安全令牌是独一无二的,并且被设计成极难复制,因此您不能像使用 KeePass 或 AndOTP 等软件保管库那样对其进行备份。 因此,您使用主密钥进行的所有注册都应立即使用第二个备份密钥进行重复,您会将其存储在安全位置,甚至可能是保险箱。

实际上,这意味着您需要使用 Linux 和 Web 帐户注册硬件令牌,两次生成 OpenSSH 私钥,并将两个 OpenSSH 公钥上传到您使用的服务器和服务(例如 exampleGitHub).

如果您丢失了一个密钥,您将需要使用您的第二个密钥来登录密钥注册的每项服务,删除丢失的密钥,然后注册一个新密钥。 对于使用 FIDO2 协议的无密码登录尤其如此。

FIDO2、U2F 和 FIDO 联盟

FIDO2 是一个标准集合,由 FIDO联盟. FIDO 联盟希望最终完全摆脱密码,取而代之的是提供无需密码即可通过多种因素安全地验证用户身份的程序。

该标准由万维网联盟 (W3C) 的 Web 身份验证 (WebAuthn) 和 FIDO 联盟的客户端到身份验证器协议 (CTAP) 组成。 WebAuthn 是一个标准 API,用于请求和处理身份验证的公钥挑战。 有了这个,浏览器向客户端发送一个挑战,然后客户端产生一个带有私钥的响应,然后挑战者使用之前交换的公钥验证该私钥。 服务不知道如何生成质询答案,它由 CTAP 控制。 系统可能会提示用户使用多种验证方法,例如生物识别、PIN 或存在检查(或这些方法的某种组合)。 这些检查对于身份验证与在服务中注册密钥时相同。

用于保护与硬件令牌的任何交互的访问 PIN 是可选的,默认情况下未设置。 大多数密钥将在连续八次尝试输入访问 PIN 失败后自行失效。 恢复无效密钥和设置新 PIN 的唯一方法是重置密钥。 但是,当一个密钥被重置时,它所有的服务注册都将丢失!

FIDO2 密钥还支持 FIDO U2F 协议(现已更名为 CTAP1)。 该协议专为二次或多因素(但不是无密码)身份验证而设计。 Linux 的 PAM 身份验证系统也可以配置为使用 U2F 协议。 尽管 FIDO U2F 不是为无密码身份验证而设计的,但 U2F PAM 模块确实允许无密码身份验证。

安全隐患

FIDO2 / U2F 通过将安全密钥绑定到您的用户帐户来工作。 大多数键都有一个基本的存在检查,默认情况下启用/使用。 他们通常通过点亮并提示您触摸按键来执行存在检查。 FIDO2 PIN 是可选的,默认情况下将取消设置。 当注册密钥以登录到您的 Linux 帐户或使用 sudo, 物理存在设备和密钥就足够了。 FIDO2 PIN 是重要的附加验证步骤,可确保只有您可以使用密钥进行身份验证。

等待! 现在我必须跟踪一个额外的 PIN 码? 这不就是一个更短的密码吗?

有关读者

FIDO2 PIN 不是密码。 这是一个简短易记的短语。 这不是问题,因为:

  1. 您需要对密钥进行物理访问,并且需要知道 PIN。
  2. 连续 8 次输入 PIN 码失败将使密钥失效,这使得暴力破解变得困难。

相反,您现在可以使用不需要记住的存储在密码管理器中的安全密码。

谷歌 2016 年的案例研究,标题为“安全密钥:现代 Web 的实用密码第二因素”,显示安全密钥有效地保护用户免受密码重复使用、网络钓鱼和中间人攻击。

使用 PAM 进行用户身份验证

本地系统身份验证使用 可插拔认证模块 (PAM). U2F 设备(以及身份验证)的 PAM 模块是 pam_u2f。 您的密钥是否支持 FIDO2 或 FIDO U2F 将取决于其固件版本和硬件型号。

设置如下:

  1. 安装 PAM 模块。
  2. 使用您的用户帐户注册密钥。
  3. 使用 authselect 激活 PAM 中的智能卡支持。

授权选择 是一个用于配置具有可重现配置文件的 PAM 的工具。 通过使用 authselect 的配置文件,可以避免手动更改 /etc/pam.d 目录下的配置文件。

依赖关系

所需的软件包在官方存储库中可用。

[…]$ sudo dnf install pam-u2f pamu2fcfg fido2-tools

在您的密钥上设置 FIDO2 PIN

FIDO2 标准定义了用于访问保护的可选 PIN。 没有 PUK 或其他方法可以恢复丢失或无效的 PIN,因此请确保您有备用的身份验证方法。 如果通过顺序输入无效 PIN 使 PIN 失效,则唯一的恢复方法是重置密钥。 但是,重置您的密钥会删除其所有凭据并将其与所有先前注册的服务断开连接。

fido2-tools 包包含一个用于设置密钥的 FIDO2 PIN 的工具:fido2-token。 使用 fido2-token -L 获取当前连接的 FIDO2 设备列表,并使用 fido2-token -C 设置新的 pin:

[…]$ fido2-token -L
/dev/hidraw1: vendor=0x1050, product=0x0407 (Yubico YubiKey OTP+FIDO+CCID)
[…]$ fido2-token -C /dev/hidraw1
Enter current PIN for /dev/hidraw1: 
Enter new PIN for /dev/hidraw1:

使用您的本地帐户注册安全密钥

使用工具 pamu2fcfg 检索进入 ~/.config/Yubico/u2f_keys 的配置行。 pam_u2f 是 Yubico 提供的 U2F 密钥通用模块,因此是 Yubico 特定的默认配置路径。 此文件中的每个配置行都包含一个用户名和一个由冒号分隔的特定于密钥的凭证/配置部分。 确保每个用户只使用一行。

fedora-user:owBYtPIH2yzjlSQaRrVcxB...Pg==,es256,+presence+pin[:another key for this user]

如果密钥受 PIN 保护,您将被要求输入 PIN 以进行此操作。 使用以下内容进行第一个密钥的初始注册:

[…]$ mkdir -p ~/.config/Yubico
[…]$ pamu2fcfg --pin-verification > ~/.config/Yubico/u2f_keys

添加另一个键(对于 example,您的备份密钥)到此单用户配置,请使用以下命令:

[…]$ pamu2fcfg --nouser --pin-verification >> ~/.config/Yubico/u2f_keys

pam_u2f 还支持使用中央身份验证文件。 在这种情况下,请务必为每个用户使用一行,并将给定用户的所有密钥保持在同一行。 如果两行引用相同的用户名,则只会使用最后一个! 看看 pam_u2f 手册页 对于所有可用选项。

使用 authselect 配置 PAM

授权选择 是一个用于控制系统 PAM 配置的工具。 它引入了配置文件作为附加的抽象层。 一个 authselect 配置文件可以更改多个 PAM 配置文件。 配置文件具有控制其他功能和行为的参数,例如启用 FIDO U2F 安全密钥。 计划在以后的文章中详细介绍 authselect。

显示当前活动的 authselect 配置文件。 选择 SSSD(系统安全服务守护程序)配置文件并启用 U2F 支持后,输出可能类似于以下内容:

[…]$ authselect current
Profile ID: sssd
Enabled features:
- with-pam-u2f

使用带有 with-pam-u2f 标志的 authselect 在 PAM 中激活 FIDO U2F 支持:

[…]$ sudo authselect select sssd with-pam-u2f

如果您还想使用指纹读取器,则必须启用这两个功能:

[…]$ sudo authselect select sssd with-pam-u2f with-fingerprint

这会激活带有 pam_u2f 和指纹读取器支持的 sssd 配置文件。 为了 example使用时 sudo 在具有上述 authselect 配置文件配置的终端上,首先会要求您提供指纹,如果 U2F 密钥失败。 但是,GDM 将首先使用 U2F 密钥。

解锁 GNOME 密钥环守护进程

使用生物识别、U2F 密钥或任何其他不需要密码登录 GNOME 的方法时,无法自动解锁登录密钥环。 这是因为,默认情况下,密钥环密码设置为与您的登录密码相同的值。 通常,PAM 将您的登录密码传递给密钥环守护程序。 由于您在通过生物识别或 U2F 密钥等方法进行身份验证时没有输入密码,因此 PAM 没有密码可以传递给密钥环守护程序。 这个问题没有直接的解决方案。

如果您对主分区使用 LUKS 加密并运行单用户系统,则可以从密钥环中删除密码。 这将使您的 gnome 密钥环在文件级别未加密。 但它仍将由 LUKS 在块级别进行加密。 LUKS 加密等同于单用户系统上默认的基于文件的密钥环加密,因为密钥环的加密只是为了保护其内容不被离线访问而设计的。 密钥环将在以任何一种方式登录后被解密/解锁,并且任何运行时应用程序或恶意软件都可能在解锁后访问密钥环的内容。 由于 LUKS 也是一种离线保护机制,因此它可以被视为密钥环的普通基于文件的加密的等效替代方案。

如果您的系统由多个用户使用,则 LUKS 加密和密钥环的普通基于文件的加密是不等价的。 在密钥环仅受 LUKS 保护的多用户系统的情况下,任何有权解密磁盘和启动系统的用户都将能够访问同一系统上任何其他用户的密钥环。

删除 GNOME 登录密钥环密码非常简单。 只需设置一个新的空密码,密钥环就会被解锁,它将在文件级别未加密存储。 图形实用程序 seahorse(也称为密码和密钥)可用于在 GNOME 登录密钥环上设置空白密码。

Lookout 和其他用例

即将发布的文章将探索如何使用 FIDO2/U2F 密钥通过 U2F Dracut 插件解锁 LUKS 加密的磁盘。

OpenSSH 8.2+ 支持使用 ed25519-sk 安全密钥。 这个主题已经在之前的文章“如何使用 YubiKey 与 Fedora Linux”。

请注意,FIDO2/U2F 是一种身份验证标准。 安全令牌(主要由 Yubico 建立)还有其他用例,如 (T)OTP、PIV(用于 x509 密钥管理)或 OpenPGP,这些用例并未在一般情况下涵盖,而是在逐个硬件的基础上进行介绍。