跳转到内容

fprint

来自 Arch Linux 中文维基

fprint 旨在填补开源桌面环境在生物特征认证方面的空白,尤其是通过为指纹扫描仪提供标准支持来增强安全性。该项目的核心是 libefprint 库,它作为一个中间件层,为指纹识别硬件提供统一的接口,让各个桌面环境和应用软件能够便捷地利用指纹识别功能。

该项目是在一些支持内置指纹识别器的笔记本中使用 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, 请查看 使用指纹识别器

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

这里首先会尝试使用指纹认证登录,如果验证失败或找不到用户指纹数据,则进行密码认证登录。

警告:此设置是su和sudo的安全漏洞,因为它允许后台进程在不提示用户的情况下获取权限。请参阅:[1]

将此项放在auth fully pam_fprintd.so之前,以便在指纹无法显示提示时使用sudo/su禁止指纹。

# 不允许在没有tty的情况下在sudo/su中使用指纹
auth       [success=1 default=ignore]  pam_succeed_if.so    service in sudo:su:su-l tty in :unknown

也可以用相同的方式修改 /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中配置了指纹身份验证,因此不需要编辑该文件。对于最低限度的工作设置,它首先要求您的指纹,如果在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

当完成录入指纹后,如果将 pam_fprintd.sosufficient作为条件添加到 /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
...

录入指纹

[编辑 | 编辑源代码]

需要运行 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_(简体中文)

附注: 部分内容重复(在 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
  }
})

故障排除

[编辑 | 编辑源代码]

指纹设备无法使用

[编辑 | 编辑源代码]

如果在兼容设备清单没有找到您的设备, 请通过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

完成上面操作后,系统将不会尝试初始化该设备。

挂起设备时出现意外错误

[编辑 | 编辑源代码]

这个问题在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 before sleep
Before=sleep.target

[Service]
ExecStart=killall fprintd

[Install]
WantedBy=sleep.target

能录入指纹却无法验证

[编辑 | 编辑源代码]

某些指纹识别设备扫描的图像太小,数据不足以支撑 fprint 正常工作。一种常见的解决方法是滑动而不是触摸传感器,但生成好图像的速度可能会有所不同。有些设备需要较慢的滑动速度,有些则需要较快的滑动速度。好的图像示例请参考github[1]

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

相关讨论见gitlab[3]

用户无法录入指纹

[编辑 | 编辑源代码]

如果运行报错

EnrollStart failed: GDBus.Error:net.reactivated.Fprint.Error.PermissionDenied: Not Authorized: net.reactivated.fprint.device.enroll

最简单的方式是用root身份执行该命令:

sudo fprintd-enroll "$(whoami)"

这里需要提供用户,否则该指纹将会录入到root账户上。

如果录入指纹时提示 "enroll-duplicate" 的报错,则表明该手指指纹已被注册到其他用户了。要么更换其他手指,要么使用fprintd delete从用户中删除该指纹。

参见

[编辑 | 编辑源代码]