PAM USBを使ってみる

潟若若菴遵

[Linux]

はじめに

発行日付: 2004/7/9

http://www.kunitake.org/xoops/modules/xfsection/article-56.html

を Wiki に直したものです。内容は同じになっています。

本文

以前、日記でも紹介した

PAM usb

で遊んで見ました。これは、USBメモリを挿すことにより、認証することを可能にするソフトです。

最新版は、3.0.0 ですが、古いものでよければ

にそれぞれのパッケージが用意されているようです(今は 3.0.0 のパッケージも出たかな?)

ここでは普通にソースコードからコンパイルしていれてみました。

コンパイル

$ tar zxvf pam_usb-0.3.0.tar.gz
$ cd pam_usb-0.3.0
$ ./configure
$ make
$ sudo make install

すると

/usr/bin/usbadm
/usr/bin/usbhotplug
/etc/hotplug.d/default/pamusb.hotplug
/etc/pam.d/usbhotplug
/etc/pam_usb/handler/xlock.sh
/etc/pam_usb/hotplug.conf
/lib/security/pam_usb.so

こんなファイルがそれぞれインストールされることになるでしょう。USBを使うだけあって、hotplug などがインストールされている必要がありますが、この 3.0.0 では、独自に usbhotplug というツールが用意されていますので、必要であれば

/etc/pam_usb/hotplug.conf

を適切に設定して、有効化してやってください。普通は hotplug などをインストールされているでしょうから、不要だと思いますが。

運用形態

実際の利用では、通常の PAM module と同様に /etc/pam.d/ 以下のファイルに指定することになります。また、指定方法によって、3種類の運用を選択することができます。

1. USBメモリのみで認証

auth required pam_usb.so

ただし、

auth required pam_unix.so

の欄をコメントしておかなくてはいけません。

2. USBメモリが挿していなければ、パスワード認証を行なう。

auth sufficient pam_usb.so

ただし、

auth required pam_unix.so

という行よりも前に記述する必要があります。

3. USBメモリでの認証かつパスワード認証必須

auth required pam_usb.so

auth required pam_unix.so

よりも前に記述しておけば、USBメモリを挿しておき、さらにパスワード認証を経ないとログインできないようにすることができます。

ここで注意があります。Linux 2.6系では、

auth required pam_usb.so !check_device

というように !check_device を指定しないと動作しません。これは /proc のフォーマットが 2.4系と異なるため、Workaround として指定する必要があります。今後出るであろう新バージョンでは修正される可能性もありますが、現在は回避策として指定しておいてください。

また USB メモリ以外を指定する場合は

auth required pam_usb.so !check_device !check_if_mounted force_device=/dev/fd0

の様に、チェック対象となる device を指定する必要があります(この例だとフロッピーディスク)

認証用鍵の生成

さてさて、なにはともあれ、USBメモリに鍵を生成する必要があります。とりあえず usbメモリをマウントしてください。

# mkdir /mnt/usb
# mount /dev/sda1 /mnt/usb

多分多くの方はこんな感じになるのではないでしょうか?

で、先程インストールしたusbadm を使って認証用の秘密鍵と公開鍵を作成します。コマンドの引数には

keygen "mntpoint" "user" "bits"

といった感じで、それぞれ USBメモリの のマウントポイント、ユーザ名、生成する DSA鍵対のビット数を指定します。

# usbadm keygen /mnt/usb root 2048

USBメモリのファイルシステムによっては、こんな感じで .auth ディレクトリが作れず、失敗してしまいます。

# usbadm keygen /mnt/usb root 2048
[!] Directory /root/.auth/ not found, creating one...
[!] Directory /mnt/usb/.auth/ not found, creating one...
[-] Unable to locate and/or create keys directories

その場合には FAT ではなく、VFATや EXT2等で、フォーマットしなおしましょう。うまく行けばこんな感じです。

# usbadm keygen /mnt/usb root 2048
[!] Directory /mnt/usb/.auth/ not found, creating one...
[!] Generating 2048 DSA key pair for root@stardust
[!] Extracting private key...
[+] Private key extracted.
[+] Private key successfully written.
[!] Writing public key...
[+] Public key successfully written.

PAM USB 3.0.0 は、linux 2.6 のサポートが完全ではなく、2.4系でしか使えませんが、USBにはシリアル番号があるので、こいつでログインを許可/不許可することも可能のようです。たとえ DSA の秘密鍵が複製されてしまっても、USBメモリのシリアル番号が一致しないと、ログインできないことになります。

実際の利用

たとえば、sudo で PAM USB を使おうと、

/etc/pam.d/sudo
auth required pam_usb.so fs=vfat !check_device

とした場合(USBメモリのファイルシステムを VFAT と明示的に指定しないと、ext2 としてマウントしにいってしまう)、評価されるのは、sudo を実行するユーザなので、上の usbadm でのユーザには、sudo を使用するユーザを指定する形で、あらかじめ鍵対を作っておく必要があります。

ちなみに

/etc/pam.d/sudo
auth required pam_usb.so fs=vfat debug !check_device

としてデバッグモードで、sudo を実行すると以下のようになります。

$ sudo -s
[pam.c:132] Searching the utmp entry for tty pts/6...
[pam.c:146] Authentication request from pts/6 (:0.0)
[device.c:400] Found a valid device (/dev/sda)
[device.c:346] Creating temporary mount point...
[device.c:354] Scheduling [/tmp/pam_usb5umq66] for dropping
[device.c:358] Using /tmp/pam_usb5umq66 as mount point
[device.c:286] Trying to guess device name...
[device.c:218] Parsed 0 mount options ()
[device.c:238] Trying to mount /dev/sda1 on /tmp/pam_usb5umq66 using vfat
[device.c:254] Device mounted, trying to open private key
[device.c:176] Opening /tmp/pam_usb5umq66/.auth/kunitake.stardust
[device.c:262] Private key opened
[auth.c:137] Private key imported
[auth.c:145] Public key imported
[device.c:449] Dropping [/tmp/pam_usb5umq66]
[dsa.c:78] Checking DSA key pair...
[dsa.c:88] Signing pseudo random data [1 time(s)]...
[dsa.c:95] Valid signature
[dsa.c:88] Signing pseudo random data [2 time(s)]...
[dsa.c:95] Valid signature
[dsa.c:88] Signing pseudo random data [3 time(s)]...
[dsa.c:95] Valid signature
[pam.c:205] Access granted
#

他にもいろいろなオプションが用意されていますので、ドキュメントを参考にいろいろと試してみては如何でしょうか?

Configuration options

ChangeLog

2008/09/09 Wiki に移動

一部URLを修正

2004/07/09 初出