3
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Linuxでも指紋認証がしたい

Last updated at Posted at 2023-10-01

ことのはじめ

  • Macを使っているとTouch IDなる指紋認証の仕組みが存在しており、起動以降はTouch IDを使えば様々な認証をID/Passwordの入力なく行える。
  • 指紋認証は基本的に本人認証の方法としては安全なように思うしPasswordを覚えたりする手間を思えば全部の認証を指紋で行いたいところだ。

ところでLinuxをデスクトップで使っていると簡単にはこれが行えないようだった。

調査

Linuxで指紋認証を行うための手段

少し調べたところ、下記のような手段があった

  • (1) fprintd対応済みデバイスを使うかドライバを書く

最初、USB形式の指紋認証機器を購入し、そのLinux向けドライバを書けば早いのではないかと思っていたが色々と調べるうちに困難だとわかってきた。というのは商用の指紋読み取りデバイスはホストPCとUSB機器の通信が暗号化されているために、そこのリバースエンジニアリングが必要になるからだ。

このあたりは下記のサイトが参考になった

というわけで第二の選択肢を取ることにした

これはかなり行けそうだったのでAliExpressで機材を購入した

検討

  • 参考に動画を見ていると、AS608に接続するインターフェースはシリアル通信(UART)であることがわかった
  • 次に、RaspberryPiやArduinoを使わず直接Linux(Debian/Ubuntu)でインテグレーションを行えるソフトウェアが公開されているのを発見した

インテグレーション

物理デバイス編

  • まず指紋認証センサーを圧着端子でUSB-シリアル変換器でつないだ
  • USB-シリアル変換器はPL2303というものを使った、「USB UART TTLケーブル」とかで検索すればAliExpressで買える
  • USBの口はもちろんホストPCに接続する、うまく接続できていれば指紋認証センサーが光る

機器とUSBシリアル変換器の接続は下記のようにする(TX-RXはそれぞれ逆につなぐ)

[デバイス]   [USB-シリアル変換器]
GND      -  GND
RX       -  TX
TX       -  RX
3V3      -  3.3V
T-OUT       使わない
T-3V3       使わない

うまく接続できていればdmesgの結果に/dev/ttyUSB0が出てきてシリアル通信の準備ができる

kernel: [ 8440.889059] pl2303 1-7.1:1.0: pl2303 converter detected
kernel: [ 8440.889744] usb 1-7.1: pl2303 converter now attached to ttyUSB0

ソフトウェア編

  • PAM Fingerprint に記載の手順に従ってパッケージをインストールする
    • 当時はうまくいかなかったのでローカルでパッケージをビルドしたが、以下のようにパッケージからインストール可能
$ wget -qO - https://apt.pm-codeworks.de/pm-codeworks.de.gpg -O ~/Downloads/pm-codeworks.de.gpg
$ cat ~/Downloads/pm-codeworks.de.gpg | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/pm-codeworks.de.gpg
$ sudo apt-get install python3-fingerprint libpam-fingerprint

ともあれ、後はPAM Fingerprintで配布されているコマンドを使うと指紋認証デバイスへの指紋の登録とUNIXユーザーへの関連付け / 登録された指紋の削除 / 指紋のチェックがそれぞれできる

# pamfingerprint-conf
usage: pamfingerprint-conf [-h] [--add-user NAME] [--remove-user NAME] [--check-user NAME] [--version]

PAM Fingerprint configuration program:

options:
  -h, --help          show this help message and exit
  --add-user NAME     Adds a new user.
  --remove-user NAME  Removes a user.
  --check-user NAME   Checks fingerprint for an existing user.
  --version, -v       Prints version and exits.

追記:PCスリープ後の指紋認証不具合対応

いつもPCスリープ後に指紋認証が通らないので困っていた。Geminiに調べさせたところ「主要な因果連鎖: システムのサスペンド → BIOS/ファームウェアによるUSBバスのリセットまたは電源遮断 → カーネルによるUSBデバイスのパワーセッション破棄 → 復帰時のデバイス再列挙 → ユーザースペースのドライバー/サービスが保持するデバイスハンドルの無効化 → 通信試行の失敗と認証不能。」とのことらしい。

対応も聞けたのでここに記載する。実際に効果があった。

  1. lsusbコマンドを使用して、デバイスのidVendoridProductを特定する。
  2. 新しいudevルールファイルを作成し、電源管理ポリシーを設定するルールを追加する。 (例: /etc/udev/rules.d/99-fingerprint.rules
# スリープ後の信頼性向上のため、指紋リーダーの自動サスペンドを防止する
ACTION=="add", SUBSYSTEM=="usb", ATTR{idVendor}=="ここにidVendorを入れる", ATTR{idProduct}=="ここにidProductを入れる", ATTR{power/control}="on"
  1. udevadm control --reload-rules && udevadm trigger で反映する

これでシステムのサスペンド後でも指紋認証が実行できる。

使ってみた感触と今後

  • 指紋認証の判定自体はスマホの指紋認証等よりは判定が厳しい印象
  • PAM Fingerprintはパッケージ内部にPAMの設定ファイルも組み込まれているため、ちゃんと動いていればLinuxログイン時の指紋認証ログインも可能となる
  • 1Passwordとの連携もできるのだが、どうやら1PasswordはPC初回起動時に1度はマスターパスワードを入れないとだめらしくちょっと不便だった(2回目の認証は指紋認証で可)

後は機材がむき出しなので、なにかを使ってケースへの格納をして見た目をきれいにしたいなと思っている。

参考サイト

3
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?