次のページ 前のページ 目次へ

2. shadow パスワードを使うべき理由

現在はほとんどの Linux のパッケージでは Shadow Suite は標準で はインストールされません。Slackware 2.3, Slackware 3.0 や他のポピュラー なパッケージでそうなっています。この理由の一つはオリジナルの Shadow Suite の著作権表示は、無料配布でない場合について不明確 だからです。Linux は CD-ROM のような配布に便利なメディアへパッケージ化 し、これに対する報酬を受け取ることが行いやすい GNU Copyright (Copyleft とも言われますが)を採用しています。

現在Shadow Suiteをメンテナンスしている, Marek Michalkiewicz <marekm@i17linuxb.ists.pwr.wroc.pl> 氏は元の作者から、再配布のできる BSD スタイルの著作権のもとにソースコー ドを受け取っています。現在は著作権の問題は解決しているので、将来は標準 で Linux のパッケージに Shadow Suite が含まれることになるでしょ う。それまでは、ユーザが自分自身でインストールしなければなりません。

パッケージを CD-ROM からインストールする場合には、パッケージ自体は Shadow Suite をインストールしなくても、Shadow Suite のインストー ルに必要なファイルは CD-ROM に含まれていることがあります。

しかし、バージョン3.3.1, 3.3.1-2の Shadow Suite と shadow-mk では login プログラムとroot に suid されたプログラムでセキュリティ 上の問題を起こします。ですから、これらを使ってはいけません。

必要なファイルは anonymous FTP や WWW を利用して入手することができます。

Shadow Suite がインストールされていない Linux システムではパ スワードを含めたユーザ情報は /etc/passwd ファイルに記録されて います。もちろん、パスワードは暗号化された状態で記録されています。しか し、暗号の専門家に言わせるとこれは暗号化(encrypt)ではなくエンコード(encode)に過ぎないそうです。crypt(3) を用いる場合の文字 列が空であればパスワードはキーになってしまうからです。この理由から、こ れ以降の文書中では'暗号化'ではなく 'エンコード'の語を用います。

ここでパスワードをエンコードするために用いられるアルゴリズムは、技術的 には単方向のハッシュ関数と言われるものです。これは、ある方向 には計算しやすいけれど、その逆方向の計算は非常に難しいというアルゴリズ ムです。実際のアルゴリズムについてのより詳しい説明は 2.4節か crypt(3) のマニュアルを参照して下さい。

ユーザがあるパスワードを決めた場合、このパスワードはランダムに決められ た salt と呼ばれる値を用いてエンコードされます。こうすること で一つの文字列がエンコードされた結果として取りうる結果は 4096 通りにな ります。salt の値はエンコードされたパスワードと一緒に記録され ます。

ユーザがログイン時にパスワードを入力すると、まず salt がエン コードされているパスワードから取り出されます。そして、入力されたパスワー ドを salt を用いてエンコードしてその結果をエンコー ドされた文字列と比較します。これが一致した場合に正しいユーザとし て認証します。

ランダムにエンコードされたパスワードを入手し、元のパスワード を復元することは計算の点から困難です(不可能ではない)。しかし、複数以上 の人が使うシステムでは少なからずのパスワードはありふれた単語(あるいは ありふれた単語を少し変えただけのもの)になっています。

クラッカーはこのような事情をよく知っているので 4096 個全ての salt を用い て辞書の単語とよく使われそうなパスワードをあらかじめエンコードしておき ます。そして、/etc/passwd に書かれているエンコードしたパスワー ドをこの結果と比較します。ここで一致するものが見つかれば、クラッカーは 他人のパスワードを破ったことになるわけです。これは「辞書攻撃」と呼ばれ るもので、正規の認証を受けずにシステムにアクセスするための常套手段です。

ある 8 文字からなるパスワードは 、13 文字から成る 4096 通りの文字列のど れかにエンコードされます。したがって、基本語や固有名詞とそれに簡単な変 化をつけたものを集めて作った400,000 語程度の辞書は 4GB のハードディス クに十分収まるくらいの大きさです。クラッカーはこれらをソートしておき、 /etc/passwd の文字列と一致するかどうかを調べるだけでよいので す。4GB のハードディスクは 1,000 ドル以下で買えるくらいですから、大抵 のクラッカーは持っていると考えるべきです。

