S/KEY

原作: Garrett Wollman 25 September 1995.

訳: 日野 浩志 . 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アドレス, ユーザ名を一緒に メモしていたら最悪です!!)

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

信頼できる通信路 (例えばあるマシンのコンソール画面など) を利用して いるときに, S/KEY の初期化, S/KEY の秘密のパスフレーズの変更, またはシー ドの変更をおこなうことができます. そのためには, まずあなた自身がログイ ンし, keyinit コマンドを以下のようにパラメタなしで実行します:

% keyinit
Updating wollman:           ) この部分は始めて S/KEY を使
Old key: ha73895            ) うときには表示されません.
Reminder - Only use this method if you are directly connected.
If you are using telnet or rlogin exit with no password and use keyinit -s.
    ) `keyinit' コマンドが出力する注意です. 訳すと,
    ) 注意 - この動作モードはマシンに直接入力しているときのみ利用
    ) すること. もし今 telnet や rlogin を使っているなら, 秘密のパ
    ) スフレーズを入力せずにこのままコマンドを終了し, かわりに
    ) keyinit -s を実行すること.
Enter secret password:           ) ここで秘密のパスフレーズを入力します.
Again secret password:           ) もう一回入力します.

ID wollman s/key is 99 ha73896      ) あとで説明します.
SAG HAS FONT GOUT FATE BOOM     )

上の例で出てきた事柄について説明しましょう. Enter secret password: というプロンプトに対してあなたが考えた秘密のパスフレーズを 入力します (筆者は 7 単語以上の文を秘密のパスフレーズにしています). こ の秘密のパスフレーズは後でログインするために 必要になるものです. `ID' から始まる行は, S/KEY における一回分のパラメタであり, あなたのログイ ン名とシーケンス番号とシードです. (訳注: `keyinit' コマンドは次回 にログインするときに使われるパラメタを参考のために ここで表示しま す. ) S/KEY を使ってログインするときには, システム側が自動的にこれらの パラメタを表示してくれますから, これらのパラメタを覚えておく必要は ありません. 最後の行が, 今述べたパラメタと入力された秘密のパスフレー ズから計算されたワンタイムパスワードです. この例を実行した後, 次にログ インするときに打ち込むべきワンタイムパスワードが これです.

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

信頼できない通信路を使って S/KEY を初期化, または秘密のパスフレーズ やシードを変更するためには, 信頼できる通信路として, その信頼できない通 信路とは別のものを用意する必要があります. その信頼できる通信路は key プログラムを実行するために必要となるもので, 例えばそれは, あなたが信頼できる Macintosh のデスクアクセサリや信頼できるマシンのシェ ルプロンプトだったりするでしょう (そこでの操作に関しては後述します). (訳注: ここでの通信路とはマシンそのものになります. 信頼できるマシンと は, 信頼できる人がしっかり管理しているマシンということです.) 他に準備 しておくものとして, シーケンス番号 (100は適切な値といえるでしょう) と, 場合によっては自分で考えた, またはランダムに生成されたシードがあります. あなたが S/KEY を初期化しようとしているマシンへの通信路が, 信頼できな いものである場合には keyinit -s コマンドを以下のように使用しま す:

% keyinit -s
Updating wollman:
Old key: kh94741
Reminder you need the 6 English words from the skey command.
    ) `keyinit' コマンドが出力する注意です. 訳すと,
    ) 注意 - skey コマンドの出力する 6 英単語が必要になります.
Enter sequence count from 1 to 9999: 100   ) ここを入力.
Enter new key [default kh94742]:       ) リターンのみ入力.
s/key 100 kh94742

デフォルトのシード (keyinit プログラムは困ったことにこれを key と 読んでいるのですが, 混乱しないよう注意してください) で構わなければ, リ ターンキーを押してください. 次に, あらかじめ用意しておいた信頼できる通 信路 (信頼できるマシンや信頼できる S/KEY デスクアクセサリなど) へ移っ て, 先ほどと同じパラメタを入力します.

$prompt.user; key 100 kh94742
Reminder - Do not use this program while logged in via telnet or rlogin.
Enter secret password:       ) ここで秘密のパスフレーズを入力します.
HULL NAY YANG TREE TOUT VETO

ここで信頼できない通信路の方に戻って, key コマンドが出力したワ ンタイムパスワードをコピーして keyinit プログラムに入力します.

s/key access password: HULL NAY YANG TREE TOUT VETO
ID wollman s/key is 100 kh94742
HULL NAY YANG TREE TOUT VETO

後は, 前章で説明したことと同様です.

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

どうやってワンタイムパスワードを生成するかを説明する前に, S/KEY を 使う場合のログインプロンプトを 見ておいた方がよいでしょう.

% telnet himalia
Trying 18.26.0.186...
Connected to himalia.lcs.mit.edu.
Escape character is '^]'.
s/key 92 hi52030
Password:

パスワードを要求する前に, ログインプログラムがシーケンス番号とシードを 表示していることがわかります. この二つのパラメタを使ってワンタイムパ スワードを計算することになります. ここではまだ使っていませんが, 便利な 機能がログインプログラムに備わっています: パスワードプロンプトに対して, 何も入力せずにリターンを押すとエコーモードに切り替わります. つまりタイ プした文字がそのまま見えるようになるのです. これは S/KEY のワンタイム パスワードを紙に印刷していた場合など, ワンタイムパスワードを手で入力し なければならない場合に特に役立つ機能です.

このログインしようとしてるマシンが, あなたが今使っているマシンから UNIX パスワードを使ってログインすることができないように 設定されている 場合があります. その場合には, ログインプロンプトには S/KEY のワンタイ ムパスワードの利用が必要であることを示す (s/key required) という注釈が表示されます.

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

次に前章のログインプロンプトに対して入力するための ワンタイムパスワー ドを生成しましょう. そのために, 信頼できるマシンと key プログラ ムを使用します. (key プログラムには DOS や Windows の上で動くも の, Macintoshのデスクアクセサリとして動くものなどもあります.) コマンド ラインで key プログラムを起動するときには, シーケンス番号とシー ドを引数として指定します. 入力が面倒な人は, ログインプロンプトに表示さ れたもののうちで key からその行の最後までを, そのままカットア ンドペーストすることもできます. key プログラムの実行は以下のよ うになります:

% key 92 hi52030               ) 前章の例からペースト.
Reminder - Do not use this program while logged in via telnet or rlogin.
Enter secret password:               ) 秘密のパスフレーズを入力.
ADEN BED WOLF HAW HOT STUN

そして別のウィンドウで:

s/key 92 hi52030               ) 前章の例の続き.
Password:                   ) ここでリターンキーを押した.
 (turning echo on)
Password:ADEN BED WOLF HAW HOT STUN
Last login: Wed Jun 28 15:31:00 from halloran-eldar.l
[以下略.]

以上の手順は, 信頼できるマシンが利用できる場合 のみに 使えるもっ とも簡単な方法です. Java S/Key の key applet もあり, The Java OTP Calculator からダウンロードして Java をサポートするブラウザ上でローカルに 実行することができます.

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

都合によっては, 信頼できるマシンや信頼できる通信路が一切確保できな いようなところで S/KEY を使う必要があるでしょう. このような場合には, key コマンドを使って複数のワンタイムパスワードを一気に生成する ことが可能です. そして結果を紙に印刷して携帯していくことができます. 例 えば:

% key -n 25 57 zz99999
Reminder - Do not use this program while logged in via telnet or rlogin.
Enter secret password: 
33: WALT THY MALI DARN NIT HEAD
34: ASK RICE BEAU GINA DOUR STAG 
[...]
56: AMOS BOWL LUG FAT CAIN INCH  
57: GROW HAYS TUN DISH CAR BALM  

-n 25 という引数によって 25 個のワンタイムパスワードの生成を要 求します. ここで 57 は, 最後に表示されている (もっとも大き い) シーケンス番号です. 残りのパラメタは前出の例と同様です. 出力は普 通に使う順番とは に出力されていることに注意してください (訳注: 一番最初に使うワンタイムパスワードは 一番最後に出力されたものです). こ の結果をカットアンドペーストして lpr コマンドを使って印刷すると よいでしょう. もしあなたがセキュリティに偏執するなら, この結果を紙と鉛 筆を使って手で書き移した方がよいかもしれません. ここで, 出力の各行はシー ケンス番号とそれに対応する一回分のワンタイムパスワードです. 消費済みの ワンタイムパスワードの行をペンで消していくと 便利でしょう.

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

設定ファイル /etc/skey.access を使って UNIX パスワードの利 用を制限することができます. この場合の判断基準として, ログインを受け付 ける際のホスト名, ユーザ名, 端末のポート, IP アドレスなどが利用できま す. この設定ファイルの詳細に関してはマニュアル skey.access(5) を ご覧ください. マニュアルにはこの機能に関わるセキュリティに ついて, いく つかの警告が記述してあります. この機能を使って セキュリティを高めようと するのならば絶対にこのマニュアルを読んでください.

もし /etc/skey.access ファイルが存在しないならば (FreeBSD をインストールした直後の状態では存在しません), すべてのユーザが UNIX パスワードを利用することができます. 逆に, もしファイルが存在するならば, /etc/skey.access ファイルに明示的に記述されていない限り, すべ てのユーザは S/KEY の利用を要求されます. どちらの場合においても, その マシンのコンソールからはいつでも UNIX パスワードを使ってログインするこ とが可能です.

以下によく使われるであろう 三種類の設定を含む設定ファイルの例を示し ます:

permit internet 18.26.0.0 255.255.0.0
permit user jrl
permit port ttyd0

はじめの行 (permit internet) で, telnet などで接続するときの IP のソースアドレス (注意: これは偽造されるおそれがあります) が特定の値と マスクに一致している場合に, UNIX パスワードの利用を許可することを指定 しています. この設定自体はセキュリティを高めるための機能ではありません. そうではなく, ログインの権利を持つ許可されたユーザに対して, 現在そのユー ザが使っているネットワークが信頼できないと考えられるので S/KEY を使う べきである, ということを気づかせるための機能であると考えてください.

二行目 (permit user) によって, ある特定のユーザに対して, い つでも UNIX パスワードの利用を許可するように指定しています. 一般的には この設定をおこなうべきではありません. key プログラムがどうして も使えない環境にいる人や, ダム端末しかない環境にいる人, または何度教え ても聞く耳を持たないような人を サポートする必要がある場合にのみ設定をお こなってください.

三行目 (permit port) によって, ある特定の端末ポートからログ インしようとするすべてのユーザに対して UNIX パスワードの利用を許可する ように指定しています. この設定はダイヤルアップ回線に対する設定として利 用できるでしょう.