スマートフォン/ガラケー/PDA等を使ってワンタイムパスワードを実現するMobile-OTPのススメ
第2回 qpstudy02の懇親会において即席でMobile-OTPを紹介したのだが、そういえばまとめてなかったのでつらつらと書いてみる。
ところでみなさんRSAのSecurIDのようなセキュリティトークンに憧れませんか?
wikipedia:セキュリティトークンとは(一部抜粋)
セキュリティトークン(ハードウェアトークン、認証トークン、暗号トークン)とは、コンピュータサービスの利用権限のある利用者に、認証の助けとなるよう与えられる物理デバイスのことである。
このようなセキュリティトークンを個人用途でも使いたいと思いませんか?思いますよね?え、思わない?では今すぐ思って下さい。
安価に同様の実装ができないか調べたところ、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するだけ。
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
実際に使ってみる
Linuxでhogeでログインしようとすると、passcodeを求められる。
lets login: hoge passcode:
ここで先ほどのサーバ設定において/etc/security/motp.confで設定したPINコードをモバイル端末に入力する。
すると、6桁のワンタイムパスワードが表示される。
このワンタイムパスワードをpasscodeとして入力すればログインできる。
参考:その他の端末用Mobile-OTPの紹介
それぞれいくつか実装があるので、気に入ったものを使うといい。
iPhoneやAndroidはAppsやマーケットで「Mobile-OTP」または「MOTP」で検索すると同様のアプリが見つかるかも。
PAM以外の用途
オフィシャルサイトのAdd-OnsやLinksには様々な応用例が紹介されている。一部引用して紹介。
- RADIUSとして機能するMobile-OTP Authentication Server(MOTP-AS)
- MOTPのPHP実装とそのPerl移植版
- 上のPHP実装はリプレイ攻撃に弱いので対策を施したPHP実装
- DrayTek社のルータ製品Vigor 2955はネイティブにMobile-OTP対応らしい
- OpenIDプロバイダのClavid AGはMobile-OTPもサポートしているので、例えばFacebookにMobile-OTPでログインも可能
- Changing Information Technology Inc.はMOTPを利用したトータルソリューションを提供している模様
などなど。詳しくはオフィシャルサイトを参照。
*1:ちなみにWindowsMobile用Mobile-OTPは見つからなかった。