明けましておめでとうございます

明けましておめでとうございます。今年もよろしくお願いします。
_ pam_usbを使ってUSBメモリで認証をする
Google+のDebianコミュニティにUSBメモリを使ってログインする動画が流れていたので試してみました。 (例ではubuntu/mintで説明しているのだけど、なぜDebianコミュニティに投稿したのだろう。謎。)
これを書く前に少しググってみたらpam_usb (aluzzardi/pam_usb GitHub)の開発の歴史は古く、USBメモリを使った認証ネタは結構あったよう 1 2 *3 ですが、今ならデバイス自動認識で面倒も少ないのでお手軽に使えるのではと思います。
pam_usbを試す前にライブCDなどを準備しておく
システムのpam周りをいじるので、ログインできなくなる可能性があります。 ですので、ライブCD/DVD/USBメモリなどをあらかじめ準備しておき、不測の事態に備えておいてください。
pam_usbのインストール
aptを使ってpamusb-commonをインストールするとlibpam-usbなど必要なものがインストールされます。
$ sudo aptitude install pamusb-common
pamusb-confを使ってUSBメモリとユーザーの登録
pam_usbは公開鍵認証でUSBメモリに秘密鍵を入れて認証もできるのですが、ひとまずはネタ元動画と同じようにUSBメモリを鍵にしてユーザーのログインをできるようにします。
USBメモリの登録
あらかじめ認証に使うUSBメモリを差しておきます。 そしてpamusb-confコマンドに --add-device オプションに適当なデバイス名(例ではUSBKEY)を指定して実行します。
$ sudo pamusb-conf --add-device=USBKEY(USBKEYには適当な名前をつけてください)
* No device configured for user "hoge".
[sudo] password for hoge:
Please select the device you wish to add.
* Using " silicon-power (E69508006873)" (only option)
Which volume would you like to use for storing data ?
* Using "/dev/sdb1 (UUID: 4683-EADE)" (only option)
Name : USBKEY
Vendor : Unknown
Model : silicon-power
Serial : E69508006873
UUID : 4683-EADE
Save to /etc/pamusb.conf ?
[Y/n] y
Done.
実行すると最後に「/etc/pamusb.confに保存しますか?」と尋ねられるので、保存して登録は終わりです。
ユーザーの登録
USBメモリを使ってログインするユーザーをpamusb-confコマンドを使って登録します。
$ sudo pamusb-conf --add-user=name=hoge
Which device would you like to use for authentication ?
* Using "USBKEY" (only option)
User : name=hoge
Device : USBKEY
Save to /etc/pamusb.conf ?
[Y/n] y
Done.
設定をすると/etc/pamusb.conf以外にUSBメモリに .pamusb という隠しディレクトリと認証用のファイルも作成されます。
$ ls -la /media/USBKEY/.pamusb/
合計 12
drwx------ 2 hoge hoge 4096 1月 1 12:45 .
drwx------ 3 hoge hoge 4096 1月 1 12:49 ..
-rw-r--r-- 1 hoge hoge 1024 1月 1 12:45 hoge.debian.pad
pamusb-checkを使って登録したUSBメモリ・ユーザーで認証できるかチェックする
登録したUSBメモリ・ユーザーで認証ができるかをチェックします。
登録したUSBメモリを差したままにしておき、pamusb-chekckを登録したユーザーで実行します。
$ pamusb-check hoge
* Authentication request for user "hoge" (pamusb-check)
* Device "USBKEY" is connected (good).
* Performing one time pad verification...
* Access granted.
問題なく認証できました。 --dump オプションを指定して設定を表示します。
$ pamusb-check --dump hoge
Configuration dump for user hoge (service: pamusb-check):
enable : true
debug : false
quiet : false
color_log : true
one_time_pad : true
deny_remote : true
pad_expiration : 3600 seconds
probe_timeout : 10 seconds
hostname : debian
system_pad_directory : .pamusb
device_pad_directory : .pamusb
登録していないユーザーでチェックしてみます。
$ pamusb-check fuga
* No device configured for user "fuga".
「デバイスに設定されていません」と出ました。 次にUSBメモリを抜いてpamusb-checkを実行します。
$ pamusb-check hoge
* Authentication request for user "hoge" (pamusb-check)
* Device "USBKEY" is not connected.
* Access denied.
USBメモリが接続されていないので拒否されました。
suやsudo、GDM3などの認証に使ってみる
pam_usbの設定は、関連パッケージのインストール時点で/etc/pam.d/common-authに設定されます(詳しくは後述)。 common-authはsuやlogin、各ディスプレイマネージャーの設定からincludeされているので、基本的には何もすることなくpam_usbの認証が使えることになります。
pamusb-checkが成功した人は、USBメモリを差したまま、端末で「su hoge」などを実行してsuで登録したユーザーに変更してみてください。パスワード無しでそのユーザーになれたはずです。
続いて、いったんログアウトして、登録したユーザーを選択してください。 これもパスワード無しでログイン出来たはずです。
/etc/pam.d/common-authの編集
pam_usbの設定はインストール時点で登録されるので基本的には変更することはありませんが、変更する場合についてちょっと考えてみました。
CASE1: USBメモリが差してあるとpam_usb認証、差してない場合はパスワード認証になる
pam_usb関連パッケージをインストールしたときの設定です。 pam_usbの認証を試してUSBメモリの認証に失敗すれば通常のパスワードログイン認証になります。
# here are the per-package modules (the "Primary" block)
auth sufficient pam_usb.so
auth [success=1 default=ignore] pam_unix.so nullok_secure try_first_pass
CASE2: USBメモリに登録したユーザーのみログイン可(パスワード認証のみのユーザーはログイン不可)
この設定はミスすると、ログインできなくなるので設定の際にはお気をつけ下さい。
パスワード認証を無効にして、USBメモリに登録したユーザーのみログインができる設定です。
common-authの17行目のpam_usbの設定を、 sufficient から required に変更して、18行目のpam_unixをコメントアウトします。 するとUSBメモリの認証しか行われなくなり、 USBメモリに登録されたユーザーだけ しかログインできなくなります。 (パスワードのみでログインするユーザーはログイン不可)
# here are the per-package modules (the "Primary" block)
auth required pam_usb.so
# auth [success=1 default=ignore] pam_unix.so nullok_secure try_first_pass
CASE3: USBメモリの登録ユーザーかつパスワードもログインに必要(パスワード認証のみユーザーはログイン不可)
この設定もミスすると、ログインできなくなるので設定の際にはお気をつけ下さい。
CASE2以上に使う人がいるのかと思いますが、パスワード認証のみのユーザーはログイン不可、USBメモリにユーザーを登録してあり、なおかつパスワード認証に成功した人のみがログインできる設定です。
設定はcommon-authの17行目のpam_usbの設定を required 、18行目のpam_unixが有効にします。
# here are the per-package modules (the "Primary" block)
auth required pam_usb.so
auth [success=1 default=ignore] pam_unix.so nullok_secure try_first_pass
*1 USBメモリを認証キーにするには(テキストログイン編) − @IT
*3 PAM USBを使ってみる - KUNITAKE's Wiki
_ それにしても
新年早々何をかいてるんだか。 年末はバタバタしてて掃除できなかったから掃除しよ。