跳至內容

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從用戶中刪除該指紋。

參見

[編輯 | 編輯原始碼]