また、クラッカーが最初にあなたの /etc/passwd ファイルを手に入 れた場合にはクラッカーはこのファイルに含まれているsaltを使っ て辞書をエンコードしてゆけばよいだけになってしまいます。ディスク数百メ ガバイトと486クラスのCPUを持つマシンがあれば、この程度のことは子供でも できてしまいます。

大量のディスクがなくても crack(1) のようなユーティリティを用いれば、あ る程度以上の数のユーザがいるシステムの少なくとも一つはパスワードを破る ことができます。(ユーザは自分で各自のパスワードを決めるものとします。)

/etc/passwd ファイルには多くのシステムプログラムが使うユーザ ID やグループID のような情報が書かれています。従って、このファイルは世 界中からアクセスできなければなりません。例えば、 /etc/passwd ファイルを誰も読めないようにしてしまったら、 'ls -l' コマンドで名前の代わりにユーザID が表示されるようになっ て驚くはめになるでしょう。

Shadow Suite はパスワードを別の場所に移すことでこの問題を解決 します(通常は /etc/shadow)。このファイルは誰も読めないように 設定されます。rootだけが /etc/shadow ファイルを読み 書きできます。いくつかのプログラム(xlock など)は /etc/shadow を変更はできなくてもいいですが、パスワードの確認は行う必要があります。 このようなプログラムは root に SUID するか、shadow グループに 属する必要があります。パスワードを確認するためだけに root に SUID する よりは、shadow に SGID する方が良い考えと言えます。

パスワードを /etc/shadow に移動させることによって、クラッカー がエンコードされたパスワードにアクセスして辞書攻撃に利用する ことを防げます。

加えて、Shadow Suite は以下のような特長を持っています:

  • ログイン時のデフォルトを設定するコンフィグレーションファイル(/etc/login.defs)
  • ユーザアカウントやグループを追加、修正、削除するためのユーティリティ
  • 古いパスワードのチェックや期限設定
  • アカウントの期限設定とロッキング
  • 倍長パスワード (16文字のパスワード) [推奨しません]
  • ユーザのパスワード決定を制御しやすい
  • ダイアルアップ・パスワード
  • 2次認証プログラム [推奨しません]

Shadow Suit をインストールすることでシステムのセキュリティを 強化することができますが、Linux システムのセキュリティをより強化するた めには、他にもやるべきことは数多くあります。セキュリティ強化の方法とセ キュリティに関係する話題について解説する Linux Security HOWTO シリーズ がそのうちできることでしょう。

既知のセキュリティホールについての警告など、 Linux のセキュリティにつ いての最新の情報を得るためには Linux Security ホームページ を参照して下さい。

2.1 shadow パスワードを使わないほうが良い場合

Shadow Suiteをインストールすることがかならずしも良いことでは ない環境やシステム構成もあります。

  • システムにユーザアカウントがない場合。
  • コンピュータが LAN に繋がっていて、ユーザ名やパスワードは NIS (Network Information Services) 経由でネットワーク上の他のマシンから得 ている場合。(これは本文書の範囲を外れている点と、あまりセキュリティ向 上は望めないので説明しません)
  • システムが NFS (Network File System)や NIS などを用いてユーザ認 証をするためにターミナルサーバによって利用される場合
  • ユーザ認証はするが、shadow パスワードに対応しておらず、ソースコー ドも無いソフトウェアを使わなければならない場合

2.2 /etc/passwd ファイルのフォーマット

shadow 化されていない /etc/passwd ファイルは以下のようなフォーマットに なっています:

username:passwd:UID:GID:full_name:directory:shell
ここで、
username

ユーザのログインネーム

passwd

エンコードされたパスワード

UID

ユーザ ID (数値)

GID

デフォルトのグループ ID (数値)

full_name

ユーザの本名。実際にはこのフィールドは GECOS (General Electric Comprehensive Operating System) フィールドと呼 ばれ、ユーザの本名以外の情報も保持できます。Shadow Suite のコ マンドおよびオンラインマニュアルではコメントフィールドとして記述されて います。

directory

ユーザのホームディレクトリ

shell

ユーザのログインシェル(絶対パス記述)

例えば次のようになります:

username:Npge08pfz4wuk:503:100:Full Name:/home/username:/bin/sh
ここで、第2フィールドの Np は salt で、ge08pfz4wukエンコードされたパスワードです。同じパスワードでも、salt/パ スワードの組み合わせは kbeMVnZM0oL7I のようになる場合もありま す。ある一つのパスワードに関してエンコードされ得る可能性は 4096通りで す。(この例で用いた 'password' というパスワードは破られやすい点におい て非常に悪いパスワードです。)

