最終更新: 2019年4月3日 (水) 06:42

パスワードファイル

本章を読む前に、まずパスワードを使った認証メカニズムについての一般論であるシステムにおけるパスワード管理の概要のページを先に読んでから本章に進むことをお薦めします。

パスワードファイル /etc/passwd

ユーザIDとアカウント名を対応させているのがパスワードファイル /etc/passwdです。パスワードファイルのフォーマットは次の通りです。


  • パスワードエントリのフォーマットのフィールドは":"で区切られる
  • アカウント名 : ログイン時に使用するアカウント名
  • パスワード : パスワードをハッシュ値に置き換えたもの
  • ユーザID : ユーザを認識するための数値
  • グループID : グループを認識するための数値
  • コメントフィールド(GECOSフィールド) : 名前等の情報を記述するフィールド
  • ホームディレクトリ : ホームディレクトリ
  • シェルパス : 利用するシェルのパス、もしくはシェルに相当するコマンド
 /etc/passwd の エントリー例
 hironobu:x:1825:2000:Hironobu SUZUKI,,,:/home/hironobu:/bin/bash


このエントリー例は実際運用しているシステムのパスワードファイルから抜き出したものです。 パスワードのフィールドは"x"が入っています。 これは利用しているシステムがシャドーパスワードを導入しているからです。 そのため現状のGNU/Linuxディストリビューションでは、一般ユーザが(ハッシュ値となっている)パスワードを直接参照することはありません。


元々のパスワードファイルには2つの情報が入っています。 一つは公開して誰でも知って良い情報、もう一つは知られてはいけない情報です。 その知られてはいけない情報とはパスワードの情報です。


パスワードの生成

もちろんこのパスワードは、すでに一方向性ハッシュ関数によって撹拌されている値となってなっています。 したがって、パスワードファイルの中にあるすでに撹拌されているパスワードのハッシュ値だけ持っていても、 そこから元のパスワードを逆算することはできません。


補足 パスワードの生成や管理についての詳しい説明は「システムにおけるパスワード管理の概要」の章を参照のこと。


パスワードが完全なランダムであった場合[1]、総当たりで見つける方式しか使えません。 ただし、このままでは同じパスワード入力が同じハッシュ値になってしまいます。 パスワードのパターンを事前に計算し、逆引きのテーブルを用意することが可能となってしまします。 そのため、同じパスワード入力が同じハッシュ値にならないようにSalt(塩)と呼ぶランダムな初期値を加えます。


現在のGNU/Linuxではディストリビューションにより、オリジナルのUNIXが使っていたパスワードのメカニズムをベースとしたパスワード認証の方法を用いているものと、Linux-PAMと呼ばれる包括的なパスワード認証のためのフレームワークを用いているものがあります。近年ではメジャーなディストリビューションの多くはLinux-PAMを採用しています。


UNIX オリジナルの方法では暗号化するためのDESを用いたメッセージ認証コード方式DES-CBC-MAC [2] を一方向性ハッシュ関数として利用してます。 [3] glibcで実装されているパスワード認証のためのアルゴリズムでは、DES-CBC-MACではなく一方向性ハッシュ関数としてMD5、SHA1やSHA-256を使います。 オリジナルの方法では、DESを使う場合は25回繰り返して計算します。glibcでは一方向性ハッシュ関数を使う場合は最低1000回繰り返して計算します。 [4]


パスワードの生成


捕捉 
図中では「暗号化したパスワード」という表現を使っていますが、本来は復号することができないので暗号化という言葉は暗号の考え方からして適切ではありません。しかし慣用的に「暗号化したパスワード」という言葉を使うので、ここではあえて使っています。正しくは「パスワードのハッシュ値」あるいは「パスワードのMAC値」です。

パスワードの保管

オリジナルのUNIXではパスワードファイル/etc/passwdの中にユーザ名やユーザIDと共にパスワードのハッシュ値が格納されており、誰でも参照することが可能でした。 攻撃側は、パスワード候補を用意し、その出力をパスワードファイルの中にあるパスワードのハッシュ値と比較することによって効率的にパスワードを見つけることが可能です。


そこで変換後のパスワードを一般ユーザが直接は参照できない別ファイルに取っておき、認証するコマンドやメンテナンスのコマンドのみがアクセスできるようにしました。これがシャドーパスワードの仕組みです。


 $ ls -l  /etc/shadow
 -rw-r-----    1 root     shadow        789 Oct 22  2003 /etc/shadow
 $ ls -l /usr/bin/passwd
 -rwsr-xr-x    1 root     root           24616 Nov  3 04:56 /usr/bin/passwd
 $ ls -l /usr/bin | grep shadow
 -rwxr-sr-x    1 root     shadow      32584 Nov  3 04:56 chage
 -rwxr-sr-x    1 root     shadow      15976 Nov  3 04:56 expiry
 -rwxr-sr-x    1 root     shadow       6628 Jun 28 05:20 kcheckpass

脚注

  1. ただし辞書攻撃などが可能な類推可能な文字からなるパスワードであれば、現在ではほぼ一瞬で見つけることが出来ます。
  2. CBC-MACに関してはwikipedia(英語版)を参照のこと。
  3. このDES-CBC-MACの暗号学的安全性に関しての議論は http://www.cs.berkeley.edu/~daw/talks/crypt3-asia00-slides.ps‎ , http://www.cypherpunks.ca/~iang/pubs/crypt3-asia00.pdf を参照のこと。
  4. これは計算負荷をあげているものですが、これはDESを使っていた時は乱雑さとして有効となるビット数が少なかったためで、一方向性ハッシュ関数の場合、暗号学的には繰り返して計算負荷をあげるよりもランダムなパスワード文字数を増やす方法の方が優れています。

目次