跳转至内容

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-todAUR, libfprint-tod-gitAUR
  • libfprint-elanmoc2 — 用于 ELAN 04f3:0c4c,等待 合并
https://gitlab.freedesktop.org/Depau/libfprint/-/tree/elanmoc2 || libfprint-elanmoc2-gitAUR

此列表并非详尽无遗。在 AUR 中可以找到针对其他设备的更多分支。

配置

上游建议 使用 S2Idle 睡眠而非 S3,但根据您的设备情况,S3 可能同样有效。

登录配置

警告 如果将此设置(仅指纹认证)用于 su, polkit 或 sudo,将构成安全漏洞,因为它允许后台进程在不提示用户指纹的情况下获取权限(通过指纹劫持)。详见 CVE-2024-37408

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

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

您也可以用同样的方式修改 /etc/pam.d/{login,gdm,lightdm} 中的其他文件。

KDE 已经在 /etc/pam.d/kde-fingerprint 中配置了指纹认证,因此您无需编辑该文件。对于一个简单的可用配置(在 KDE Plasma 中先请求指纹,失败后再要求密码认证),只需将 /etc/pam.d/system-auth 中的以下行进行修改

-auth      [success=3 default=ignore]   pam_systemd_home.so
auth       [success=2 default=ignore]   pam_fprintd.so
auth       [success=1 default=bad]     pam_unix.so          try_first_pass nullok

/etc/pam.d/ 的任何配置文件中将 pam_fprintd.so 添加为 sufficient 时,如果存在指纹签名,系统将仅提示指纹认证。如果您无法 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
  }
})

故障排除

无可用设备

如果无法找到您的 支持设备,或提示设备已被占用(in use),请检查 journal 中的 fprintd.service 日志。

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

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

请确保使用 Fwupd 更新设备的固件。

暂停唤醒后显示登录提示时 GDM 卡死

此问题在 libfprint 仓库 中有描述。开发者的回答是

我目前的猜测是我们是在蓝牙 USB 适配器初始化时将其断开连接。然后,当 btusb 尝试加载固件时,一切都卡住了(这有一个 10 秒的超时,解释了我们看到的略低于 10 秒的卡死)。像这样断开蓝牙适配器在切换 rfkill 开关时是预期会发生的,所以这是正常的。只是设备突然断开连接的情况似乎没有被正确处理,导致了超时。

建议的修复方法是 创建

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

或者直接执行

# rmmod btusb

这样它就不应该尝试初始化该设备。

暂停设备时出现意外错误

此问题在 libfprint 仓库 中有描述

您需要将笔记本电脑设置为不使用 Suspend-to-RAM,而使用 s2idle。您可能需要将 BIOS 切换到“Windows 模式”。

指纹认证在 Polkit 代理中未生效

在将指纹规则添加到 Linux PAM 后,指纹识别仅对 SDDMsudo 有效,但对 polkit 无效。

50-default.rules 文件复制到 /etc/polkit-1/rules.d/,并将组名 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"];
});

Debug

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

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

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

创建以下 udev 规则以启用 USB 设备持久化,将 ID 替换为通过 lsusb 找到的指纹读取器 ID

/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"

在 fprintd 仍在运行时进入睡眠会导致 fprintd 崩溃

fprintd 在成功登录后会等待 30 秒才退出,因此在此期间进入睡眠可能会导致 fprintd 崩溃。如果发生这种情况,请创建并 启用 以下 systemd 服务

/etc/systemd/system/kill-fprintd.service
[Unit]
Description=Kill fprintd before sleep
Before=sleep.target

[Service]
ExecStart=killall fprintd

[Install]
WantedBy=sleep.target

注册成功但验证失败

某些触控式指纹读取器生成的图像太小,导致 fprint 的算法无法正常工作。一个常见的解决方法是用“滑动”代替“触摸”传感器,但生成优质图像的滑动速度可能有所不同。有些传感器需要慢速滑动,有些则需要快速滑动。这里有一些关于 优质图像应具有的样子 的技巧。

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

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

无法以用户身份注册

如果您收到类似 EnrollStart failed: GDBus.Error:net.reactivated.Fprint.Error.PermissionDenied: Not Authorized: net.reactivated.fprint.device.enroll 的错误,请确保 您的认证代理(用于提示被注册用户的密码)运行正常。不过,可以通过以 root 身份运行命令来绕过此问题

sudo fprintd-enroll "$(whoami)"

重要的是要传递普通用户的名称,否则指纹将被关联到 root 用户,这对于大多数用例来说是反效果的。

如果您收到“enroll-duplicate”错误,说明该手指已经以 root 身份注册。您可以注册另一个手指,或使用 fprintd-delete 从 root 用户中删除该手指。

之后,您应该能够以普通用户身份运行 fprintd-verify 而不会出现权限错误。

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