Linuxでも指紋認証がしたい

## ことのはじめ

- Macを使っていると[Touch ID](https://support.apple.com/ja-jp/guide/mac-help/mchl16fbf90a/mac)なる指紋認証の仕組みが存在しており、起動以降はTouch IDを使えば様々な認証をID/Passwordの入力なく行える。
- 指紋認証は基本的に本人認証の方法としては安全なように思うしPasswordを覚えたりする手間を思えば全部の認証を指紋で行いたいところだ。

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

## 調査

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

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

+ (1) fprintd対応済みデバイスを使うかドライバを書く
    + fprintはFreeDesktopのプロジェクトの１つで、Linuxで指紋リーダー機器のサポートを追加することを目的としている
    + サポートされているデバイス; https://fprint.freedesktop.org/supported-devices.html

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

このあたりは下記のサイトが参考になった
- [Fixing my fingerprint reader on Linux by writing a driver for it](https://infinytum.co/fixing-my-fingerprint-reader-on-linux-by-writing-a-driver-for-it/)

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

+ (2) Arduinoなどに対応した指紋認証デバイスをインテグレーションする
    + AS608という指紋認証デバイスが[Arduino, Linux, Windows向けにAPI仕様が公開されており](https://learn.adafruit.com/adafruit-optical-fingerprint-sensor/circuitpython)、基本的にシリアル通信でつなぎこむことができる
    + これは安価なデバイスであり、AliExpressを「as608 fingerprint sensor」などで検索すると類似の機器がたくさん出てくる
    + 一番最初に見つけたインテグレーション例は; [RaspiReader DIY Raspberry Pi fingerprint reader](https://projects-raspberry.com/raspireader-diy-raspberry-pi-fingerprint-reader/)

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

## 検討

- 参考に動画を見ていると、AS608に接続するインターフェースはシリアル通信(UART)であることがわかった
    - [RaspiReader: Cost-Effective Open-Source Fingerprint Reader](https://www.youtube.com/watch?v=sY4Yf4roEsI)
- 次に、RaspberryPiやArduinoを使わず直接Linux(Debian/Ubuntu)でインテグレーションを行えるソフトウェアが公開されているのを発見した
    - [PAM Fingerprint](https://www.pm-codeworks.de/pamfingerprint-en.html)


## インテグレーション

### 物理デバイス編
<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20634/b3403c30-ba63-c35d-6a11-79ce5635b7ca.jpeg">

- まず指紋認証センサーを圧着端子で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](https://www.pm-codeworks.de/pamfingerprint-en.html) に記載の手順に従ってパッケージをインストールする
    - ここ、実はうまくいかなかったのでローカルでパッケージをビルドした

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

```shell
# 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.
```


### 使ってみた感触と今後

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

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


## 参考サイト

- [debianで指紋認証をできるようにする](https://debianmemo.blogspot.com/2019/03/debian.html)
- [Arduinoで指紋認証をしてみる](https://novicengineering.com/arduino%E3%81%A7%E6%8C%87%E7%B4%8B%E8%AA%8D%E8%A8%BC%E3%82%92%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B/)