跳转至内容

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

来自 ArchWiki

通用二次因素 (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 authentication

Chromium/Chrome

Chromium/Tips and tricks#U2F authentication

用户会话认证

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 -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]。当存在多个 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)

本文或本节可能需要移动到 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

© . 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.