Install Howdy facial authentication for Linux desktop.
人臉解鎖,即允許使用者刷臉解鎖電腦或筆電。
很多人用Linux跑人臉辨識的Python專案,那麼可不可以用人臉辨識技術來解鎖Linux電腦呢?
如果不算Android和ChromeOS,目前加入人臉辨識的Linux發行版只有Deepin,他們使用名為Seetaface的方案。其他主流Linux發行版如Ubuntu、Fedora、openSUSE、Arch Linux都沒有人臉辨識,需要依賴第三方程式實現人臉解鎖。
Linux最受歡迎的人臉解鎖程式,當屬boltgolt開發的「Howdy」,能夠賦予Linux電腦人臉解鎖的能力。
開發者說它是一款模仿Windows Hello的軟體,能夠在Linux系統實現類似Windows Hello臉部辨識的功能。它可以在登入Linux電腦的時候時用人臉解鎖,還有在桌面執行sudo權限的程式的時候,用人臉替代密碼解鎖。
1. Howdy原理#
Howdy使用的技術為OpenCV + Dlib模型。
Howdy需要紅外線相機進行人臉辨識,原理很像是Windows Hello。因此硬體需求為搭載紅外線相機的電腦。
雖然Howdy不一定要相機支援紅外線,參見這個issue,但安全性會大大降低,變成用一張照片就能騙過去。所以還是使用有紅外線相機的電腦吧。
Howdy掃描你的人臉之後會建立模型,全部的資料都儲存在本機,不會用到TPM。
Howdy依賴Linux發行版常見的PAM機制作為認證手段,能夠將人臉作為密碼以外的認證手段。若人臉解鎖失敗,便回退到密碼。
舉凡執行sudo指令、登入桌面環境、解鎖螢幕鎖定等操作,Howdy都會自動跳出來識別人臉。
Howdy尚能搭配Polkit,自動在桌面環境「輸入密碼」的視窗進行人臉解鎖。
當然,Howdy需要圖形界面才能運作,因為這樣才能使用相機。若是SSH連線階段,Howdy就不會跳出來認證。
不過Howdy並非唯一的認證方式,失敗了依然能輸入密碼登入,不能指定「僅限人臉解鎖電腦」。且要保護電腦,最好啟用Secure Boot與LKMS加密硬碟,才能確保裝置能不被外力輕易破解。
2. 安裝Howdy#
首要任務當然是確認你Linux電腦的相機驅動有無正常運作。隨便用瀏覽器開一個網頁,測試能否存取相機。
安裝偵測相機裝置的工具,例如v4l2:
sudo apt install v4l-utils
- 然後參照Github說明,安裝Howdy。譬如Ubuntu就是透過開發者的PPA安裝:
sudo add-apt-repository ppa:boltgolt/howdy
sudo apt update
sudo apt install howdy
註:Ubuntu 24.04以上版本會遇到pip無法安裝到系統目錄的問題error: externally-managed-environment
,暫時的解決方法是取消EXTERNALLY-MANAGED的機制:
python3 --version
sudo mv /usr/lib/python3.12/EXTERNALLY-MANAGED /usr/lib/python3.12/EXTERNALLY-MANAGED.old
sudo apt install howdy
- 確認Howdy函式庫的路徑:
ls -l /usr/local/lib/x86_64-linux-gnu/security/pam_howdy.so
# 或者
ls -l /lib/security/pam_howdy.so
#或者
ls -l /lib64/security/pam_howdy.so
- Linux系統若有啟用SELinux,可能會導致無法在開機的時候存取相機,參考這裡解決。
3. 設定Howdy使用的相機#
用圖形介面設定#
有許多人開發過前端GUI,譬如SlimbookFace和KCM howdy,不過他們偏小眾。
用Howdy開發者內建的程式設定吧,執行sudo howdy-gtk
然後依照指示設定。下載人臉辨識模型的時候選取Balanced版本。
用指令設定#
- 列出Linux的相機裝置,相機裝置應該是
/dev/video
開頭,但若有多個相機,可能每次開機後路徑都不一樣,所以我用/dev/v4l/by-id/
的路徑來決定相機路徑為何。
ls -l /dev/v4l/by-id/
# 範例輸出:
usb-SunplusIT_Inc_HD_Webcam-video-index0 -> ../../video0
usb-SunplusIT_Inc_HD_Webcam-video-index1 -> ../../video1
- 查看相機資訊,我這個應該就是紅外線相機。
v4l2-ctl -d /dev/v4l/by-id/SunplusIT_Inc_HD_Webcam-video-index0 -D
- 編輯Howdy設定檔
sudo howdy config
- 填入相機路徑
device_path = /dev/v4l/by-id/usb-SunplusIT_Inc_HD_Webcam-video-index0
- 啟用人臉辨識的通知訊息
detection_notice = true
- 設定好之後,啟動Howdy測試程式,看看相機能否辨識到人臉。有些電腦鏡頭在做動的時候就會閃紅光。
sudo howdy test
這個視窗內,偵測到臉部就會出現圈圈,代表成功偵測到人臉。紅色圈圈是尚未建立模型的人臉,綠色圈圈是已經建立模型的人臉。
請繼續維持同樣的角度看著鏡頭,然後新增臉部。Howdy沒有圖形互動的界面,盯著鏡頭幾秒後,就會自動建立臉部模型了。
sudo howdy add
4. 用Howdy解鎖sudo密碼#
設定哪些輸入密碼的場合需要讓Howdy跳出來驗證,最先處理的就是sudo。我希望的處理邏輯:先嘗試人臉解鎖,無法使用人臉的時候,再回退到密碼解鎖。依照Howdy的設定,大約5秒沒有看到人臉就會算是解鎖失敗,然後回退到密碼解鎖。
找到Linux系統的PAM設定檔,通常位於
/etc/pam.d
目錄。編輯
/etc/pam.d/sudo
和/etc/pam.d/system_auth
這兩個檔案在頂部加入以下內容,設定sufficient認證規則,填入Howdy函式庫的路徑:
auth sufficient /lib/security/pam_howdy.so
重開機。
嘗試在終端機輸入sudo指令,應該就會自動啟動Howdy人臉解鎖。按Ctrl+C的話就直接跳過倒數計時,直接進入密碼解鎖。
5. 用Howdy解鎖桌面環境#
依然是編輯PAM的設定檔。
這個需要依照桌面環境調整。
GNOME#
GNOME 47以上版本,只需要編輯GDM設定檔就可以了。在登入畫面和鎖定畫面便可以用人臉解鎖。
編輯/etc/pam.d/gdm-password
,加入以下內容:
auth [success=done ignore=ignore default=bad] pam_selinux_permit.so
auth sufficient /lib/security/pam_howdy.so
重開機。在GDM畫面點一下要登入的使用者,再看一下鏡頭,應該就能夠用人臉解鎖了。
GNOME螢幕鎖定後畫面應該會變黑,鍵盤喚醒螢幕之後才可以使用人臉辨解鎖。
KDE Plasma#
KDE Plasma 6.0以上版本,需要編輯顯示管理器以及螢幕鎖定程式。
設定開機後啟動的SDDM顯示管理器,編輯/etc/pam.d/sddm
,加入以下內容:
auth [success=done ignore=ignore default=bad] pam_selinux_permit.so
auth sufficient /lib/security/pam_howdy.so
但是自動解鎖SDDM並不會一併解鎖KDE鑰匙圈。所以其實不建議在這裡啟用人臉解鎖。
然後是KDE螢幕鎖定程式,編輯/etc/pam.d/kde
,加入以下內容:
auth sufficient /lib/security/pam_howdy.so
KDE的螢幕鎖定程式可能不是以目前使用者執行,所以要將Howdy設定為允許所有使用者執行
sudo chmod o+x /lib/security/howdy/dlib-data
重開機,嘗試用人臉解鎖。
KDE螢幕鎖定後畫面應該會變黑,鍵盤喚醒螢幕之後才可以使用人臉辨解鎖。若螢幕沒有在鎖定之後熄滅,會導致人臉解鎖太早偵測導致失敗。
6. 用Howdy解鎖瀏覽器?#
Windows系統的Google Chrome在填入密碼的時候,能夠用Windows Hello解鎖。
至於Linux,目前看來是辦不到。Linux的Google Chrome使用桌面環境附屬的鑰匙圈服務來管理密碼。通常登入桌面後這個鑰匙圈就跟著自動解鎖了,沒有Howdy介入的餘地。