14.5. ワンタイムパスワード

デフォルトで、FreeBSD は One-time Passwords In Everything (OPIE) に対応しています。 OPIE はデフォルトでは MD5 ハッシュを使用します。

三種類の異なる「パスワード」があります。 まず一つ目は、通常の UNIX® スタイル、もしくは Kerberos のパスワードです。 二つ目は、opiekey(1) によって生成され、 opiepasswd(1) およびログインプロンプトが受け付けるワンタイムパスワードです。 三つ目のパスワードは、opiekey(1) と場合により opiepasswd に対してワンタイムパスワードを生成するのに使われる 秘密のパスワード です。

秘密のパスワードは、UNIX® パスワードと何の関連性もありません。 両者を同一に設定することは可能ですが、お奨めしません。古い UNIX® パスワードは長さが 8 文字に制限されていました [5]。 これに対し、OPIE の秘密のパスワードには 8 文字の制限はありません。 6 語から 7 語からなるパスフレーズがふつうです。ほとんどの部分で、 OPIE システムは UNIX® のパスワードシステムと完全に独立して動作するようになっています。

パスフレーズに加え、OPIE システムにとって重要な 2 種類のデータがあります。一つは シード (seed: 種) または キー (key: 鍵) と呼ばれるもので、2 つの文字と 5 つの数字で構成されます。もう一つは シーケンス番号 (iteration count) で、1 から 100 までの整数です。 OPIE はここまでに述べたデータを利用してワンタイムパスワードを生成します。 その方法は、まずシードと秘密のパスフレーズを連結し、 それに対してシーケンス番号の回数だけ MD5 ハッシュを繰り返し計算します。 そしてその結果を 6 つの短い英単語に変換します。 この 6 つの英単語がワンタイムパスワードです。 認証システム (主は PAM) は、 前回最後に受け付けたワンタイムパスワードを記録しています。 そして、その前回のワンタイムパスワードと、 ユーザが入力したワンタイムパスワードを 1 回ハッシュ関数にかけた結果とが一致した場合に、 このユーザは認証されます。 一方向ハッシュ関数を使っているので、 もし正しく認証されたワンタイムパスワードが一回盗聴されたとしても、 次回以降に使われる複数のワンタイムパスワードを生成することは不可能です。 シーケンス番号はログインが成功するたびに一つずつ減らされて、 ユーザとログインプログラムの間で同期が取られます。 シーケンス番号が 1 まで減ったら、 OPIE を再度初期化する必要があります。

このプロセスに関連するいくつかのプログラムがあります。 opiekey(1) は、シーケンス番号と、シードと、 秘密のパスフレーズを受け付けて、ワンタイムパスワード 1 つ、 または一連のワンタイムパスワードの一覧を生成します。 opiepasswd(1) は、OPIE の初期化に加え、パスワード、 シーケンス番号やシードを変更するためにも使用されます。 このプログラムを実行するには、秘密のパスフレーズか、 または、シーケンス番号とシードとワンタイムパスワードの 1 組かの、どちらかを与えます。 opieinfo(1) は、 認証ファイル (/etc/opiekeys) を調べて、 プログラムを起動したユーザの現在のシーケンス番号とシードを表示します。

4 種類の異なる操作があります。 1 つ目は、opiepasswd(1) を信頼できる通信路上で利用して、 最初にワンタイムパスワードを設定したり、 秘密のパスフレーズやシードを変更する操作です。 2 つ目は、同じことを行うために opiepasswd(1) を信頼できない通信路上で利用する操作です。 この場合は信頼できる通信路経由の opiekey(1) を併用します。3 つ目は、opiekey(1) を使い、信頼できない通信路を通じてログインする操作です。 4 番目は、opiekey(1) を使って複数のワンタイムパスワードを一気に生成する操作です。 ここで生成した複数のワンタイムパスワードは、 メモしたり印刷したりして携帯し、 信頼できる通信路が一切ないところからの接続に利用できます。 (訳注: ワンタイムパスワードを記録した紙をなくさないこと! 電話番号や IP アドレス、ユーザ名を一緒にメモしていたら最悪です!!)

14.5.1. 信頼できる通信路での初期化

OPIE を初めて初期化するには、 opiepasswd(1) を実行してください。

% opiepasswd -c
[grimreaper] ~ $ opiepasswd -f -c
Adding unfurl:
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 unfurl OTP key is 499 to4268
MOS MALL GOAT ARM AVID COED

Enter new secret pass phrase: または Enter secret password: というプロンプトに対して、 パスワードまたはパスフレーズを入力してください。 このパスワードは、 ログインするときに使うワンタイムパスワードを生成するために使うものであり、 ログインのためのパスワードではありません。 ID から始まる行は、1 回分のパラメータで、 ログイン名とシーケンス番号とシードです。 ログインするときには、 システム側がこれらのパラメータを覚えていて表示してくれるので、 これらのパラメータを覚えておく必要はありません。 最後の行が、今述べたパラメータと入力された秘密のパスワードから計算されたワンタイムパスワードです。 次にログインするときに打ち込むべきワンタイムパスワードがこれです。

14.5.2. 信頼できない通信路での初期化

