Ubuntu Weekly Recipe

第786回Ubuntuでもあこがれの指紋認証を

スマートフォンでは当たり前になった生体認証ですが、Windwos HelloのおかげでノートPCにも一般的に搭載されるようになってきました。特に指紋認証については、赤外線カメラを利用した顔認証よりもWindows Helloのハードウェア要件を満たしやすいからか、多くのノートPCに搭載済みです。今回はこの指紋リーダーを使って、Ubuntuログイン時の処理を「パスワードレス」にしてみましょう[1]

Ubuntuで指紋認証ログイン

実はUbuntuには最初から指紋認証でログインする仕組みが備わっています。よって対応している指紋リーダーデバイスがあればすぐにでも使えるのです。まずはそちらの手順を紹介しましょう。最初に「設定」「ユーザー」を開きます。もしサポートしている指紋リーダーが接続されていたら、そこに「指紋認証ログイン」が表示されるはずです。

図1 指紋リーダーが接続されているとパスワード以外に「指紋認証ログイン」が表示される
図1

表示されない場合は、⁠サポートしていないデバイス」が搭載されています。Ubuntuの指紋認証機能はfprintプロジェクトのソフトウェアを使用しており、現在はこちらのSupported Devicesに表示されているデバイスのみ対応しているからです。今回は富士通のノートPCである「LIFEBOOK WU-X/H1」で試しましたところ問題なく動いたため、hpやDell、Lenovoなどの世界的に使われているPCなら、サポートされている可能性はそれなりに高いでしょう。

さて、ここで「無効」になっている部分をクリックすると、指紋登録画面が表示されます。ユーザー固有の設定であるため、右上の「Unlock」を押す必要はありません。必要はないのですが、fprintdパッケージがインストールするPolkit側の設定で、あとで表示されるように指紋の登録や削除の際には本人の再認証が必要です。

図2 指紋の登録画面
図2

「新しい指紋の採取」を押すと、次のようにどの指を登録するかが求められます。指紋リーダーの位置に合わせて使いやすいものを登録しておきましょう。また、先ほど説明したように登録前に認証が必要です。

図3 登録する指の選択画面。指紋が残っている指を選ぼう
図3
図4 指を選択すると、認証が要求される
図4

指紋リーダーでの読み込み画面では「指紋っぽいアイコン」が表示されるので、指紋リーダーの上に指を置きます。画面では特に指示が表示されませんが、赤くなったら読み取り成功なので、一度指を離して再度指を置き直します。これを10回程度繰り返してください。普段認証する姿勢に合わせて読み取らせると良いでしょう。

図5 何回か指紋リーダーの上に指を置こう
図5

