ネットワークに流れる平文のパスワードを盗聴して、それを利用してサーバに 侵入されることを防御する手段の 1つに、OTP(One Time password)があります。 認証時のパスワードを 1回限りの使い捨てのパスワードにすることによって、 パスワードの盗聴を無意味なものにします。
有名なフリーの OTPパッケージとして、S/Key(logdaemon)と、 OPIE(One Time Password In Everytime)があります。OPIEは、S/Key の修正版として、 US Naval Research Labratory(NRL)で開発されました。今回は、この OPIEを インストールします。
OPIEを導入して、ワンタイムパスワードが使用できるのは、rlogin,rsh,rcp などの r系サービス、telnet、su コマンドなどです。
OPIEのOTPは、種(Seed)と呼ばれる文字列、シーケンス番号、秘密パスフレーズの 3つから生成されます。使用に先立って、サーバ上で、ユーザ毎に種と最初の OTPの保存が行われます。認証のたびに、サーバから種と、毎回1つずつ減っていく シーケンス番号が提示され、ユーザは、その種とシーケンス番号、および 秘密パスフレーズをOTP Generator に入力して、OTPを生成します。この OTPを サーバに送ることで、認証が行われます。
OTP Generator による OTPの生成は、「種+秘密パスフレーズ」の MD5 による ハッシュ化を、シーケンス番号の回数分だけ行うことで行われます。例えば、 シーケンス番号が 3である場合には、OTP=MD5(MD5(MD5(種+秘密パスフレーズ)))で求められます。サーバには、認証が行われるたびに、そのときの OTPが保存 されています。次回の認証時には、シーケンス番号が 1つ減っているので、 送られてきた MD5 によるハッシュ化を 1回行って、前回の OTP と 比較することにより認証が行われます。
サーバに保存されている情報は、ユーザ毎の種と現在のシーケンス番号、 前回認証時の OTPだけです。そこから秘密パスフレーズが導き出されるような 要素は含まれていません。また、保存されている OTPから、次回の OTPを推定する ことも不可能です。認証時にネットワーク上に流れるのは、種とシーケンス番号と OTPです。秘密パスフレーズが無くては、次の OTP を生成できませんので、これらが 盗聴されたとしても安全です。
ここでは、OPIEを FreeBSd-2.2.8Release にインストールします。 以下の URL
http://ftp.cc.chuo-u.ac.jp/home/pub/security/misc/
より、OPIE を入手します。今回は、opie-2.32.tar.gz を入手しました。入手後、 適当なディレクトリで解凍・展開し、ディレクトリを移動します。% tar xvfz opie-2.32.tar.gz % cd opie-2.32インストールは簡単で、以下のように configure スクリプトを実行し、 make , make install を実行します。% ./configure % make % su Password: # make installインストールが終了すると、login、su、ftpd といったコマンドが、OTP対応のものに 置き換えられます。元のコマンドは、login.opie.old、su.opie.old、ftpd.opie.old といったファイル名で保存されます。なお、# make uninstallを実行すれば、全て元通りに戻ります。
まだ、鍵を作成していないので、コンソール以外での login は不可能になります。 別のマシンから、telnet を試みるとlogin: sakai otp-md5 139 fu2837 ext Response:というように、シーケンス番号と種を表示して、レスポンスを求められ、 ログインできません。
鍵の生成を行います。opiepasswd というコマンドを使用しますが、コンソール上で 行う場合と、リモートで行う場合とで、方法が異なります。以上の 2通りの方法で、鍵を生成することができます。
- コンソール上で行う
コンソール上で行う場合は、以下のように opiepasswd に -c オプションをつけて 実行します。-c オプションをつけると、秘密パスフレーズの入力を求められます。% opiepasswd -c Adding sakai: Only use this method from the console; NEVER from remote. If you are using telnet, xterm, or a dial-in, type ^C now or exit with no password. Then run opiepasswd without the -c parameter. Using MD5 to compute responses. Enter new secret pass phrase: Again new secret pass phrase: ID sakai OTP key is 499 fu5188 CAKE FOE ROD BODY WHY OUST以上の操作により、シーケンス番号:499 種 :fu5188 OTP :CAKE FOE ROD BODY WHY OUSTが生成されました。
- リモートで行う
リモート上で鍵の作成を行うには、手元のマシンに OTP Generator が必要です。
まず、以下のように opiepasswd を実行します。% opiepasswd Adding sakai: You need the response from an OTP generator. new secret pass phrase: otp-md5 499 fu5188 response:以上の操作により、シーケンス番号:fu5188、種:499 が表示され、 レスポンスの入力を求められます。
次に、手元のマシン上の OTP Generator で OTP を生成します。 opiekey コマンドにシーケンス番号と種をパラメータとして与えます。% opiekey 499 fu5188 Using the MD5 algorithm to compute response. Reminder: Don't use opiekey from telnet or dial-in sessions. Enter secret pass phrase. CAKE FOE ROD BODY WHY OUST以上により、OTP:CAKE FOE ROD BODY WHY OUST が生成されます。
これを、opiepasswd の response: に与えます。response:CAKE FOE ROD BODY WHY OUST ID sakai OTP key is 499 fu5188 CAKE FOE ROD BODY WHY OUST
以下に、使用例を示します。どれも、シーケンス番号と種を表示し、レスポンスを 求められます。なお、FreeBSD で、DES をインストールしてある場合には、 認証に失敗します。DES については、ここを御覧下さい。シーケンス番号は、認証のたびに 1つずつ減っていくので、ゼロになる前に 鍵を生成し直す必要があります。シーケンス番号の初期値はデフォルトで 500ですが、 opiepasswd の -n オプションで指定可能です。
- telnet
% telnet 192.168.1.x login: sakai otp-md5 499 fu5188 ext Response: CAKE FOE ROD BODY WHY OUST Last login: Wed Jun 7 23:54:24 from 192.168.1.y ... ...- ftp
% ftp 192.168.1.x 220 FTP server (Version 6.00) ready. Name (192.168.1.x:sakai): sakai 331 Response to otp-md5 499 fu5188 ext required for sakai password: 230 User sakai logged in.- su
% su otp-md5 493 nd0295 ext root's response: #
OPIEで面倒なのは、OTP Generator を使用して、毎回 OTP を計算しなくてはならない 点です。しかし、Windows や Mac 用で、非常に使い勝手のよいフリーソフトが あります。
以下のURL
http://tama.gate.nec.co.jp/so/dotkey95080.zip
に、NEC製の Windows95/NT 用のフリーソフトである dotkey95 があります。