どの文献で読んだか忘れてしまったが、 この方法が危険であることを立証する事 件が実際に起こったらしい。ある端末の バグのせいで、ルートが表示しているパ スワードファイルの内容が、一般ユーザ の端末へ表示されてしまったのだ。
これは極端な例だが、ルートの端末を一 般ユーザが覗き込む場面などいくらでも ある。パスワードの常識として、生パス ワードをファイルに直接保存してはいけ ない。
正しく表現すれば、パスワードはセキュ ア・ハッシュ関数(以下単にハッシュと 呼ぶ)でハッシュされてファイルに保存 されている。このハッシュ関数にたまた ま DES という暗号を用いたので、「暗 号化されている」という言い回しが広まっ た。
セキュリティ技術の知識が今のように一 般的でなかった時代では、そう表現した 方がユーザが安心したという側面もあっ たのだろう。
パスワードは、crypt() という関数を使っ てハッシュされる。図 1 に crypt() で 利用されているハッシュ関数の概念図を 示す。
ハッシュ関数 crypt() は入力として、
出力は、
ハッシュ関数の中身は 25 段の DES と なっている。
認証の手続は、次のようになる。すなわ ち、64 ビットの 0、ユーザが入力した パスワード、乱数(ハッシュされたパス ワードの先頭 2 文字)にハッシュ関数を 適応し、出力を得る。この出力と、ファ イルに保存されているハッシュされたパ スワードを比較する。一致すれば、パス ワードが合っているとになるから、認証 が成功する。
ハッシュされたパスワードを比較するの であって、パスワードを比べるのではな いことに注意しよう。このような仕組み のおかげで、あるユーザのパスワードは、 ルートの権限をもってさえ知り得ないよ うになっている。
このパスワードの最大の欠点は、パスワー ドに ASCII 文字を 8 個しか利用できな いことだ。後述するが、コンピュータの 性能が向上した現在、これはあまりに短 い。
そこで最近はハッシュ関数として MD 5 を用い、入力の文字列の制限を取り除い ている場合もある。この種のパスワード では、好きなだけ長いパスワードを利用 できる。
パスワードを盗み取る最も簡単な方法は、 パスワードを入力しているユーザの後ろ に立って、肩越しに覗き込むことだ。こ れを、"over shoulder crack" と呼ぶこ とがある。(だから、パスワードにはす ばやく入力できる文字列を選べともいわ れる。)
また、ユーザに近寄らなくても、パスワー ドを推測できる方法がある。ユーザは概 して怠け者なので、ユーザ名をパスワー ドとして利用していることが多い。「そ んなバカな」と思われるかもしれないが、 本当の話だ。
ユーザ名と同じパスワードのことを、戒 めをこめて Joe account と呼ぶことが ある。あるユーザが Joe account を使っ ているか知るのは造作もないことだ。そ のユーザの名を語って、ログインを試み ればよい。もちろん、パスワードには同 じユーザ名を入力する。
「辞書攻撃」とは、ユーザが利用しそう な単語をあらかじめ用意しておく。それ らをハッシュにかけて、入手しておいた ハッシュされたパスワードと比較する。 一致すれば、その単語がユーザの利用し ているパスワードだ。
「総当たり攻撃」とは、パスワードのす べての可能性を試す方法である。
辞書攻撃は、コンピュータがまだ非力な ころ考案された手法である。つまり、コ ンピュータの能力がパスワードの全空間 を探索できるほど速くなかったので、空 間の一部を効率よく検索できるよう工夫 したのである。
しかし、現在ではコンピュータは高速で ある。DES パスワードの空間は 56 ビッ トしかなく、小さ過ぎる。正確なことは 知らないが、現在では数台のコンピュー タでも数時間から数日で全空間を網羅で きると思う。
DES パスワードの乱数(salt) は、辞書 攻撃をしにくくするために考案された。 つまり、あるパスワードを 4096 通り (12ビット)にハッシュ可能にし、あらか じめハッシュされた単語の辞書を用意で きなくしていたのである。
また、DES を 25 回用いるのは、ハッシュ 値をすばやく計算されないためである。 しかし、今となっては、これらの対策は、 滑稽にさえ映る。パスワードを強くする ためには、パスワードの空間を広げるの が本質的な解決策だからだ。
最近の UNIX では、MD 5 をハッシュ関 数として用いて、パスワードの空間を無 限にしている。
任意の長さを許すパスワードの仕組みを 用意しても、システムの中で一番弱いの は、ユーザ自身であることを忘れてはな らない。多くのユーザは 8 文字以下の パスワードを利用したがる。覚えるのも 入力するのも面倒だからだ。
磐石のパスワード機構を用意しても、依 然として辞書攻撃が有効なのは皮肉的な 話だ。
「辞書攻撃」や「総当たり攻撃」への理 解が深まると、ハッシュされたパスワー ドを知られることも危険だと認識される ようになった。このため現在では、ハッ シュされたパスワードは、ルートだけが読み出し 可能なシャドウ・パスワード・ ファイルに格納されている。
MD5 パスワードは空間が広いので、ハッ シュされたパスワードを公開しても理論 上は問題ない。しかし、ユーザは安易な パスワードを使う傾向にあるから、実際 に利用している空間はいたって小さい。 そこで実践的には、敵に情報を与えない よう、ハッシュされた MD 5 パスワード も隠蔽する方が安全といえる。
rlogin といた r コマンドでは、あるコ ンピュータからログインする場合は、パ スワードの入力を省略するよう設定でき る。これは突き詰めると、パスワードの 代りに、IP アドレスを認証の仕組みと して使っていることになる。
r コマンドでは所定の設定をすると、生 パスワードがネットワークに流れないの で、盗聴の心配はない。しかし、IP ア ドレスを認証の仕組みとして利用するの はお勧めではない。IP アドレスを偽る のは簡単だからだ。事実、有名なクラッ カー Mitnick はこの方法で rlogin の 認証の弱点をついた。
このようなことから、パスワードを流さ ない方法よりも、盗聴されても問題ない パスワードを使って認証する方法が一般 的となった。
この仕組みは簡単に実現できる。説明の ため、ユーザが端末として利用するロー カルのコンピュータをクライアント、こ れからログインするリモートのコンピュー タをサーバと呼ぼう。クライアントとサー バ間ではあらかじめ秘密(共有鍵暗号の 鍵)を共有しておく(図2)。
使い捨てパスワードは以下のようにやり とりされる。
復号化のためのコマンドをインストール したラップトップを持ち運べればよいが、 使い捨てパスワードが考え出された当時 は、これは一般的ではなかった。
そこで、使い捨てパスワードでは、いく つかのパスワードをあらかじめ計算して おける方法を採用している。
また、上記の方法では秘密を生で保存し なければならないという問題もある。使 い捨てパスワードでは、この問題も解決 している。
使い捨てパスワードの仕組みはややこし い。そこで、説明を具体的にするために、 表1を用いることにする。
表1:
ログイン | 番号 | 計算 | 使い捨てパスワード |
初期 | 4 | f(f(f(f(x)))) | VASE GANG GEE FOUR ONES JOEY |
1回目 | 3 | f(f(f(x))) | MASH YOGA SEEK DRUG FOIL LEAR |
2回目 | 2 | f(f(x)) | GALE TOAD BRAN MOOT RUST WAG |
3回目 | 1 | f(x) | BERN WANG MA VOID FED JOEL |
表1は、あらかじめ 3 つ(初期値を含め ると 4 つ)の使い捨てパスワードを発行 した例を示している。x がパスワード、 f() はハッシュ関数を表わす。使い捨て パスワードでは、ハッシュ関数に MD 4 や MD5、SHA-1 を利用する。
初期段階では、f(f(f(f(x)))) という使 い捨てパスワードがサーバに保存される。 (文字列表記は表1を参照のこと)
クライアントが 1 回目のログインを試 みると、サーバは 3 という番号を返す。 これに対しクライアントは、パスワード に f() を 3 回適応した使い捨てパスワー ド f(f(f(x))) を返す。
この使い捨てパスワードは、専用のコマ ンドがあるならその場で計算してもよい し、あらかじめ紙に出力しておいたもの を入力してもよい。
サーバは、クライアントから渡された使 い捨てパスワード f(f(f(x))) に f() を一回施したものと、もともとファイル に保存してあった使い捨てパスワード f(f(f(f(x)))) とを比較する。一致すれ ば、ログインを許可し、f(f(f(x))) を ファイルに保存する。
このように、ログインが成功するごとに、 状態が 1 つ進む。使い捨てパスワード を使いきった際には、再び初期化する必 要がある。
ネットワーク上を流れる使い捨てパスワー ドから、次の使い捨てパスワードを推測 することは困難である。たとえば、1 回 目の f(f(f(x))) から 2 回目の f(f(x)) を推測することを考えてみよう。
これは、ハッシュ値(出力)から入力を求 めることに等しい。ハッシュ関数は一方 向性を有しているので、この作業は困難 である。(もちろん、よいパスワードを 選択していることが前提条件だ。)
まとめよう。使い捨てパスワードでは、 あらかじめ系列を決めて、いくつかの使 い捨てパスワードを発行する。この作業 は、次々とハッシュ値を計算するだけだ から容易である。あらかじめ全部を計算 して紙に出力しておいてもよいし、ログ インの際に計算してもよい。
サーバでの認証作業は、ある使い捨てパ スワードのハッシュ値を計算するだけで ある。この作業も簡単だ。逆にクラッカー が、ある使い捨てパスワードから次の使 い捨てパスワードを推測するためには、 ハッシュ関数の逆関数を求める必要があ り、困難である。(もちろん、よいパス ワードを使っていることが前提だ。)
しかし、そんなフロントエンドも、SSH の登場で一掃された感がある。パスワー ドを暗号化して送れば盗聴されても安心 だ。しかも、通信全体が暗号化されてい るので、パスワードしか保護できない使 い捨てパスワードとの優劣も明らかだ。
ラップトップを持ち運ぶことが一般的に なってきた現在、専用の SSH クライア ントをあらかじめインストールしておく という前提も成り立つ。
簡略化して SSH の仕組みを説明する。 クライアントは、ユーザが入力したパス ワードを、サーバの公開鍵で暗号化して サーバに送る。サーバは、これをサーバ の秘密鍵で復号化し、パスワードを取り 出す。このパスワードを用いて、パスワー ド認証を試みる。
SSH の最大の弱点は、サーバの秘密鍵が 生で保存されていることだ。もちろん、 ルートしか読めないファイルに格納され てはいるが。
この問題を解決するために、秘密鍵を暗 号化してファイルに保存しておき、起動 時にルートに復号鍵(パスワード)の入力 を促す仕組みをもつサーバもある。しか し、このサーバを起動する際は必ずコン ソールまで行く必要があるので、一般に は普及していない。