15.5. S/Key

S/Key は一方向ハッシュ関数を基にしたワンタイムパスワード方式 です。FreeBSD では、互換性のために MD4 ハッシュを用いていますが 他のシステムでは MD5 や DES-MAC を用いてます。S/Key は、バージョ ン1.1.5 以降のすべての FreeBSD に含まれていますし、FreeBSD 以外 の数多くのシステムの上でも利用されています。S/Key は Bell Communications Research, Inc. の登録商標です。

FreeBSD バージョン 5.0 以降では、S/Key は機能的に同等な OPIE (Onetime Passwords In Everything) で置き換えられました。OPIE はデフォルトでは MD5 ハッシュを使用します。

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

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

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

次に、それぞれのシステムで関連する 3 つのプログラムについて説明します。 keyopiekey プログラムは、シーケンス番号と、シードと、 秘密のパスフレーズを受け付けて、ワンタイムパスワード 1 つ、 または一連のワンタイムパスワードの一覧を生成します。 keyinitopiepasswd プログラムは、それぞれ S/Key と OPIE を初期化するのに使用され、また秘密のパスフレーズ、 シーケンス番号やシードを変更するためにも使用されます。 それぞれのプログラムを実行するには、秘密のパスフレーズか、 または、シーケンス番号とシードとワンタイムパスワードの 1 組かの、どちらかを与えます。 keyinfoopieinfo プログラムは、 それぞれに対応する認証ファイル (/etc/skeykeys または /etc/opiekeys) を調べて、プログラムを起動したユーザの現在のシーケンス番号とシードを表示します。

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

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

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

% keyinit
Adding unfurl:
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 unfurl s/key is 99 to17757
DEFY CLUB PRO NASH LACE SOFT

OPIE では opiepasswd が代わりに使われます。

% 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.
        ) `opiepasswd' コマンドが出力する注意です。訳すと、
        ) この手順はコンソール以外では利用しないでください。リモートからは
        ) 絶対に利用してはいけません。telnet, xterm またはダイアルアップで
        ) 利用している場合は、^C を入力するかパスワードを入れずに終了してく
        ) ださい。その後、opiepasswd を -c オプションなしで実行してください。
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 回分のパラメータで、 あなたのログイン名とシーケンス番号とシードです。 (訳注: keyinit コマンドは 次回にログインするときに使えるパラメータを参考のためにここで表示します)。 システムにログインするときには、 システム側が自動的にこれらのパラメータを表示してくれますから、 これらのパラメータを 覚えておく必要はありません。最後の行が、今述べたパラメータと入力 された秘密のパスフレーズから計算されたワンタイムパスワードです。 この例を実行した後、次にログインするときに打ち込むべきワンタイ ムパスワードがこれです。

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

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

% keyinit -s
Updating unfurl:
Old key: to17758
Reminder you need the 6 English words from the key command.
	) `keyinit' コマンドが出力する注意です。訳すと、
	) 注意 - skey コマンドの出力する 6 英単語が必要になります。
Enter sequence count from 1 to 9999: 100
Enter new key [default to17759]:
s/key 100 to 17759
s/key access password:
s/key access password:CURE MIKE BANE HIM RACY GORE

OPIE では、opiepasswd を使います。

% opiepasswd

Updating unfurl:
You need the response from an OTP generator.
	) `opiepasswd' コマンドが出力する注意です。訳すと、
	) OTP 生成器の返す出力が必要になります。
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

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

% key 100 to17759
Reminder - Do not use this program while logged in via telnet or rlogin.
Enter secret password: <秘密のパスフレーズ>
CURE MIKE BANE HIM RACY GORE

OPIE では、

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

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

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

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

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

FreeBSD/i386 (example.com) (ttypa)

login: <ユーザ名>
s/key 97 fw13894
Password:

OPIE については、

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

FreeBSD/i386 (example.com) (ttypa)

login: <username>
otp-md5 498 gr4269 ext
Password:

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

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

信頼できるシステムで

% key 97 fw13894
Reminder - Do not use this program while logged in via telnet or rlogin.
Enter secret password:
WELD LIP ACTS ENDS ME HAAG

OPIE では

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

ここでワンタイムパスワードが得られました。 ログインを続けましょう。

login: <username>
s/key 97 fw13894
Password: <return to enable echo>
s/key 97 fw13894
Password [echo on]: WELD LIP ACTS ENDS ME HAAG
Last login: Tue Mar 21 11:56:41 from 10.0.0.2 ...

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

都合によっては、信頼できるマシンや信頼できる通信路が一切確 保できないようなところで S/Key を使う必要があるでしょう。この ような場合には、key コマンドを使って複数の ワンタイムパスワードをあらかじめ一気に生成し、紙に印刷して携帯 していくことができます。たとえば

% key -n 5 30 zz99999
Reminder - Do not use this program while logged in via telnet or rlogin.
Enter secret password: <秘密のパスフレーズ>
26: SODA RUDE LEA LIND BUDD SILT
27: JILT SPY DUTY GLOW COWL ROT
28: THEM OW COLA RUNT BONG SCOT
29: COT MASH BARR BRIM NAN FLAG
30: CAN KNEE CAST NAME FOLK BILK

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

15.5.5. Unix パスワードの利用を制限する

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

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

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

permit internet 192.168.0.0 255.255.0.0
permit user fnord
permit port ttyd0

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

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

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

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

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