pkg://Shadow-Password-HOWTO.tar.gz:28565/Shadow-Password-HOWTO-2.html
downloads
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<HTML>
<HEAD>
<META NAME="GENERATOR" CONTENT="SGML-Tools 1.0.9">
<TITLE>Linux Shadow Password HOWTO: shadow パスワードを使うべき理由</TITLE>
<LINK HREF="Shadow-Password-HOWTO-3.html" REL=next>
<LINK HREF="Shadow-Password-HOWTO-1.html" REL=previous>
<LINK HREF="Shadow-Password-HOWTO.html#toc2" REL=contents>
</HEAD>
<BODY>
<A HREF="Shadow-Password-HOWTO-3.html">次のページ</A>
<A HREF="Shadow-Password-HOWTO-1.html">前のページ</A>
<A HREF="Shadow-Password-HOWTO.html#toc2">目次へ</A>
<HR>
<H2><A NAME="s2">2. shadow パスワードを使うべき理由</A></H2>
<P>現在はほとんどの Linux のパッケージでは <EM>Shadow Suite</EM> は標準で
はインストールされません。Slackware 2.3, Slackware 3.0 や他のポピュラー
なパッケージでそうなっています。この理由の一つはオリジナルの
<EM>Shadow Suite</EM> の著作権表示は、無料配布でない場合について不明確
だからです。Linux は CD-ROM のような配布に便利なメディアへパッケージ化
し、これに対する報酬を受け取ることが行いやすい GNU Copyright (Copyleft
とも言われますが)を採用しています。
<P>
<P>現在<EM>Shadow Suite</EM>をメンテナンスしている,
<A HREF="mailto:marekm@i17linuxb.ists.pwr.wroc.pl">Marek Michalkiewicz <marekm@i17linuxb.ists.pwr.wroc.pl></A>
氏は元の作者から、再配布のできる BSD スタイルの著作権のもとにソースコー
ドを受け取っています。現在は著作権の問題は解決しているので、将来は標準
で Linux のパッケージに <EM>Shadow Suite</EM> が含まれることになるでしょ
う。それまでは、ユーザが自分自身でインストールしなければなりません。
<P>
<P>パッケージを CD-ROM からインストールする場合には、パッケージ自体は <EM>Shadow
Suite</EM> をインストールしなくても、<EM>Shadow Suite</EM> のインストー
ルに必要なファイルは CD-ROM に含まれていることがあります。
<P>
<P><EM>しかし、バージョン3.3.1, 3.3.1-2の Shadow Suite と shadow-mk では
login プログラムと<EM>root に suid </EM>されたプログラムでセキュリティ
上の問題を起こします。ですから、これらを使ってはいけません。</EM>
<P>
<P>必要なファイルは anonymous FTP や WWW を利用して入手することができます。
<P>
<P><EM>Shadow Suite</EM> がインストールされていない Linux システムではパ
スワードを含めたユーザ情報は <CODE>/etc/passwd</CODE> ファイルに記録されて
います。もちろん、パスワードは暗号化された状態で記録されています。しか
し、暗号の専門家に言わせるとこれは<EM>暗号化(encrypt)</EM>ではなく<EM>エンコード(encode)</EM>に過ぎないそうです。crypt(3) を用いる場合の文字
列が空であればパスワードはキーになってしまうからです。この理由から、こ
れ以降の文書中では'暗号化'ではなく <EM>'エンコード'</EM>の語を用います。
<P>
<P>ここでパスワードをエンコードするために用いられるアルゴリズムは、技術的
には<EM>単方向のハッシュ関数</EM>と言われるものです。これは、ある方向
には計算しやすいけれど、その逆方向の計算は非常に難しいというアルゴリズ
ムです。実際のアルゴリズムについてのより詳しい説明は 2.4節か crypt(3)
のマニュアルを参照して下さい。
<P>
<P>ユーザがあるパスワードを決めた場合、このパスワードはランダムに決められ
た <EM>salt</EM> と呼ばれる値を用いてエンコードされます。こうすること
で一つの文字列がエンコードされた結果として取りうる結果は 4096 通りにな
ります。<EM>salt</EM> の値はエンコードされたパスワードと一緒に記録され
ます。
<P>
<P>ユーザがログイン時にパスワードを入力すると、まず <EM>salt</EM> がエン
コードされているパスワードから取り出されます。そして、入力されたパスワー
ドを <EM>salt</EM> を用いて<EM>エンコードして</EM>その結果を<EM>エンコー
ド</EM>された文字列と比較します。これが一致した場合に正しいユーザとし
て認証します。
<P>
<P>
<P>ランダムに<EM>エンコード</EM>されたパスワードを入手し、元のパスワード
を復元することは計算の点から困難です(不可能ではない)。しかし、複数以上
の人が使うシステムでは少なからずのパスワードはありふれた単語(あるいは
ありふれた単語を少し変えただけのもの)になっています。
<P>
<P>クラッカーはこのような事情をよく知っているので 4096 個全ての salt を用い
て辞書の単語とよく使われそうなパスワードをあらかじめエンコードしておき
ます。そして、<CODE>/etc/passwd</CODE> に書かれているエンコードしたパスワー
ドをこの結果と比較します。ここで一致するものが見つかれば、クラッカーは
他人のパスワードを破ったことになるわけです。これは「辞書攻撃」と呼ばれ
るもので、正規の認証を受けずにシステムにアクセスするための常套手段です。
<P>
<P>ある 8 文字からなるパスワードは 、13 文字から成る 4096 通りの文字列のど
れかにエンコードされます。したがって、基本語や固有名詞とそれに簡単な変
化をつけたものを集めて作った400,000 語程度の辞書は 4GB のハードディス
クに十分収まるくらいの大きさです。クラッカーはこれらをソートしておき、
<CODE>/etc/passwd</CODE> の文字列と一致するかどうかを調べるだけでよいので
す。4GB のハードディスクは 1,000 ドル以下で買えるくらいですから、大抵
のクラッカーは持っていると考えるべきです。
<P>
<P>また、クラッカーが最初にあなたの <CODE>/etc/passwd</CODE> ファイルを手に入
れた場合にはクラッカーはこのファイルに含まれている<CODE>salt</CODE>を使っ
て辞書をエンコードしてゆけばよいだけになってしまいます。ディスク数百メ
ガバイトと486クラスのCPUを持つマシンがあれば、この程度のことは子供でも
できてしまいます。
<P>
<P>大量のディスクがなくても crack(1) のようなユーティリティを用いれば、あ
る程度以上の数のユーザがいるシステムの少なくとも一つはパスワードを破る
ことができます。(ユーザは自分で各自のパスワードを決めるものとします。)
<P>
<P><CODE>/etc/passwd</CODE> ファイルには多くのシステムプログラムが使うユーザ
ID やグループID のような情報が書かれています。従って、このファイルは世
界中からアクセス<EM>できなければなりません</EM>。例えば、
<CODE>/etc/passwd</CODE> ファイルを誰も読めないようにしてしまったら、
<CODE>'ls -l'</CODE> コマンドで名前の代わりにユーザID が表示されるようになっ
て驚くはめになるでしょう。
<P>
<P><EM>Shadow Suite</EM> はパスワードを別の場所に移すことでこの問題を解決
します(通常は <CODE>/etc/shadow</CODE>)。このファイルは誰も読めないように
設定されます。<EM>root</EM>だけが <CODE>/etc/shadow</CODE> ファイルを読み
書きできます。いくつかのプログラム(xlock など)は <CODE>/etc/shadow</CODE>
を変更はできなくてもいいですが、パスワードの確認は行う必要があります。
このようなプログラムは <EM>root に SUID する</EM>か、shadow グループに
属する必要があります。パスワードを確認するためだけに root に SUID する
よりは、shadow に SGID する方が良い考えと言えます。
<P>
<P>パスワードを <CODE>/etc/shadow</CODE> に移動させることによって、クラッカー
がエンコードされたパスワードにアクセスして<EM>辞書攻撃</EM>に利用する
ことを防げます。
<P>
<P>加えて、<EM>Shadow Suite</EM> は以下のような特長を持っています:
<UL>
<LI>ログイン時のデフォルトを設定するコンフィグレーションファイル(<CODE>/etc/login.defs</CODE>)</LI>
<LI>ユーザアカウントやグループを追加、修正、削除するためのユーティリティ</LI>
<LI>古いパスワードのチェックや期限設定</LI>
<LI>アカウントの期限設定とロッキング</LI>
<LI>倍長パスワード (16文字のパスワード) [推奨しません]</LI>
<LI>ユーザのパスワード決定を制御しやすい</LI>
<LI>ダイアルアップ・パスワード</LI>
<LI>2次認証プログラム [推奨しません]</LI>
</UL>
<P>
<P><EM>Shadow Suit</EM> をインストールすることでシステムのセキュリティを
強化することができますが、Linux システムのセキュリティをより強化するた
めには、他にもやるべきことは数多くあります。セキュリティ強化の方法とセ
キュリティに関係する話題について解説する Linux Security HOWTO シリーズ
がそのうちできることでしょう。
<P>
<P>既知のセキュリティホールについての警告など、 Linux のセキュリティにつ
いての最新の情報を得るためには
<A HREF="http://bach.cis.temple.edu/linux/linux-security/">Linux Security ホームページ</A>
を参照して下さい。
<P>
<P>
<H2><A NAME="ss2.1">2.1 shadow パスワードを使わないほうが良い場合</A>
</H2>
<P><EM>Shadow Suite</EM>をインストールすることがかならずしも良いことでは
<EM>ない</EM>環境やシステム構成もあります。
<P>
<UL>
<LI>システムにユーザアカウントがない場合。</LI>
<LI>コンピュータが LAN に繋がっていて、ユーザ名やパスワードは NIS
(Network Information Services) 経由でネットワーク上の他のマシンから得
ている場合。(これは本文書の範囲を外れている点と、あまりセキュリティ向
上は望めないので説明しません)</LI>
<LI>システムが NFS (Network File System)や NIS などを用いてユーザ認
証をするためにターミナルサーバによって利用される場合</LI>
<LI>ユーザ認証はするが、shadow パスワードに対応しておらず、ソースコー
ドも無いソフトウェアを使わなければならない場合</LI>
</UL>
<P>
<H2><A NAME="ss2.2">2.2 /etc/passwd ファイルのフォーマット</A>
</H2>
<P>shadow 化されていない <CODE>/etc/passwd</CODE> ファイルは以下のようなフォーマットに
なっています:
<BLOCKQUOTE><CODE>
<PRE>
username:passwd:UID:GID:full_name:directory:shell
</PRE>
</CODE></BLOCKQUOTE>
ここで、
<DL>
<DT><B><CODE>username</CODE></B><DD><P>ユーザのログインネーム
<DT><B><CODE>passwd</CODE></B><DD><P>エンコードされたパスワード
<DT><B><CODE>UID</CODE></B><DD><P>ユーザ ID (数値)
<DT><B><CODE>GID</CODE></B><DD><P>デフォルトのグループ ID (数値)
<DT><B><CODE>full_name</CODE></B><DD><P>ユーザの本名。実際にはこのフィールドは
GECOS (General Electric Comprehensive Operating System) フィールドと呼
ばれ、ユーザの本名以外の情報も保持できます。<EM>Shadow Suite</EM> のコ
マンドおよびオンラインマニュアルではコメントフィールドとして記述されて
います。
<DT><B><CODE>directory</CODE></B><DD><P>ユーザのホームディレクトリ
<DT><B><CODE>shell</CODE></B><DD><P>ユーザのログインシェル(絶対パス記述)
</DL>
<P>例えば次のようになります:
<BLOCKQUOTE><CODE>
<PRE>
username:Npge08pfz4wuk:503:100:Full Name:/home/username:/bin/sh
</PRE>
</CODE></BLOCKQUOTE>
ここで、第2フィールドの <CODE>Np</CODE> は salt で、<CODE>ge08pfz4wuk</CODE>
は<EM>エンコード</EM>されたパスワードです。同じパスワードでも、salt/パ
スワードの組み合わせは <CODE>kbeMVnZM0oL7I</CODE> のようになる場合もありま
す。ある一つのパスワードに関してエンコードされ得る可能性は 4096通りで
す。(この例で用いた 'password' というパスワードは破られやすい点におい
て<EM>非常に悪い</EM>パスワードです。)
<P>
<P>Shadow suite がインストールされると、<CODE>/etc/passwd</CODE> ファイルは以
下のようになります:
<BLOCKQUOTE><CODE>
<PRE>
username:x:503:100:FullName:/home/username:/bin/sh
</PRE>
</CODE></BLOCKQUOTE>
この場合の2番目のフィールドの <CODE>'x'</CODE> は単に場所を埋めているだけ
です。<EM>エンコード</EM>されたパスワードは含まれなくなりますが、
<CODE>/etc/passwd</CODE> ファイルのフォーマット自体は変わりません。従って、
<CODE>/etc/passwd</CODE> ファイルを読むけれどパスワード認証は行わないプロ
グラムは以前の通りに動作します。
<P>
<P>パスワードは shadow ファイル(通常 <CODE>/etc/shadow</CODE>) に移されます。
<P>
<H2><A NAME="ss2.3">2.3 shadow ファイルのフォーマット</A>
</H2>
<P><CODE>/etc/shadow</CODE>ファイルには以下のような情報が記述されています:
<BLOCKQUOTE><CODE>
<PRE>
username:passwd:last:may:must:warn:expire:disable:reserved
</PRE>
</CODE></BLOCKQUOTE>
内容は以下のような意味を持ちます:
<DL>
<DT><B><CODE>username</CODE></B><DD><P>ユーザ名
<DT><B><CODE>passwd</CODE></B><DD><P>エンコードされたパスワード
<DT><B><CODE>last</CODE></B><DD><P>1970年1月1日から、パスワードが最後に更新された日までの日数
<DT><B><CODE>may</CODE></B><DD><P>何日前にパスワードが変更されたと思われるか
<DT><B><CODE>must</CODE></B><DD><P>パスワードを変更しなければならない期限
<DT><B><CODE>warn</CODE></B><DD><P>パスワードの期限切れの何日前にユーザに警告するか
<DT><B><CODE>expire</CODE></B><DD><P>パスワード期限切れの何日後にアカウントを抹消するか
<DT><B><CODE>disable</CODE></B><DD><P>1970年1月1日から、アカウントが抹消された日までの日数
<DT><B><CODE>reserved</CODE></B><DD><P>予約フィールド
</DL>
<P>さきほどと同じ例では <CODE>/etc/shadow</CODE> はこのようになります:
<BLOCKQUOTE><CODE>
<PRE>
username:Npge08pfz4wuk:9479:0:10000::::
</PRE>
</CODE></BLOCKQUOTE>
<P>
<H2><A NAME="ss2.4">2.4 crypt(3) の概要</A>
</H2>
<P>crypt(3) のオンラインマニュアルより:
<P>
<P>"<EM>crypt</EM>はパスワードの暗号化関数である。これは <EM>Data
Encryption Standard (DES)</EM> のアルゴリズムに、特にキー検索のハード
ウェア実装をしにくくすることを特に意図した変化をつけたものに基づいてい
る。
<P>
<P>キーはユーザの入力したパスワードである。 [エンコードされた文字列はすべ
てNULLである。]
<P>
<P><EM>salt</EM> は [a-zA-Z0-9./] の中から2文字を選んだ文字列である。この
文字列はアルゴリズムの中で4096通りの異なる結果から一つを適当に選び出す
ために用いられる。
<P>
<P>キーの各文字の下位7ビットを取り出すことで 56ビットのキーが得られる。こ
の56ビットのキーは定数文字列(通常は全て0の文字列を含む)を繰り返し暗号
化するために用いられる。戻し値は暗号化されたパスワードへのポインタであ
り、このパスワードは13文字の ASCII 文字である(最初の2文字はsaltそのも
のである)。戻し値のポインタが指す領域は呼び出しごとに上書きされる静的
なデータである。
<P>
<P>
<B>警告:</B>キー空間は 2の56乗(=7.2e16)個の値を取ることができる。この
キー空間は大量の並列計算機を用いれば全探索することが<B>可能</B>であ
る。また、<CODE>crack(1)</CODE> のようなソフトウェアは人間がパスワードに用
いそうな単語が作るキー空間の部分空間に絞って検索を行う。従って、パスワー
ドの選択ではありふれた単語や名前の使用は避けるべきである。パスワードを
決める際には破られやすいパスワードのチェックを行う <CODE>passwd(1)</CODE>
プログラムを利用すると良いだろう。
<P>
<P>DES アルゴリズム自体には癖があるので、<CODE>crypt(3)</CODE>のインタフェー
スはパスワード認証の他に使うべきではない。<CODE>crypt(3)</CODE>のインタフェー
スを暗号そのものに関わるプロジェクトに利用してはならない。このような場
合には、暗号化について書いてある良い本と広く利用することができる DES
ライブラリを入手するべきである。"
<P>
<P>ほとんどの <EM>Shadow Suites</EM> パッケージにはパスワードを16文字に倍
長化するコードが含まれています。しかし<CODE>DES</CODE>の専門家はこれを推奨
していません。パスワードの長さが倍でも、最初に左半分をエンコードして、
次に右半分をエンコードしているだけだからです。これは<CODE>crypt</CODE>の動
作のためであり、始めから倍長パスワードが使われていなかった場合と比べて
も、より<EM>脆弱な</EM>パスワードを作ってしまいます。また、ユーザに16
文字のパスワードを覚えてもらうことは困難であるという理由もあります。
<P>
<P><CODE>crypt</CODE>に代るもので、より安全で長いパスワードをサポートし(特に
MD5 アルゴリズム)、さらに<CODE>crypt</CODE>との互換性を保持しているような
認証アルゴリズムを開発しようとしているプロジェクトがあります。
<P>
<P>もし、読者が暗号化についての良い本を探しているなら、筆者は以下の本を推
薦しておきます:
<PRE>
"Applied Cryptography: Protocols, Algorithms, and Source Code in C"
by Bruce Schneier <schneier@chinet.com>
ISBN: 0-471-59756-2
</PRE>
<P>
<P>
<HR>
<A HREF="Shadow-Password-HOWTO-3.html">次のページ</A>
<A HREF="Shadow-Password-HOWTO-1.html">前のページ</A>
<A HREF="Shadow-Password-HOWTO.html#toc2">目次へ</A>
</BODY>
</HTML>