信頼できない通信路を使って秘密のパスフレーズを初期化または変更するためには、 opiekey(1) を実行するための信頼できる通信路を用意しておく必要があります。 たとえばそれは、 信頼できるマシンのシェルプロンプトだったりするでしょう。 (訳注: ここでの通信路とはマシンそのものになります。 信頼できるマシンとは、 信頼できる人がしっかり管理しているマシンということです)。 他に準備しておくものとして、シーケンス番号 (100 は適切な値といえるでしょう) と、場合によっては自分で考えた、 またはランダムに生成されたシードがあります。 信頼できない通信路を使うときには、opiepasswd(1) を使ってコンピュータを初期化してください。

% opiepasswd

Updating unfurl:
You need the response from an OTP generator.
Old secret pass phrase:
	otp-md5 498 to4268 ext
	Response: GAME GAG WELT OUT DOWN CHAT
New secret pass phrase:
	otp-md5 499 to4269
	Response: LINE PAP MILK NELL BUOY TROY

ID mark OTP key is 499 gr4269
LINE PAP MILK NELL BUOY TROY

デフォルトのシードで構わなければ、Return を押してください。アクセスパスワードを入れる前に、 あらかじめ用意しておいた信頼できる通信路へ移って、 先ほどと同じパラメータを入力します。

% opiekey 498 to4268
Using the MD5 algorithm to compute response.
Reminder: Do not use opiekey from telnet or dial-in sessions.
Enter secret pass phrase:
GAME GAG WELT OUT DOWN CHAT

信頼できない通信路の方に戻って、 生成されたワンタイムパスワードをコピーして対応するプログラムに入力します。

14.5.3. ワンタイムパスワードを一つ生成する

OPIE を初期化したら、 ログイン時には以下のようなプロンプトが出てくるでしょう。

% telnet example.com
Trying 10.0.0.1...
Connected to example.com
Escape character is '^]'.

FreeBSD/i386 (example.com) (ttypa)

login: <ユーザ名>
otp-md5 498 gr4269 ext
Password: 

OPIE のプロンプトには便利な機能が備わっています。 パスワードプロンプトに対して、 Return を押すとエコーモードに切り替わり、 タイプした文字がそのまま見えるようになるのです。 これは、 紙に印刷していたりするワンタイムパスワードを手で入力しなければならない場合に役立つ機能です。

次に、 このログインプロンプトに対して入力するワンタイムパスワードを生成してください。 これは、opiekey(1) プログラムを使える信頼できるマシン上で行わなければなりません。 このプログラムには Windows®, Mac OS® および FreeBSD 版があります。 どちらも、 コマンドラインからシーケンス番号とシードを指定しなければなりません。 ログインしようとしているマシンのログインプロンプトから直接カットアンドペーストすると楽でしょう。

信頼できるシステムで

% opiekey 498 to4268
Using the MD5 algorithm to compute response.
Reminder: Do not use opiekey from telnet or dial-in sessions.
Enter secret pass phrase:
GAME GAG WELT OUT DOWN CHAT

ワンタイムパスワードが生成されたので、 ログインを続けてください。

14.5.4. 複数のワンタイムパスワードを生成する

都合によっては、 信頼できるマシンや信頼できる通信路が一切確保できないようなことがあるでしょう。 このような場合には、opiekey(1) を使って複数のワンタイムパスワードを生成できます。 たとえば

% opiekey -n 5 30 zz99999
Using the MD5 algorithm to compute response.
Reminder: Do not use opiekey from telnet or dial-in sessions.
Enter secret pass phrase: <secret password>
26: JOAN BORE FOSS DES NAY QUIT
27: LATE BIAS SLAY FOLK MUCH TRIG
28: SALT TIN ANTI LOON NEAL USE
29: RIO ODIN GO BYE FURY TIC
30: GREW JIVE SAN GIRD BOIL PHI

-n 5 という引数によって 5 個のワンタイムパスワードを順に生成します。 また 30 は、 最後のシーケンス番号となるべき数字です。出力は使う順番とは に出力されていることに注意してください (訳注: 一番最初に使うワンタイムパスワードは一番最後に出力されたものです)。 もしあなたがセキュリティに偏執するなら、 この結果を紙と鉛筆を使って手で書き移した方がよいかもしれません。 そうでなければ、この結果を印刷すると良いでしょう。 ここで、 出力の各行はシーケンス番号とそれに対応する一回分のワンタイムパスワードです。 消費済みのワンタイムパスワードをペンで消していってください。

14.5.5. UNIX® パスワードの利用を制限する

OPIE は、ログインセッションの IP アドレスをベースとした UNIX® パスワードの使用を制限できます。 関連ファイルは、/etc/opieaccess で、 デフォルトで用意されています。 このファイルの詳細や、 このファイルを使用する際に考慮すべきセキュリィについては opieaccess(5) を確認してください。

以下は opieaccess の例です。

permit 192.168.0.0 255.255.0.0

この行では、(なりすましされやすい) IP ソースアドレスが、 ある値やマスクにマッチするユーザに対して、 UNIX® パスワードをいつでも許可します。

もし opieaccess のどのルールにも一致しなければ、 デフォルトでは非 OPIE ログインは使えません。



[5] FreeBSD では、標準のログインパスワードは、128 文字までとなります。

本文書、および他の文書は https://download.freebsd.org/ftp/doc/ からダウンロードできます。

FreeBSD に関する質問がある場合には、 ドキュメント を読んだ上で <questions@FreeBSD.org> まで (英語で) 連絡してください。

本文書に関する質問については、 <doc@FreeBSD.org> まで電子メールを (英語で) 送ってください。