fprint

来自 ArchWiki

来自 fprint 首页

fprint 项目旨在填补 Linux 桌面的一个空白:对消费级指纹读取器设备的支持。

其想法是使用某些笔记本电脑中的内置指纹读取器,通过 PAM 进行登录。本文还将解释如何使用常规密码作为备用登录方法(由于多种原因,不建议仅使用指纹扫描仪)。

先决条件

注意: 支持的设备列表不会定期更新,并且不完整。即使您的设备未出现在该列表中,也值得按照此页面上的说明测试您的设备,然后再求助于 AUR 软件包。

您可以通过查看支持的设备列表不支持的设备列表来检查您的设备是否受支持。要检查您拥有哪个设备,请输入

$ lsusb

lsusb 工具在 usbutils 软件包中可用。

安装

安装 fprintd 软件包。imagemagick 也可能需要。

某些设备需要 libfprint 的不同分支,尚未与主 libfprint 合并

  • libfprint-tod — 适用于触摸式传感器。
https://gitlab.freedesktop.org/3v1n0/libfprint/-/tree/tod || libfprint-tod-gitAUR
  • libfprint-elanmoc2 — 适用于 ELAN 04f3:0c4c,等待 合并
https://gitlab.freedesktop.org/Depau/libfprint/-/tree/elanmoc2 || libfprint-elanmoc2-gitAUR
  • libfprint-elanmoc2-newdrvs实验性,适用于 04f3:0c4c04f3:0c00,等待 合并
https://gitlab.freedesktop.org/geodic/libfprint/-/tree/elanmoc2 || libfprint-elanmoc2-newdrvs-gitAUR

此列表并非详尽无遗。请在 AUR 中查看更多其他设备的分支。

配置

登录配置

注意
  • 如果您使用 GDM,则指纹选项已在登录菜单中可用(如果不是,请将自己添加到 input 用户组)。您可以跳过此部分!
  • 如果您使用 SDDM,请参阅 SDDM#使用指纹读取器

pam_fprintd.so 作为 sufficient 添加到 /etc/pam.d/system-local-login 的 auth 部分的顶部

/etc/pam.d/system-local-login
auth      sufficient pam_fprintd.so
auth      include   system-login
...

这将尝试首先使用指纹登录,如果失败,或者如果在给定用户的主目录中找不到指纹签名,则继续进行密码登录。

警告: 此设置是 su 和 sudo 的安全漏洞,因为它允许后台进程在不提示用户的情况下获得权限。参见:CVE-2024-37408

您也可以以相同的方式修改 /etc/pam.d/{login,su,sudo,gdm,lightdm} 中的其他文件。例如,/etc/pam.d/polkit-1 用于基于 polkit 的身份验证(GNOME 和许多其他桌面环境)。如果 /etc/pam.d/polkit-1 不存在,请从 /usr/lib/pam.d/polkit-1 复制它。KDE 已经在 /etc/pam.d/kde-fingerprint 中配置了指纹验证,因此您无需编辑该文件。

当存在指纹签名时,将 pam_fprintd.so 作为 sufficient 添加到 /etc/pam.d/ 中的任何配置文件中,将仅提示指纹验证。如果您无法 Ctrl+c 指纹验证(由于缺少 shell),这将阻止使用密码。为了在图形界面中使用密码或指纹,请将以下行添加到任何所需文件的顶部

auth		sufficient  	pam_unix.so try_first_pass likeauth nullok
auth		sufficient  	pam_fprintd.so
...

这将提示输入密码;在空白字段上按 Enter 将继续进行指纹验证。

如果您想同时提示输入指纹和密码,可以使用 pam-fprint-grosshackAUR。对于某些不允许空白密码输入的图形程序(例如 Gnome 的内置 polkit 代理),这可能是必需的。要使用此软件包,请将以下行添加到任何所需文件的顶部

auth		sufficient  	pam_fprintd_grosshack.so
auth		sufficient  	pam_unix.so try_first_pass nullok
...

创建指纹签名

您需要运行 身份验证代理 才能进行注册。

要为手指添加签名,请运行

$ fprintd-enroll

或为所有手指创建新签名

$ fprintd-delete "$USER"
$ for finger in {left,right}-{thumb,{index,middle,ring,little}-finger}; do fprintd-enroll -f "$finger" "$USER"; done

系统将要求您扫描给定的手指。五次滑动您的右食指。之后,签名将在 /var/lib/fprint/ 中创建。

您也可以在没有身份验证代理的情况下注册

# fprintd-enroll user

要验证新创建的指纹,请使用

$ fprintd-verify