Shadow suite がインストールされると、/etc/passwd ファイルは以 下のようになります:

username:x:503:100:FullName:/home/username:/bin/sh
この場合の2番目のフィールドの 'x' は単に場所を埋めているだけ です。エンコードされたパスワードは含まれなくなりますが、 /etc/passwd ファイルのフォーマット自体は変わりません。従って、 /etc/passwd ファイルを読むけれどパスワード認証は行わないプロ グラムは以前の通りに動作します。

パスワードは shadow ファイル(通常 /etc/shadow) に移されます。

2.3 shadow ファイルのフォーマット

/etc/shadowファイルには以下のような情報が記述されています:

username:passwd:last:may:must:warn:expire:disable:reserved
内容は以下のような意味を持ちます:
username

ユーザ名

passwd

エンコードされたパスワード

last

1970年1月1日から、パスワードが最後に更新された日までの日数

may

何日前にパスワードが変更されたと思われるか

must

パスワードを変更しなければならない期限

warn

パスワードの期限切れの何日前にユーザに警告するか

expire

パスワード期限切れの何日後にアカウントを抹消するか

disable

1970年1月1日から、アカウントが抹消された日までの日数

reserved

予約フィールド

さきほどと同じ例では /etc/shadow はこのようになります:

username:Npge08pfz4wuk:9479:0:10000::::

2.4 crypt(3) の概要

crypt(3) のオンラインマニュアルより:

"cryptはパスワードの暗号化関数である。これは Data Encryption Standard (DES) のアルゴリズムに、特にキー検索のハード ウェア実装をしにくくすることを特に意図した変化をつけたものに基づいてい る。

キーはユーザの入力したパスワードである。 [エンコードされた文字列はすべ てNULLである。]

salt は [a-zA-Z0-9./] の中から2文字を選んだ文字列である。この 文字列はアルゴリズムの中で4096通りの異なる結果から一つを適当に選び出す ために用いられる。

キーの各文字の下位7ビットを取り出すことで 56ビットのキーが得られる。こ の56ビットのキーは定数文字列(通常は全て0の文字列を含む)を繰り返し暗号 化するために用いられる。戻し値は暗号化されたパスワードへのポインタであ り、このパスワードは13文字の ASCII 文字である(最初の2文字はsaltそのも のである)。戻し値のポインタが指す領域は呼び出しごとに上書きされる静的 なデータである。

警告:キー空間は 2の56乗(=7.2e16)個の値を取ることができる。この キー空間は大量の並列計算機を用いれば全探索することが可能であ る。また、crack(1) のようなソフトウェアは人間がパスワードに用 いそうな単語が作るキー空間の部分空間に絞って検索を行う。従って、パスワー ドの選択ではありふれた単語や名前の使用は避けるべきである。パスワードを 決める際には破られやすいパスワードのチェックを行う passwd(1) プログラムを利用すると良いだろう。

DES アルゴリズム自体には癖があるので、crypt(3)のインタフェー スはパスワード認証の他に使うべきではない。crypt(3)のインタフェー スを暗号そのものに関わるプロジェクトに利用してはならない。このような場 合には、暗号化について書いてある良い本と広く利用することができる DES ライブラリを入手するべきである。"

ほとんどの Shadow Suites パッケージにはパスワードを16文字に倍 長化するコードが含まれています。しかしDESの専門家はこれを推奨 していません。パスワードの長さが倍でも、最初に左半分をエンコードして、 次に右半分をエンコードしているだけだからです。これはcryptの動 作のためであり、始めから倍長パスワードが使われていなかった場合と比べて も、より脆弱なパスワードを作ってしまいます。また、ユーザに16 文字のパスワードを覚えてもらうことは困難であるという理由もあります。

cryptに代るもので、より安全で長いパスワードをサポートし(特に MD5 アルゴリズム)、さらにcryptとの互換性を保持しているような 認証アルゴリズムを開発しようとしているプロジェクトがあります。

もし、読者が暗号化についての良い本を探しているなら、筆者は以下の本を推 薦しておきます:

        "Applied Cryptography: Protocols, Algorithms, and Source Code in C"
        by Bruce Schneier <schneier@chinet.com>
        ISBN: 0-471-59756-2


次のページ 前のページ 目次へ

[