fprint
fprint 旨在填补开源桌面环境在生物特征认证方面的空白,尤其是通过为指纹扫描仪提供标准支持来增强安全性。该项目的核心是 libefprint 库,它作为一个中间件层,为指纹识别硬件提供统一的接口,让各个桌面环境和应用软件能够便捷地利用指纹识别功能。
该项目是在一些支持内置指纹识别器的笔记本中使用 PAM 登录。此教程还将介绍如何使用常规密码作为备用登录的方法(由于某些原因,不建议仅使用指纹模块进行验证登录)。
使用前提[编辑 | 编辑源代码]
首先需要您的设备上有兼容的指纹识别设备, 可以查看兼容设备清单和不兼容设备清单来确定是否支持您的指纹识别设备。 使用下面命令查看您的指纹设备信息:
$ lsusb
命令 lsusb 在工具包usbutils包软件包中提供。
安装[编辑 | 编辑源代码]
安装 fprintd包 软件包。 可能也需要软件包imagemagick包.
某些设备需要使用 libfprint包 的分支版本,但这些分支目前还没有合并到上游libfprint,清单如下:
- libfprint-tod — 用于基于传感器的设备。
- libfprint-elanmoc2 — 用于ELAN
04f3:0c4c
,其版本在等待合并中。
- libfprint-elanmoc2-newdrvs — 针对
04f3:0c4c
或04f3:0c00
实验性的功能,其版本也在等待合并。
- https://gitlab.freedesktop.org/geodic/libfprint/-/tree/elanmoc2 || libfprint-elanmoc2-newdrvs-gitAUR
配置[编辑 | 编辑源代码]
登录配置[编辑 | 编辑源代码]
将pam_fprintd.so
模块添加在/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,su,sudo,gdm,lightdm}
中的其他文件, 例如 /etc/pam.d/polkit-1
用于 GNOME polkit 身份验证或 /etc/pam.d/kde
解锁KDE的锁屏
当完成录入指纹时,将 pam_fprintd.so
添加到 /etc/pam.d/
中的任何配置文件中只会提示进行指纹身份验证。如果无法按 Ctrl+c
指纹身份验证(由于缺少外壳),这将防止使用密码。要在图形界面中使用密码或指纹,请将以下行添加到所需文件的最顶部:
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 ...
录入指纹[编辑 | 编辑源代码]
您需要运行 Polkit 身份认证组件才能录入。
开始录入指纹,请运行:
$ fprintd-enroll
或为所有手指录入指纹:
$ fprintd-delete "$USER" $ for finger in {left,right}thumb,{index,middle,ring,littlefinger}; do fprintd-enroll -f "$finger" "$USER"; done
您将被要求扫描给定的手指。用右手食指滑动“五次”。之后,在 /var/lib/fprint/
中创建指纹数据。
您也可以在没有身份验证代理的情况下注册:
# fprintd-enroll user
验证指纹[编辑 | 编辑源代码]
如果您需要验证录入的指纹能否正确识别,请运行以下命令:
$ fprintd-verify
删除指纹[编辑 | 编辑源代码]
如果您不满意已录入的指纹数据,例如需要删除左手拇指指纹数据,可以使用下面命令进行删除:
$ fprintd-delete -f left-thumb
有关更多信息,请参阅 fprintd(1).
限制用户录入指纹[编辑 | 编辑源代码]
默认情况下,允许每个用户注册新指纹,而无需提示输入密码或指纹。您可以使用 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 } })
故障排除[编辑 | 编辑源代码]
指纹设备无法使用[编辑 | 编辑源代码]
如果您在兼容设备清单没有找到您的设备, 请通过journalctl查看fprintd.service
的日志信息。
您可能会可能到如下日志条目:
fprintd[2936592]: Corrupted message received fprintd[2936592]: Ignoring device due to initialization error: unsupported firmware version
确保设备的固件是最新的 Fwupd。
系统休眠后gdm在显示登录提示时挂起[编辑 | 编辑源代码]
这个问题在libfprint存储库中有描述。开发人员的答案是:
- 我现在的猜测是,我们正在断开USB蓝牙设备的连接,而它正在初始化。然后,当蓝牙usb设备试图加载固件时,一切都被卡住了(这有一个10秒的超时,解释了我们看到的不到10秒的挂起)。像这样断开USB蓝牙设备的连接预计会在rfkill开关切换时发生,所以这是正常的。只是设备突然断开连接的情况似乎没有得到正确处理并超时。
建议的修复方案是将禁用该驱动模块,添加内核模块配置文件:
/etc/modprobe.d/bluetooth-blacklist.conf
blacklist btusb
或者直接执行:
# rmmod btusb
完成上面操作后,[Unit] Description=Kill fprintd and enable USB persist before sleep Before=sleep.target
[Service] ExecStart=/usr/bin/sh -c "killall fprintd; echo 1 > /sys/bus/usb/devices/3-3/power/persist"
[Install] WantedBy=sleep.target它将不会尝试初始化该设备。
挂起设备时出现意外错误[编辑 | 编辑源代码]
这个问题在libfprint存储库中有描述:
- Set your laptop to not suspend to RAM but to do s2idle. You might need to switch the BIOS into "Windows mode"。BIOS中设置成"Windows mode"
使用指纹时被polkit代理拒绝[编辑 | 编辑源代码]
如果您在录入指纹的时候提示类似下面信息:
Using device /net/reactivated/Fprint/Device/0 Enrolling right-index-finger finger. EnrollStart failed: GDBus.Error:net.reactivated.Fprint.Error.PermissionDenied: Not Authorized: net.reactivated.fprint.device.enroll
这是因为polkit策略的限制,可以尝试在/usr/share/polkit-1/rules.d/
添加一条策略reactivated.fprint.device.verify.rules
,以下实例中允许users
用户组可以使用指纹识别器:
/etc/polkit-1/rules.d/reactivated.fprint.device.verify.rules
polkit.addRule(function (action, subject) { if (action.id == "net.reactivated.fprint.device.enroll" && subject.isInGroup("users")) { return polkit.Result.YES } })
开启调试模式[编辑 | 编辑源代码]
使用下面环境变量来获取运行时详细日志。
# G_MESSAGES_DEBUG=all /usr/lib/fprintd -t
fprintd在从睡眠唤醒前启动[编辑 | 编辑源代码]
创建并启动一个fprintd.service 守护进程,将 3-3
替换成实际指纹Bus ID,可通过命令 lsusb -t
获取。
/etc/systemd/system/fingerprint.service
[Unit] Description=Kill fprintd and enable USB persist before sleep Before=sleep.target [Service] ExecStart=/usr/bin/sh -c "killall fprintd; echo 1 > /sys/bus/usb/devices/3-3/power/persist" [Install] WantedBy=sleep.target
能录入指纹却无法验证[编辑 | 编辑源代码]
某些指纹识别设备扫描的图像太小,数据不足以支撑 fprint 正常工作。一种常见的解决方法是滑动而不是触摸传感器,但生成好图像的速度可能会有所不同。有些设备需要较慢的滑动速度,有些则需要较快的滑动速度。好的图像示例请参考github[1]。
如果想练习不同速度以查看哪种速度生成更好的图像,请尝试使用脚本examples/img-capture[2]来导出图像,并与上面的示例进行比较(需要从源代码编译libfprint)。
相关讨论见gitlab[3]。