FreeBSD ハンドブック : セキュリティ : S/KEY
Previous: `crypt' メカニズムを理解する
Next: 信頼できる通信路での初期化

6.2. S/KEY

原作: Garrett Wollman <wollman@FreeBSD.ORG>
25 September 1995.

訳: 日野 浩志 <hino@nwk.cl.nec.co.jp>.
24 September 1996.

S/KEY は一方向ハッシュ関数 (ここで述べているバージョンでは, 過去と の互換性を保つために MD4 を用いています. S/KEY の他のバージョンでは MD5 や DES-MAC を用いているものもあります) を基にしたワンタイムパスワー ド方式です. S/KEY は, バージョン 1.1.5 以降のすべての FreeBSD に標準的 に含まれています. S/KEY は FreeBSD 以外の数多くのシステムの上でも利用 可能であり, その実装の数も増えています. S/KEY ば Bell Communications Research, Inc. の登録商標です.

以下の説明では, 三種類の異なる「パスワード」が使われます. まず一つ 目は, あなたが普段使っている普通の UNIX スタイルの, もしくは Kerberos でのパスワードです. ここではこれを ``UNIX パスワード'' と呼ぶことにし ます. 二つ目は, S/KEY の `key' プログラムによって生成され, `keyinit' プログラムとログインプロンプトが受け付ける, 一回限りの パスワードです. ここではこれを ``ワンタイムパスワード'' と呼ぶことにし ます. 三つ目のパスワードは, `key' (と場合により `keyinit') プログラムに対してユーザが入力する秘密のパスワードで, ワンタイムパスワー ドを生成するのに使われます. ここではこれを ``秘密のパスフレーズ'' もし くは単に ``パスフレーズ'' と呼ぶことにします. (訳注: ユーザが頭の中だ けにしまっておくべきものが, この秘密のパスフレーズです. なお, 原文では これをパスワードと表記していますが, 混乱を避けるために訳文ではすべて `` 秘密のパスフレーズ'' に統一しています.)

秘密のパスフレーズは, UNIX パスワードと同じである必要はありませんし, また UNIX パスワードと何らかの関連性を持たなければならないということも ありません (両者を同一に設定することは可能ですが, お奨めしません). UNIX パスワードは長さが 8 文字に制限されています (訳注: FreeBSD で DES を導入していない場合はもっと長いパスワードも認識されます). これに対し, S/KEY では秘密のパスフレーズを好きなだけ長くすることができます (訳注: 実装上, `key' コマンドなどのバッファ長で制限されてしまう可能性が あります. 200文字程度に押えておいた方がよいでしょう :-). 筆者は 7 語か らなる文を使っています. 通常の設定では, S/KEY システムは UNIX のパスワー ドシステムと完全に独立して動作するようになっています.

S/KEY システムでは他に二種類のデータを使用します. 一つは ``シード (種)'' または (混乱を招きますが) ``キー'' と呼ばれるもので, (訳注: デ フォルトでは) 二つの文字と五つの数字で構成されます. もう一つは ``シー ケンス番号'' で, 1 以上の整数です. シーケンス番号は特に指定しなければ 100以下です (訳注: ``keyinit' プログラムでは 9999 まで指定できま す). S/KEY はここまでに述べたデータを利用してワンタイムパスワードを生 成します. その方法は, まずシードと秘密のパスフレーズを連結し, それに対 してシーケンス番号の回数だけ一方向ハッシュ (RSA Data Security, Inc. に よる MD4 セキュアハッシュ関数) を繰り返し計算します. そしてその結果を 六つの英単語に変換します (訳注: ハッシュ計算の後, 64ビットに収まるよう にデータを処理したものが厳密な意味でのワンタイムパスワードです. 通常は ユーザの便宜のために, この 64ビットデータと六つの英単語との間で変換処 理をおこなっています) . `login' プログラムと `su' プログラム は, 前回最後に受け付けられたワンタイムパスワードを記録しています. そし て, その前回のワンタイムパスワードと, ユーザが入力したワンタイムパスワー ドを一回ハッシュ関数にかけた結果とが一致した場合に, このユーザは認証さ れます. 一方向ハッシュ関数を使うことにより, もし (ログイン等に成功した) ワンタイムパスワードが一回盗聴されたとしても, 次回以降に使われる複数の ワンタイムパスワードを生成することは不可能です. シーケンス番号はログイ ン (等) が成功するたびに一つずつ減らされて, ユーザとログインプログラム の間で同期が取られます. (シーケンス番号が 1 になったら, S/KEY を再度初 期化する必要があります.)

次に, S/KEY 関連の四つのプログラムについて説明します. `key' プ ログラムは, シーケンス番号と, シードと, 秘密のパスフレーズを受け付けて, ワンタイムパスワードを生成します. `keyinit' プログラムは, S/KEY を初期化するのに使用され, また秘密のパスフレーズやシーケンス番号やシー ドを変更するためにも使用されます. このプログラムを実行するには, 秘密の パスフレーズか, または, シーケンス番号とシードとワンタイムパスワードの 一組かの, どちらかが必要になります. `keyinfo' プログラムは, /etc/skeykeys というファイルを調べて, このプログラムを起動し たユーザの現在のシーケンス番号とシードを表示します. 最後に, `login' と `su' プログラムについてですが, これらは S/KEY の ワンタイムパスワードを, (訳注:システムが) ユーザを認証するものとして受 理する処理をおこないます. `login' プログラムは, 指定された特定の アドレスからの接続に対して, UNIX パスワードの使用を認めなくする機能, 逆に言えば S/KEY の利用を強制する機能も持っています.

このドキュメントでは, 四種類の異なる操作について説明します. 一つ目 は, `keyinit' プログラムを信頼できる通信路上で利用する場合で, 一 番始めに S/KEY を設定する操作や, 使い始めたあとで秘密のパスフレーズや シードを変更する操作です. 二つ目は, `keyinit' プログラムを信頼で きない通信路上で利用する場合で, 操作の目的は一つ目と同じです. この場合 には `key' プログラムを併用する必要があります. 三つ目は, `key' プログラムを使い, 信頼できない通信路を通じてログインする操 作です. 四番目は, `key' プログラムを使って, 複数のワンタイムパス ワードを一気に生成する操作です. ここで生成した複数のワンタイムパスワー ドは, メモしたり印刷したりして携帯し, 信頼できる通信路が一切ないところ (例えば展示会場など) で利用することができます. (訳注: ワンタイムパスワー ドを記録した紙をなくさないこと! 電話番号やIPアドレス, ユーザ名を一緒に メモしていたら最悪です!!)

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

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

6.2.3. ちょっと寄り道: ログインプロンプトについて

6.2.4. ワンタイムパスワードを生成する

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

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


FreeBSD ハンドブック : セキュリティ : S/KEY
Previous: `crypt' メカニズムを理解する
Next: 信頼できる通信路での初期化
FreeBSD Home Page
www@freebsd.org
Updated May 23, 1997