通用第二因素

出自 ArchWiki

通用第二因素 (U2F) 是一种开放标准,它使用基于智能卡中类似安全技术的专用 USB 或 NFC 设备,加强和简化双因素身份验证 (2FA)。

虽然最初由 Google 和 Yubico 开发,并得到恩智浦半导体的贡献,但该标准现在由 FIDO 联盟托管。

有关 U2F 和 U2F 设备的所有文章,请参阅:Category:Universal 2nd Factor

WebAuthn 是一个更新的标准。

网站身份验证

U2F 受到 Google、Facebook、Twitter 或 GitHub 等主要网站的支持。查看 2fa.directorydongleauth.com 以查找其他网站和设置文档的链接。对于所有支持它的浏览器,可能只需要安装 libfido2。Yubico 提供了一个 演示页面 用于测试。

Firefox

Firefox/Tweaks#Fido U2F 身份验证

Chromium/Chrome

Chromium/技巧和窍门#U2F 身份验证

用户会话身份验证

创建 YubiKey 的公司 Yubico 开发了一个 U2F PAM 模块。它可以用作登录期间的第二因素,或完全取代对密码的需求。

注意: 尽管本文档中提到了 Yubico/YubiKey,但 pam-u2f 也应支持任何 U2F 和/或 FIDO2 兼容的密钥。

安装 PAM 模块

该模块是软件包 pam-u2f 的一部分。

添加密钥

注意: 以下文件夹名称是默认位置。对于单用户实现,可以通过将文件移动到您首选的目录,并在 pam_u2f.so 行的末尾附加 authfile=/path/to/u2f_keys 来更改它。如果您希望将 u2f_keys 移动到文件系统的受保护部分,这也很有用。对于多用户实现,请使用 pam-u2f 官方文档 中解释的中央映射文件。

密钥需要使用工具 pamu2fcfg 添加

$ mkdir ~/.config/Yubico
$ pamu2fcfg -o pam://hostname -i pam://hostname > ~/.config/Yubico/u2f_keys

输入 PIN 后,单击 U2F 密钥上的按钮以确认密钥。

注意: 如果您的系统的主机名发生更改,例如由于不同网络中的 DHCP,您将无法登录。为了防止这种情况,建议指定上述选项,并将 hostname 替换为实际主机名。

如果您拥有多个密钥,请使用以下命令附加下一个密钥

$ pamu2fcfg -o pam://hostname -i pam://hostname -n >> ~/.config/Yubico/u2f_keys
注意: 上述命令中的 -n 是必需的。它将省略为同一用户的后续条目规范中要求的生成的条目的用户名部分。具有相同用户名的多个条目将导致 PAM 中不可预测的行为。此外,请勿手动添加换行符。文件 u2f_keys 必须只有一行。[1]

无密码 sudo

警告: 在对配置进行任何更改之前,请启动一个具有 root 权限的单独 shell(例如 sudo -s)。这样,如果出现问题,您可以恢复任何更改。

添加

/etc/pam.d/sudo
auth            sufficient      pam_u2f.so cue origin=pam://hostname appid=pam://hostname

作为第一行。请务必替换上面提到的 hostname。然后创建一个新终端并键入 sudo ls。您的密钥的 LED 应该闪烁,单击后命令将被执行。选项 cue 设置为提供要执行的操作的指示,即 Please touch the device

为了使令牌成为 sudo 的唯一方法(即,没有密码回退),您需要注释掉存在的其他身份验证方法。这通常只是默认的 system-auth include。

/etc/pam.d/sudo
#auth           include         system-auth

您还应该将上面 pam_u2f.so 行中的 sufficient 更改为 required

警告: 这将意味着系统上没有配置 U2F 令牌的用户将无法使用 sudo。

GDM 登录

添加

/etc/pam.d/gdm-password
auth            required      pam_u2f.so nouserok origin=pam://hostname appid=pam://hostname

在现有的 auth 行之后。请注意 nouserok 选项的使用,如果用户未配置密钥,则允许规则失败。这样,支持只有部分用户使用 U2F 密钥的多用户设置。

注意: 此方法不适用于加密的 home 分区,因为解密不是在登录过程完成之前完成的,因此 u2f_keys 文件不可用。在这种情况下,请使用 pam-u2f 官方文档 中解释的中央映射文件。

