通用第二因素
通用第二因素 (U2F) 是一种开放标准,它使用基于智能卡中类似安全技术的专用 USB 或 NFC 设备,加强和简化双因素身份验证 (2FA)。
虽然最初由 Google 和 Yubico 开发,并得到恩智浦半导体的贡献,但该标准现在由 FIDO 联盟托管。
有关 U2F 和 U2F 设备的所有文章,请参阅:Category:Universal 2nd Factor。
WebAuthn 是一个更新的标准。
网站身份验证
U2F 受到 Google、Facebook、Twitter 或 GitHub 等主要网站的支持。查看 2fa.directory 或 dongleauth.com 以查找其他网站和设置文档的链接。对于所有支持它的浏览器,可能只需要安装 libfido2。Yubico 提供了一个 演示页面 用于测试。
Firefox
Chromium/Chrome
用户会话身份验证
创建 YubiKey 的公司 Yubico 开发了一个 U2F PAM 模块。它可以用作登录期间的第二因素,或完全取代对密码的需求。
安装 PAM 模块
该模块是软件包 pam-u2f 的一部分。
添加密钥
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 密钥上的按钮以确认密钥。
hostname
替换为实际主机名。如果您拥有多个密钥,请使用以下命令附加下一个密钥
$ pamu2fcfg -o pam://hostname -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 官方文档 中解释的中央映射文件。一些可以执行 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 进行静态数据加密
自 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