通用二次验证 (Universal 2nd Factor)
通用第二因素 (U2F) 是一种开放标准,它使用基于智能卡类似安全技术的专用 USB 或 NFC 设备来增强和简化双因素身份验证 (2FA)。
该标准最初由 Google 和 Yubico 开发,NXP Semiconductors 也做出了贡献,现在该标准由 FIDO Alliance 托管。
有关 U2F 和 U2F 设备的所有文章,请参阅:Category:Universal 2nd Factor。
WebAuthn 是一个较新的标准。
网站认证
Google、Facebook、Twitter 和 GitHub 等主要网站支持 U2F。请查看 2fa.directory 或 dongleauth.com 以查找其他网站和设置文档链接。对于所有支持它的浏览器,可能只需要安装 libfido2。Yubico 提供了一个 演示页面用于测试。
Firefox
Chromium/Chrome
Chromium/Tips and tricks#U2F 认证
用户会话认证
生产 YubiKey 的 Yubico 公司开发了一个 U2F PAM 模块。它可以作为登录时的第二因素,或者完全取代密码的需要。
安装 PAM 模块
该模块是 pam-u2f 包的一部分。
添加密钥
authfile=/path/to/u2f_keys 追加到 pam_u2f.so 行的末尾来更改。如果您希望将 u2f_keys 移动到文件系统的受保护部分,这也很有用。对于多用户实现,请使用中央映射文件,如 pam-u2f 的官方文档中所述。需要使用工具 pamu2fcfg 添加密钥
$ mkdir ~/.config/Yubico $ pamu2fcfg -i pam://hostname > ~/.config/Yubico/u2f_keys
输入 PIN 后,按下 U2F 密钥上的按钮以确认密钥。
hostname 替换为实际主机名。如果您拥有多个密钥,请使用以下方式添加后续密钥:
$ pamu2fcfg -i pam://hostname -n >> ~/.config/Yubico/u2f_keys
-n 是必需的。它将省略生成条目中的用户名部分,这对于同一用户的后续条目是必需的。具有相同用户名的多个条目将导致 PAM 行为不可预测。此外,请勿手动添加换行符。u2f_keys 文件必须只有一行。[1]无密码 sudo
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。
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 的官方文档中所述。一些多功能安全密钥(例如 Trezor Model T)可以执行 U2F / PAM,但在系统启动时可能不会宣告该功能,这是 CTAP 2.0 规范有意为之[2]。当与 GDM 一起使用时,如果有多个 U2F 密钥,这可能导致长达两分钟的延迟,因为 pam-u2f 会顺序查找并在提供第二个 U2F 密钥的出现/触摸之前等待(Trezor)设备超时[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 并在那里进行更改。
故障排除
如果您把自己锁在了系统外面,请启动到恢复模式或从 U 盘启动。然后撤销 PAM 配置中的更改并重新启动。
如果 pam-u2f 模块静默失败,请在 /etc/pam.d/ 中的文件里的 auth 行添加 debug 关键字。
OpenSSH
OpenSSH ≥8.2 原生支持 FIDO/U2F 硬件令牌,请参阅 SSH keys#FIDO/U2F。
数据加密(静止时)使用 LUKS
从 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