通用二次验证 (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
Firefox/Tweaks#Fido U2F authentication
Chromium/Chrome
Chromium/Tips and tricks#U2F authentication
用户会话认证
Yubico 公司(YubiKey 的制造商)开发了一个 U2F PAM 模块。它可以作为登录时的第二个因素,或者完全取代密码的需求。
安装 PAM 模块
该模块是 pam-u2f 包的一部分。
添加密钥
authfile=/path/to/u2f_keys 来更改。如果您希望将 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]。当存在多个 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 模块静默失败,请在 /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
非根分区
对于非根数据分区,crypttab 应如下所示:
/etc/crypttab
data /dev/sdX none fido2-device=auto
如果您的加密分区是 LVM 管理下的逻辑卷,这应该也能正常工作。
/etc/crypttab
data /dev/vg1/data none fido2-device=auto