FreeBSD On ThinkPad X60

Finger Print

ThinkPad X60 内蔵の指紋認証を利用する。
ThinkPad X60 に搭載されている指紋認証デバイスは、 FreeBSD から ugen0 として認識されるので使ってみる。
こちらのペイジに詳しい事が書いてあるので、 この通りにすれば基本的に使える様になる筈である。
ugen0: STMicroelectronics Biometric Coprocessor, rev 1.00/0.01, addr 2
実際は普通にパスワード入力した方が楽で早かったりする……

ソフトウェアのインストール

指紋認証による認証は PAM 経由で利用する。
指紋認証デバイスのドライバは FreeBSD 用のものが バイナリ配布ながら提供されているので、 ドライバ、及び生体認証に必要な PAM モジュールを ports からインストールする。
# cd /usr/ports/security/bsp_upektfmess
# make install clean
# cd /usr/ports/security/pam_bsdbioapi
# make install clean

設定

生体認証用の PAM モジュールは認証情報を格納するためのデータベースを
  1. filebacked database
  2. MySQL database
  3. Plain text database
から選択できるので /usr/local/etc/birdb.conf で 使用するデータベースの種類やディレクトリを設定できるが、 今回は MySQL を利用しないのでデフォルトのまま利用する。
まず生体認証情報を格納するためのデータベースが 正しくインストールされたかを確認する。
# bbdm -l birdb
Installed BIRDB modules
filedb   Filebacked database (b-tree)
plain    Plain text file
ここで filedb が表示されればデータベースとして filedb が利用可能。
次に指紋認証デバイスのドライバが正しくインストールされたかを確認する。
# bbdm -l bsp
UUID {ffffffff-ffff-ffff-ffff-ffffffffffff}
         Example Vendor libbioapi_dummy100.so (BioAPI v1.1 Dummy BSP)
UUID {XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}
         BioAPI Consortium libpwbsp.so (BioAPI Password BSP)
UUID {YYYYYYYY-YYYY-YYYY-YYYY-YYYYYYYYYYYY}
         UPEK, Inc. libtfmessbsp.so (TouchChip TFM/ESS Fingerprint BSP)
一番下に表示されたのが指紋認証ユニットなので、 表示された UUID を指定して指紋を登録する。
# bbdm -b "{YYYYYYYY-YYYY-YYYY-YYYY-YYYYYYYYYYYY}" -m filedb -c ユーザID
enrollment  start
Put finger
[指紋登録1回目]
Image processing
Put finger 2nd time
[指紋検証2回目]
Image processing
Put finger 3rd time
[指紋検証3回目]
Image processing
Scanned good image
Operation succeeded
Please verify record
Verification start
Put finger
[指紋検証]
Image processing
Scanned good image
Operation succeeded
Record for ``ユーザID'' created successfully
指紋の登録を3回、検証用に1回の合計4回指紋を読込ませると登録完了。

PAM の登録

/etc/pam.d/system ファイルに生体認証モジュールを追加する。
auth        sufficient  /usr/local/lib/pam_bsdbioapi.so {YYYYYYYY-YYYY-YYYY-YYYY-YYYYYYYYYYYY} filedb
auth        required    pam_unix.so     no_warn try_first_pass nullok
最下段の直上に pam_bsdbioapi.so のエントリを追加する。 sufficient と指定する事により指紋認証でダメな場合でも、 通常通りパスワード認証にてログインできるよう設定する。

トラブルシューティング

bbdm を実行すると、カーネルがエラーメッセージを吐いてしまう。
All threads purged from ugen0.1
All threads purged from ugen0.2
All threads purged from ugen0.3
 :
既知の問題の様なので このペイジ を参考にして /usr/src/sys/kern/kern_conf.c に以下のパッチを適用する。
--- /usr/src/sys/kern/kern_conf.c	Thu Oct  6 11:17:41 2005
+++ kern/kern_conf.c	Thu May  4 19:59:30 2006
@@ -660,14 +660,15 @@
 
 	csw = dev->si_devsw;
 	dev->si_devsw = NULL;	/* already NULL for SI_ALIAS */
-	while (csw != NULL && csw->d_purge != NULL && dev->si_threadcount) {
-		printf("Purging %lu threads from %s\n",
-		    dev->si_threadcount, devtoname(dev));
-		csw->d_purge(dev);
-		msleep(csw, &devmtx, PRIBIO, "devprg", hz/10);
-	}
-	if (csw != NULL && csw->d_purge != NULL)
+	if (csw != NULL && csw->d_purge != NULL && dev->si_threadcount) {
+		while (dev->si_threadcount) {
+			printf("Purging %lu threads from %s\n",
+			       dev->si_threadcount, devtoname(dev));
+			csw->d_purge(dev);
+			msleep(csw, &devmtx, PRIBIO, "devprg", hz/10);
+		}
 		printf("All threads purged from %s\n", devtoname(dev));
+	}
 
 	dev->si_drv1 = 0;
 	dev->si_drv2 = 0;
次に login プロセスが setusercontext(3)の呼出しで Segmentation Violation を発生しエラーとなってしまうが、 libutil を static link して/usr/bin/login を コンパイルし置き換える事で解決した。
# cd /usr/src/usr.bin/login
# cc login.c login_fbtab.c /usr/lib/libutil.a -lbsm -lpam -o login
# chflags noschg /usr/bin/login
# cp login /usr/bin
# chflags chg /usr/bin/login
果たしてこの解決方法が正しいのかは不明であるが、 とりあえず指紋認証によりログインできているので良しとする。

微調整

指紋認証の認識レベルを /etc/tfmessbsp.cfg ファイルで指定できる。 認識レベルの指定は security-level パラメタで指定するが、 1 が一番誤差を許容し、5が一番誤差を許容しない。
security-level="1"
ただし、認識レベルをあげる(=数値を小さくする)と、 認証処理に時間がかかってしまう様だ。

リトライ回数設定

指紋認証は1度失敗すると通常のパスワード入力になってしまうので、 指紋入力のリトライ回数を指定できる パッチを作ってみた。
こののパッチを適用すると -i オプションにより、 指紋認証のリトライ回数を指定可能となる。
リトライ回数は /etc/pam.d/system 内の pam_bsdbioapi.so に対する引数で -iにより指定する。
auth        sufficient  /usr/local/lib/pam_bsdbioapi.so {YYYYYYYY-YYYY-YYYY-YYYY-YYYYYYYYYYYY} filedb -i 3

Last Update: 14 Apr. 2010