ちなみに指紋リーダーは「指を置く」タイプと「なぞる(スワイプする⁠⁠」タイプが存在します。上記のように「置いて」と表示されるものはそのまま指を置くだけで読み取ってくれます。⁠なぞって」と表示されるものは読み取り装置を上から下へ指をすべらせることで読み取ります。なぞるタイプについては、速度なども重要なので気をつけてください。

図6 無事に登録が完了した
図6
図7 元の画面に戻ると、⁠右の人差し指」が追加されている。うまく読み取れなくなった時は、その指を再登録することも可能だ
図7

これで指紋認証でログインできるようになりました。ユーザー画面でも指紋認証ログインが「有効」になっていることがわかります。

実際にログアウトして、指紋認証ログインできるか試してみます。Ubuntuのログイン画面では「ユーザーを選択」した上で「パスワードを入力」という流れになっています。指紋認証が動くのはこの「パスワードを入力」のタイミングです。よってEnterキーか何かで一度は「ユーザーを選択」する必要があります。

パスワード入力画面になると入力ボックスの下に「または指紋リーダーに指を置く」と表示されるので、そこで登録した指を起きましょう。無事にログインできたら、設定完了です。とても簡単でしたね。

ちなみに画面をロックした時の復旧にも指紋認証が使えます。こちらもパスワード入力画面になったら指紋リーダーに指を置くだけです。

残念ながらUbuntuの場合、管理者権限での実行が必要な処理の際に入力するウィンドウでは指紋認証は使えません。引き続きパスワード入力が必要です。

指紋リーダーデバイスとfprintdについて

Ubuntuで指紋認証を行うために必要な処理は「libfprintにリンクしたfprintd」と、設定の柔軟性が高い認証システムである「PAM」や、ログイン画面・ロック画面を表示する「GDM」が担ってくれています。特にfprintdはfprintプロジェクトが開発するデーモンで、指紋認証をしたい各種ソフトウェアと実際に使用する指紋リーダーデバイスの間に立って調整してくれるのです。認証が必要になった時に一時的に起動するfprintdのおかげで、fprintでサポートしている指紋リーダーデバイスであれば、ソフトウェア側は同じような手順で指紋認証を実装できます。

fprintがサポートしている指紋リーダーデバイスはUSB接続かSPIデバイスに大別されます。大抵はUSBデバイスでしょう。たとえば手元にある「LIFEBOOK WU-X/H1」については、次のような接続になっていました。

$ lsusb
Bus 004 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 003 Device 005: ID 06cb:0168 Synaptics, Inc.  => これが指紋リーダー
Bus 003 Device 002: ID 04f2:b7cb Chicony Electronics Co., Ltd Integrated Camera => こちらはカメラ
Bus 003 Device 004: ID 8087:0033 Intel Corp.
Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

このうち06cb:0168がSynaptics製の読み込みセンサーです。ちなみに「Chicony Electronics」のほうはカメラです。今回のモデルはWindows Hello未対応のカメラでした。詳細を表示するとわかるように、指紋リーダーは特定のデバイスクラスがあるわけではなく、個別にドライバーが必要なようです。

$ lsusb -v -s 003:005

Bus 003 Device 005: ID 06cb:0168 Synaptics, Inc.
Couldn't open device, some information will be missing
Device Descriptor:
  bLength                18
  bDescriptorType         1
  bcdUSB               2.00
  bDeviceClass          255 Vendor Specific Class
  bDeviceSubClass        16
  bDeviceProtocol       255
  bMaxPacketSize0         8
  idVendor           0x06cb Synaptics, Inc.
(後略)

さて、fprintにはCLIのツールもあります。実はUbuntuの設定ソフトウェアを使わなくても、こちらから指紋の登録や認証が可能です。

  • fprintd-list:デバイスと登録された指紋の一覧表示
  • fprintd-enroll:指紋の登録
  • fprintd-delete:登録された指紋の削除
  • fprintd-verify:指紋認証

個別に試してみましょう。まずはfprintd-listです。これはユーザーごとに登録されている指紋の状況を表示するツールです。ユーザー名を指定して実行してみましょう。

$ fprintd-list shibata
found 1 devices
Device at /net/reactivated/Fprint/Device/0
Using device /net/reactivated/Fprint/Device/0
Fingerprints for user shibata on Synaptics Sensors (press):
 - #0: right-index-finger

デバイスに/net/...と表示されているのはインターフェース名です。また、今回は右手の人差し指(right index finger)のみを登録しているためこのように表示されます。ちなみに指紋データは/var/lib/fprint以下に、ユーザーごと・デバイスごと・指ごとに分けて保存されます。中身はそれらの情報に加えて、指紋リーダーから渡されたビットパターンとなります。つまりこのデータは同じ指紋リーダーでしか利用できません。

指紋を登録したければfprintd-enrollを使います。これは設定ソフトウェアでやっていたことをCLIでやるだけです。ただし、引数を指定しない場合は既存の指紋データを削除した上で全部を登録し直します。既存のデータを残したい場合は、きちんと-f 指の引数を指定しましょう。たとえば右手の中指なら次のように指定します。ただし「なぞる」タイプのデバイスだと、引数未指定なら最初に登録可能な指のみを作り直すようです。

$ fprintd-enroll -f right-middle-finger shibata
Using device /net/reactivated/Fprint/Device/0
Enrolling right-middle-finger finger.
Enroll result: enroll-stage-passed
Enroll result: enroll-stage-passed
Enroll result: enroll-stage-passed
Enroll result: enroll-stage-passed
Enroll result: enroll-stage-passed
Enroll result: enroll-retry-scan
Enroll result: enroll-stage-passed
Enroll result: enroll-stage-passed
Enroll result: enroll-stage-passed
Enroll result: enroll-retry-scan
Enroll result: enroll-completed

fprintd-listを実行すると、新しい指の情報が登録されていることがわかります。引数として指定できる指の名前は次のとおりです。

  • 右手:right
  • 左手:left
  • 親指:thumb
  • 人差し指:index
  • 中指:middle
  • 薬指:ring
  • 小指:little

人差し指から小指までは{right,left}-{index,middle,ring,little}-fingerと末尾に「finger」を付けますが、親指はそれだけで一単語なので{right,left}-thumbとなります。

fprintd-deleteはその名の通り指紋データを削除します。-fオプションも指定可能ですが、無視して全部消してしまうようです。

fprintd-verifyを使うと、簡易的に指紋認証のテストが行えます。⁠簡易的に」と言っているのは、⁠どの指で認証するか」を明示的に指定しないといけないからです。未指定だと最初に登録されている指が使われます。

右手の人差し指でのチェック
$ fprintd-verify
Using device /net/reactivated/Fprint/Device/0
Listing enrolled fingers:
 - #0: right-index-finger
 - #1: right-middle-finger
Verify started!
Verifying: right-index-finger
Verify result: verify-match (done)

認証に失敗するとコマンドとしてはエラー(戻り値が1)となる
shibata@fmvuh:~$ fprintd-verify
Using device /net/reactivated/Fprint/Device/0
Listing enrolled fingers:
 - #0: right-index-finger
 - #1: right-middle-finger
Verify started!
Verifying: right-index-finger
Verify result: verify-no-match (done)

他の指で認証したければ明示的に指を指定する
$ fprintd-verify -f right-middle-finger
Using device /net/reactivated/Fprint/Device/0
Listing enrolled fingers:
 - #0: right-index-finger
 - #1: right-middle-finger
Verify started!
Verifying: right-middle-finger
Verify result: verify-match (done)

これらのコマンドはfprintdのテストアプリケーションという扱いです。実際のログイン時には、PAMがこれらのツールの代わりに動きます。具体的には主に次のファイルが関わってくるのです。

  • gdm3の/etc/pam.d/gdm-fingerprint
  • libpam-fprintdの/usr/lib/x86_64-linux-gnu/security/pam_fprintd.so

gdm-fingerprintではpam_fprintd.soが呼び出され、そのpam_fprintd.soがfprintdと連携して動作します。よってpam_fprintd.soを上手く使ってやれば、PAMを使うsudo等でも、指紋認証を利用可能です。

指紋認証のような生体認証は、多要素認証における一要素(生体情報)として使えます。しかしながらUbuntuに組み込まれているfprintdの場合は、スマートフォンで言う「画面のロック解除」程度の認証を想定した設定であり、他のサービスと連携することは意識していません。あくまで「ログインが楽になる」ものでしかない点に注意しましょう。

もちろん上手く設定すれば使えるかもしれませんが、もし多要素認証的な用途で使いたいのであれば、FIDO認証に対応したセキュリティキーを用意するほうが楽かもしれません。このあたりは次の記事が参考になるでしょう。

おすすめ記事

記事・ニュース一覧