[Linux]
発行日付: 2004/7/9
http://www.kunitake.org/xoops/modules/xfsection/article-56.html
を Wiki に直したものです。内容は同じになっています。
以前、日記でも紹介した
で遊んで見ました。これは、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 #
他にもいろいろなオプションが用意されていますので、ドキュメントを参考にいろいろと試してみては如何でしょうか?
一部URLを修正