FreeBSD ハンドブック
Prev | Chapter 14. セキュリティ | Next

# 14.5. S/Key

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

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

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

パスフレーズに加え、S/Key システムにとって重要な二種類のデー タがあります。一つは“シード (seed: 種)”または “キー (key: 鍵)”と呼ばれるもので、二つの文字と五つ の数字で構成されます。もう一つは“シーケンス番号 (iteration count)” で、1 から 100 までの整数です。S/Key はここまで に述べたデータを利用してワンタイムパスワードを生成します。その方 法は、まずシードと秘密のパスフレーズを連結し、それに対してシーケ ンス番号の回数だけ MD4 ハッシュを繰り返し計算します。そしてその 結果を 六つの短い英単語に変換します。`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アドレス、ユーザ名を一緒にメモしていたら 最悪です!!)

## 14.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

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

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

信頼できない通信路を使って S/Key を初期化、または秘密のパ スフレーズを変更するためには、信頼できる通信路として、その信頼 できない通信路とは別のものを用意する必要があります。その信頼で きる通信路は `key` プログラムを実行するために 必要となるもので、たとえばそれは、あなたが信頼できる 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:

デフォルトのシード (`keyinit` プログラム は困ったことにこれを `key` と読んでいるのです が、混乱しないよう注意してください) で構わなければ、リターンキー を押してください。次に、アクセスパスワードを入れる前に、あらか じめ用意しておいた信頼できる通信路(信頼できるマシンや信頼でき る 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

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

    s/key access password:CURE MIKE BANE HIM RACY GORE
    ID unfurl s/key is 100 to17759
    CURE MIKE BANE HIM RACY GORE

後は、前章で説明したことと同様です。

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

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

    % 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:

ここでは表示していませんが、便利な機能がログインプログラム に備わっています: パスワードプロンプトに対して、何も入力せずに リターンを押すとエコーモードに切り替わります。つまりタイプし た文字がそのまま見えるようになるのです。これはS/Key のワンタイ ムパスワードを紙に印刷していた場合など、ワンタイムパスワードを 手で入力しなければならない場合に特に役立つ機能です。また、この ログインしようとしてるマシンが、接続元のマシンから Unix パスワードを使ってログインすることができないように設定さ れている場合には、ログインプロンプトには S/Key のワンタイムパ スワードのみが受け付けられることを示す `(s/key required)` という注釈が表示されます。

次に、このログインプロンプトに対して入力するためのワンタイ ムパスワードを生成しましょう。そのために、`key` プログラムを使える信頼できるマシンを用意します。 (`key` プログラムには MS-DOS や Windows の上で動くもの、MacOS の上で動くものなどもあります)。 `key` プログラムを使うときには、シーケンス番 号とシードを指定します。ログインしようとしているマシンのログ インプロンプトの右側をカットアンドペーストすると楽でしょう。

信頼できるシステムで

    % 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

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

    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 ...

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

## 14.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` コマンドを使って印刷すると よいでしょう。 もしあなたがセキュリティに偏執するなら、この結果を紙と鉛筆を使っ て手で書き移した方がよいかもしれません。ここで、出力の各行はシー ケンス番号とそれに対応する一回分のワンタイムパスワードです。 消費済みの ワンタイムパスワードの行をペンで消していくと便利で しょう。

## 14.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 パスワードの利用を許可するように指定しています。この設定 はダイヤルアップ回線に対する設定として利用できるでしょう。

Prev | Home | Next
DES, MD5 と Crypt | Up | Kerberos