一些可以执行 U2F / PAM 的多功能安全密钥(例如 Trezor Model T)可能不会在系统启动时声明该功能,这在 CTAP 2.0 规范[2]之外是有意的。如果存在多个 U2F 密钥,则在使用 GDM 时可能会导致两分钟的延迟,因为 pam-u2f 会执行顺序查找,并且会等待(Trezor)设备超时,然后再提供辅助 U2F 密钥的存在/触摸 [3]。您可以尝试添加 nodetect 选项以及 debug,并在 GDM 加载之前完成任何设备特定的登录(例如屏幕 PIN)。

SDDM/KDE

SDDM 似乎不支持 pam_u2f 进行初始用户登录。自动登录 可以改为使用,然后编辑 /etc/pam.d/kde 以仅控制屏幕锁定。

如果您正在使用带有生物识别身份验证的 U2F 密钥(例如 Yubikey Bio)并想要 1FA,请使用 /etc/pam.d/kde-fingerprint,注释掉 pam_fprintd.so 行,并将您的更改放在其位置。这避免了在身份验证后显示不必要的“解锁”按钮,而是立即解锁[4]

例如

/etc/pam.d/kde-fingerprint
#%PAM-1.0

auth       required                    pam_shells.so
auth       requisite                   pam_nologin.so
auth       requisite                   pam_faillock.so      preauth

# take over fprintd for u2f since yubikey bio is a fingerprint reader and bypasses kscreenlocker's "unlock" button
#-auth      required                    pam_fprintd.so
auth required pam_u2f.so cue pinverification=0 userverification=1

auth       optional                    pam_permit.so
auth       required                    pam_env.so

account    include                     system-local-login

password   required                    pam_deny.so

session    include                     system-local-login


警告: 不要在 /etc/pam.d/kde-fingerprint 中使用 auth sufficient,就像您在其他 PAM 配置文件中可能做的那样。这将导致身份验证尝试失败时绕过锁屏。

其他身份验证方法

为其他服务启用 PAM 模块,如上所述。例如,为了保护 Cinnamon 的屏幕保护程序,请编辑 /etc/pam.d/cinnamon-screensaver

对于 Polkit,将默认配置从 /usr/lib/pam.d/polkit-1 复制到 /etc/pam.d/polkit-1 并在那里进行更改。

故障排除

如果您设法将自己锁定在系统之外,请启动到恢复模式或从 USB 驱动器启动。然后恢复 PAM 配置中的更改并重新启动。

如果 pam-u2f 模块静默失败,请将 debug 关键字添加到 /etc/pam.d/ 中文件的 auth 行。

OpenSSH

OpenSSH ≥8.2 原生支持 FIDO/U2F 硬件令牌,请参阅 SSH 密钥#FIDO/U2F

使用 LUKS 进行静态数据加密

本文或本节是移动到 systemd-cryptenroll 的候选对象。

注意: systemd-cryptenroll 支持的功能不仅仅是 FIDO。(在 Talk:Trusted Platform Module#move systemd-cryptenroll to separate article 中讨论)

自 248 版本起,systemd 可以用于使用 FIDO2 密钥解锁 LUKS 分区

首先,您需要设置您的 /etc/crypttab 文件(见下文),或者如果您希望解锁您的根分区,请自定义您的 initramfs。完整过程类似于使用 TPM 芯片进行解锁。请参阅 systemd-cryptenroll#Trusted Platform Module

要注册密钥,您需要使用 systemd-cryptenroll 实用程序。首先,运行以下命令以列出您检测到的密钥

$ systemd-cryptenroll --fido2-device=list

然后,您可以在 LUKS 插槽中注册密钥,指定 auto 值(或 FIDO2 设备的路径,例如 /dev/hidrawX,如果您有多个密钥)

$ systemd-cryptenroll --fido2-device=auto /dev/sdX

非 root 分区

对于非 root 数据分区,crypttab 看起来像这样

/etc/crypttab
data /dev/sdX none fido2-device=auto

如果您的加密分区是 LVM 下管理的逻辑卷,这也应该有效

/etc/crypttab
data /dev/vg1/data none fido2-device=auto