Gマイナー志向

とくに意味はありません

スマートフォン/ガラケー/PDA等を使ってワンタイムパスワードを実現するMobile-OTPのススメ

第2回 qpstudy02の懇親会において即席でMobile-OTPを紹介したのだが、そういえばまとめてなかったのでつらつらと書いてみる。

ところでみなさんRSAのSecurIDのようなセキュリティトークンに憧れませんか?

wikipedia:セキュリティトークンとは(一部抜粋)

http://upload.wikimedia.org/wikipedia/commons/thumb/8/8f/SecureID_token_new.JPG/800px-SecureID_token_new.JPG
セキュリティトークン(ハードウェアトークン、認証トークン、暗号トークン)とは、コンピュータサービスの利用権限のある利用者に、認証の助けとなるよう与えられる物理デバイスのことである。

概要

セキュリティトークン(ハードウェアトークン)は、多くはポケットや財布に入れて持ち運べる程のサイズで、利用者のキーチェーンにつけられるように設計されているものもある。
カードサイズのトークンには、暗証番号を入力するための小さいキーパッドや、ワンタイムパスワードを表示する小さな表示部を備えるものもある。また、USB端子に挿入して使用するものもあり、その場合は市販のUSBメモリーのような小型のものが多い。

このようなセキュリティトークンを個人用途でも使いたいと思いませんか?思いますよね?え、思わない?では今すぐ思って下さい。

安価に同様の実装ができないか調べたところ、Mobile-OTPというのを見つけたので紹介。

Mobile-OTPとはなにか

Mobile One Time Passwordsの略称で、モバイル端末(携帯電話やスマートフォンPDAなど)を使ってセキュアなワンタイムパスワードを実現するソリューションの指す。

Mobile-OTPは時間同期タイプのワンタイムパスワードになる。wikipedia:ワンタイムパスワードから一部抜粋。

時刻同期タイプOTPの実装

時刻同期ワンタイムパスワードはしばしば物理的なハードウェアトークン (ワンタイムパスワードを生成する個人用トークンが各ユーザーに配布される)とともに用いられる。トークン内部は認証サーバーの時計と同期し続ける正確な時計となっている。こうしたOTPシステムにおいては、新しいパスワードは以前のパスワードや秘密鍵よりもむしろ現在の時刻に基づいて生成されるため、時刻はパスワード・アルゴリズムの重要な部分を占める。
時刻同期ワンタイムパスワードを生成するために、しばしば携帯電話やPDAが用いられる。このアプローチは、多くのインターネットユーザーがすでに携帯電話を保有していることから、よりコスト効率の高い選択肢になりうる。さらに、このアプローチでは、ユーザーがアクセスする必要のあるセキュリティ・ドメインごとに異なるハードウェアトークンを携帯しなくてもすむため、より利便性に優れているといえる。

Mobile-OTPはソースは公開されており誰でも実装が可能。また、使える端末が豊富でiPhone/Android/BlackBerryなどの各種スマートフォンはもちろんのこと、PalmOS、webOS、Openmoko、さらにはJava(J2ME MIDlet)があれば動作するので日本の携帯電話でも使える*1

Mobile-OTPの詳細な解説や仕組みはオフィシャルサイトを参照。

実践

Mobile-OTPは様々な認証用途に使えるのだが、ここではPAMを用いてサーバのログイン認証に使用してみる。

モバイル端末を用意する

ここでは例としてJavaに対応したウィルコム端末WX330Kでの事例を紹介する。
なお、Mobile-OTPではサーバとモバイル端末の日時が同期されていることを前提としているため、モバイル端末は自動時刻同期機能を持つものか、こまめに日時を手動で調整するのが望ましい。

WX330KにMobile-OTPをインストールする

オフィシャルサイトのDownloadsからMobileOTP.jadをダウンロード、インストール。このリンク先にWX330Kからアクセスすればダウンロードが自動的に始まった。
端末によってはMobileOTP.jarを別途インストールする必要があるかもしれない。

Mobile-OTPの設定

Mobile-OTPを起動すると次のような画面になる。

Enter PIN:には0000と入力。0000は初期化を意味する。

25 random keys:と表示されたら、入力欄にランダムな数字を入力する。

ここで入力する番号は覚えておく必要はない。むしろ覚えられないようなランダムな羅列がいい、と思う。

Init-Secret=で16桁の英数字が表示される。

これを後ほどサーバの設定ファイルにsecretとして登録するので値を控えておく。
このsecretを書き換えたい場合は、Enter PIN:で0000と入力して設定しなおせばいい。複数のsecret(プロファイル)は記憶できず上書きになるので注意。

複数のプロファイルを保存できる実装もあるが私はまだ試していない。試してみたい方はこちらからどうぞ

これで準備完了。

サーバ側の設定

インストール

まずtarballからインストールする。
http://motp.sourceforge.net/pam_mobile_otp-0.6.1.tgz

展開したら基本的にmake && make installするだけ。

Gentoo用のpam_mobile_otpのebuildはこちら

motp.confの設定

tarball内のmotp.confを/etc/security/motp.confにコピーし、編集。ここでuser, secret, pin, GMT offsetを設定する。
userはMobile-OTPでのログインを許可するアカウント名、secretは先ほど控えておいたsecretの値。pinは任意の数字を設定できる。Mobile-OTPによって使用できる桁数は異なるが、とりあえず4文字で設定。GMT offsetは特にいじる必要はない。

# user  secret (max 32 hex)     pin     GMT offset (h)
hoge    d2693a5c39e7e769        1234    0
PAMの設定

auth, account, passwordを任意のPAMに設定。ここではサンプルとして/etc/pam.d/system-authに設定した。

--- system-auth.orig	2010-11-24 00:29:06.882784391 +0900
+++ system-auth	2010-11-24 00:28:44.994953870 +0900
@@ -1,12 +1,15 @@
+auth		sufficient	pam_mobile_otp.so not_set_pass
 auth		required	pam_env.so 
 auth		required	pam_unix.so try_first_pass likeauth nullok 
 auth		optional	pam_permit.so
  
 account		required	pam_unix.so 
+account		required	pam_mobile_otp.so
 account		optional	pam_permit.so
  
 password	required	pam_cracklib.so difok=2 minlen=8 dcredit=2 ocredit=2 retry=3 
 password	required	pam_unix.so try_first_pass use_authtok nullok sha512 shadow 
+password	required	pam_mobile_otp.so debug
 password	optional	pam_permit.so
  
 session		required	pam_limits.so 

実際に使ってみる

Linuxhogeでログインしようとすると、passcodeを求められる。

lets login: hoge
passcode:

ここで先ほどのサーバ設定において/etc/security/motp.confで設定したPINコードをモバイル端末に入力する。

すると、6桁のワンタイムパスワードが表示される。

このワンタイムパスワードpasscodeとして入力すればログインできる。

参考:その他の端末用Mobile-OTPの紹介

それぞれいくつか実装があるので、気に入ったものを使うといい。

iPhoneAndroidはAppsやマーケットで「Mobile-OTP」または「MOTP」で検索すると同様のアプリが見つかるかも。

PAM以外の用途

オフィシャルサイトのAdd-OnsやLinksには様々な応用例が紹介されている。一部引用して紹介。

などなど。詳しくはオフィシャルサイトを参照。

*1:ちなみにWindowsMobile用Mobile-OTPは見つからなかった。