有关更多信息,请参阅 fprintd(1)

限制注册

本文或本节是与 polkit 合并的候选对象。

注意: 部分重复文章(在 Talk:Fprint 中讨论)

默认情况下,每个用户都可以在不提示密码或指纹的情况下注册新指纹。您可以使用 polkit 规则更改此行为。

有两个位置包含 polkit 配置文件

  • /etc/polkit-1/rules.d/
  • /usr/share/polkit-1/rules.d/
注意:不应修改 /usr/share/polkit-1/rules.d/ 下的文件,因为它们会在更新时被覆盖。请先将它们复制到 /etc/polkit-1/rules.d/

在以下示例中,只有 root 用户可以注册指纹

/etc/polkit-1/rules.d/50-net.reactivated.fprint.device.enroll.rules
polkit.addRule(function (action, subject) {
  if (action.id == "net.reactivated.fprint.device.enroll") {
    return subject.user == "root" ? polkit.Result.YES : polkit.Result.NO
  }
})

故障排除

没有可用设备

如果找不到您的 受支持的设备,或者声称该设备已打开(正在使用中),请检查 日志 中的 fprintd.service 日志。

您可能会发现如下日志条目

fprintd[2936592]: Corrupted message received
fprintd[2936592]: Ignoring device due to initialization error: unsupported firmware version

确保您的设备固件通过 Fwupd 更新到最新。

从挂起恢复后 gdm 在显示登录提示时卡住

此问题在 libfprint 存储库中描述。开发人员的回答是

我现在的猜测是,我们在初始化 BT USB 加密狗时断开了它的连接。然后一切都卡住了,而 btusb 正在尝试加载固件(这有一个 10 秒的超时,解释了我们看到的略低于 10 秒的卡顿)。像这样断开蓝牙加密狗的连接在射频开关切换时是预期会发生的,所以这是正常的。只是设备突然断开连接的情况似乎没有得到正确处理并且超时了。

建议的修复方法是创建

/etc/modprobe.d/bluetooth-blacklist.conf
blacklist btusb

或立即执行

# rmmod btusb

然后它不应尝试初始化设备。

挂起设备时出现意外错误

此问题在 libfprint 存储库中描述

您需要将笔记本电脑设置为不挂起至 RAM,而是执行 s2idle。您可能需要将 BIOS 切换到“Windows 模式”。

指纹验证在 Polkit 代理中不起作用。

在将指纹规则添加到 Linux PAM 后,指纹识别仅适用于 SDDMsudo,但不适用于 polkit

50-default.rules 文件复制到 /etc/ 并将组名 wheel 更改为您的用户组。

# cp /usr/share/polkit-1/rules.d/50-default.rules /etc/polkit-1/rules.d/
/etc/polkit-1/rules.d/50-default.rules
polkit.addAdminRule(function(action, subject) {
    return ["unix-group:wheel"];
});

调试

使用以下环境变量和命令行标志

# G_MESSAGES_DEBUG=all /usr/lib/fprintd -t

从睡眠恢复后 fprintd 在指纹读取器设备初始化之前启动

创建以下 udev 规则,启用 USB 设备持久性,将 ID 替换为您指纹读取器的 ID,您可以使用 lsusb 找到它

/etc/udev/rules.d/01-fingerprint.rules
ACTION=="add", SUBSYSTEM=="usb", DRIVERS=="usb", ATTRS{idVendor}=="06cb", ATTRS{idProduct}=="00fc", ATTR{power/persist}="1", RUN="/usr/bin/chmod 444 %S%p/../power/persist"

此外,如果您使用 KDE 并且 KDE 锁屏在您的计算机进入睡眠状态之前启动 fprintd,请在 fprintd.so 上方添加以下行,使 KDE 锁屏等待 2 秒,以便它在睡眠后启动 fprintd。

/etc/pam.d/kde-fingerprint
auth       required                    pam_exec.so          /usr/bin/sleep 2

注册工作但验证不工作

一些触摸式指纹读取器生成的图像太小,fprint 的算法无法正常工作。对于这些读取器,一种常见的解决方法是滑动而不是触摸传感器,但是生成良好图像的速度可能会有所不同。一些传感器需要较慢的滑动,而另一些传感器需要较快的滑动。以下是一些关于良好图像应有的样子的提示。

如果您想练习不同的速度以查看哪个速度生成更好的图像,请尝试使用脚本 examples/img-capture 转储图像,并将其与上面的示例进行比较(您需要从源代码编译 libfprint)。

另请参阅 https://gitlab.freedesktop.org/libfprint/libfprint/-/issues/174