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]。