通用第二因素

出自 ArchWiki
(重定向自 U2F)

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

该标准最初由 Google 和 Yubico 开发,并得到 NXP Semiconductors 的贡献,现在由 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/Tips and tricks#U2F 身份验证

用户会话身份验证

Yubico 是 YubiKey 的创建公司,它开发了一个 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 包含。

/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 密钥。

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

某些可以执行 U2F / PAM 的多功能安全密钥(例如 Trezor Model T)可能不会在系统启动时通告该功能,这在 CTAP 2.0 规范[2]之外是有意为之的。当存在多个 U2F 密钥时,这可能会导致与 GDM 一起使用时出现两分钟的延迟,因为 pam-u2f 会执行顺序查找,并将等待(Trezor)设备超时,然后再提供辅助 U2F 密钥 [3] 的存在/触摸。您可以尝试在 debug 旁边添加 nodetect 选项,并在 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


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

其他身份验证方法

为其他服务启用 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 keys#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

非根分区

对于非根数据分区,crypttab 将如下所示

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

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

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