跳转至内容

通用二次验证 (Universal 2nd Factor)

来自 ArchWiki
(重定向自 U2F)

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

该标准最初由 Google 和 Yubico 开发,NXP Semiconductors 也做出了贡献,现在该标准由 FIDO Alliance 托管。

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

WebAuthn 是一个较新的标准。

网站认证

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

Firefox

Firefox/Tweaks#Fido U2F 认证

Chromium/Chrome

Chromium/Tips and tricks#U2F 认证

用户会话认证

生产 YubiKey 的 Yubico 公司开发了一个 U2F PAM 模块。它可以作为登录时的第二因素,或者完全取代密码的需要。

注意 尽管本文档提到了 Yubico/YubiKey,但 pam-u2f 也应该支持任何符合 U2F 和/或 FIDO2 标准的密钥。

安装 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 密钥上的按钮以确认密钥。

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

如果您拥有多个密钥,请使用以下方式添加后续密钥:

$ pamu2fcfg -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 密钥的设置。

注意 此方法将无法与加密的主目录分区一起使用,因为解密在登录过程完成之前未完成,因此 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

本文或该章节候选移至 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

© . This site is unofficial and not affiliated with Arch Linux.

Content is available under GNU Free Documentation License 1.3 or later unless otherwise noted.