「パスワードファイル」の版間の差分

提供: UnixClassWiki
移動先: 案内検索
(パスワードの保管)
(パスワードの生成)
(2人の利用者による、間の11版が非表示)
1行目: 1行目:
 +
 +
本章を読む前に、まずパスワードを使った認証メカニズムについての一般論である[[システムにおけるパスワード管理の概要]]のページを先に読んでから本章に進むことをお薦めします。
  
 
== パスワードファイル /etc/passwd ==  
 
== パスワードファイル /etc/passwd ==  
15行目: 17行目:
 
* シェルパス :  利用するシェルのパス、もしくはシェルに相当するコマンド
 
* シェルパス :  利用するシェルのパス、もしくはシェルに相当するコマンド
  
 
+
<pre>
 
  /etc/passwd の エントリー例
 
  /etc/passwd の エントリー例
 
  hironobu:x:1825:2000:Hironobu SUZUKI,,,:/home/hironobu:/bin/bash
 
  hironobu:x:1825:2000:Hironobu SUZUKI,,,:/home/hironobu:/bin/bash
 +
</pre>
  
  
23行目: 26行目:
 
パスワードのフィールドは"x"が入っています。
 
パスワードのフィールドは"x"が入っています。
 
これは利用しているシステムがシャドーパスワードを導入しているからです。
 
これは利用しているシステムがシャドーパスワードを導入しているからです。
 +
そのため現状のGNU/Linuxディストリビューションでは、一般ユーザが(ハッシュ値となっている)パスワードを直接参照することはありません。
  
  
30行目: 34行目:
  
  
=== パスワードの保管 ===
+
=== パスワードの生成 ===
  
  
36行目: 40行目:
 
したがって、パスワードファイルの中にあるすでに撹拌されているパスワードのハッシュ値だけ持っていても、
 
したがって、パスワードファイルの中にあるすでに撹拌されているパスワードのハッシュ値だけ持っていても、
 
そこから元のパスワードを逆算することはできません。
 
そこから元のパスワードを逆算することはできません。
総当たりで見つける方式しか使えません。
+
パスワードが完全なランダムであった場合<ref>ただし辞書攻撃などが可能な類推可能な文字からなるパスワードであれば、現在ではほぼ一瞬で見つけることが出来ます。</ref>、総当たりで見つける方式しか使えません。
 
ただし、このままでは同じパスワード入力が同じハッシュ値になってしまいます。
 
ただし、このままでは同じパスワード入力が同じハッシュ値になってしまいます。
 
パスワードのパターンを事前に計算し、逆引きのテーブルを用意することが可能となってしまします。
 
パスワードのパターンを事前に計算し、逆引きのテーブルを用意することが可能となってしまします。
42行目: 46行目:
  
  
現在のGNU/Linuxではディストリビューションにより、オリジナルのUNIXが使っていたパスワードのメカニズムをベースとしたパスワード認証の方法を用いているものと、Linux-PAMと呼ばれる包括的なパスワード認証のためのフレームワークを用いているものがあります。ただし、メジャーなディストリビューションはLinux-PAMを採用しています。
+
現在のGNU/Linuxではディストリビューションにより、オリジナルのUNIXが使っていたパスワードのメカニズムをベースとしたパスワード認証の方法を用いているものと、[http://www.linux-pam.org/ Linux-PAM]と呼ばれる包括的なパスワード認証のためのフレームワークを用いているものがあります。近年ではメジャーなディストリビューションの多くはLinux-PAMを採用しています。
  
  
48行目: 52行目:
 
<ref> CBC-MACに関しては[http://en.wikipedia.org/wiki/CBC-MAC wikipedia(英語版)]を参照のこと。 </ref>
 
<ref> CBC-MACに関しては[http://en.wikipedia.org/wiki/CBC-MAC wikipedia(英語版)]を参照のこと。 </ref>
 
を一方向性ハッシュ関数として利用してます。
 
を一方向性ハッシュ関数として利用してます。
<ref>このDES-CBC-MACの暗号学的安全性に関しての議論は http://www.cs.berkeley.edu/~daw/talks/crypt3-asia00-slides.ps‎ を参照のこと。</ref>
+
<ref>このDES-CBC-MACの暗号学的安全性に関しての議論は http://www.cs.berkeley.edu/~daw/talks/crypt3-asia00-slides.ps‎ , http://www.cypherpunks.ca/~iang/pubs/crypt3-asia00.pdf を参照のこと。</ref>
 
glibcで実装されているパスワード認証のためのアルゴリズムでは、DES-CBC-MACではなく一方向性ハッシュ関数としてMD5、SHA1やSHA-256を使います。
 
glibcで実装されているパスワード認証のためのアルゴリズムでは、DES-CBC-MACではなく一方向性ハッシュ関数としてMD5、SHA1やSHA-256を使います。
 
オリジナルの方法では、DESを使う場合は25回繰り返して計算します。glibcでは一方向性ハッシュ関数を使う場合は最低1000回繰り返して計算します。
 
オリジナルの方法では、DESを使う場合は25回繰り返して計算します。glibcでは一方向性ハッシュ関数を使う場合は最低1000回繰り返して計算します。
54行目: 58行目:
  
  
 +
[[ファイル:Password-hash.png|450px|thumb|center|パスワードの生成]]
  
  
  撹拌のモデル (Cipher-Block-Chain方式)
+
; 捕捉 : 図中では「暗号化したパスワード」という表現を使っていますが、本来は復号することができないので暗号化という言葉は暗号の考え方からして適切ではありません。しかし慣用的に「暗号化したパスワード」という言葉を使うので、ここではあえて使っています。正しくは「パスワードのハッシュ値」あるいは「パスワードのMAC値」です。
                      +----------+
+
                      V          |(回数分)
+
  パスワード+Salt---->[ハッシュ関数]-->+----------> 暗号化されたパスワード
+
 
+
  
 +
=== パスワードの保管 ===
  
 
オリジナルのUNIXではパスワードファイル/etc/passwdの中にユーザ名やユーザIDと共にパスワードのハッシュ値が格納されており、誰でも参照することが可能でした。
 
オリジナルのUNIXではパスワードファイル/etc/passwdの中にユーザ名やユーザIDと共にパスワードのハッシュ値が格納されており、誰でも参照することが可能でした。
71行目: 73行目:
  
  
 
+
<pre class="bash">
 
  $ ls -l  /etc/shadow
 
  $ ls -l  /etc/shadow
 
  -rw-r-----    1 root    shadow        789 Oct 22  2003 /etc/shadow
 
  -rw-r-----    1 root    shadow        789 Oct 22  2003 /etc/shadow
 
  $ ls -l /usr/bin/passwd
 
  $ ls -l /usr/bin/passwd
  -rwsr-xr-x    1 root    root       24616 Nov  3 04:56 /usr/bin/passwd
+
  -rwsr-xr-x    1 root    root           24616 Nov  3 04:56 /usr/bin/passwd
 
  $ ls -l /usr/bin | grep shadow
 
  $ ls -l /usr/bin | grep shadow
 
  -rwxr-sr-x    1 root    shadow      32584 Nov  3 04:56 chage
 
  -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      15976 Nov  3 04:56 expiry
 
  -rwxr-sr-x    1 root    shadow      6628 Jun 28 05:20 kcheckpass
 
  -rwxr-sr-x    1 root    shadow      6628 Jun 28 05:20 kcheckpass
 +
</pre>
  
 
== 脚注 ==
 
== 脚注 ==

2015年7月27日 (月) 19:26時点における版

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

パスワードファイル /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を使っていた時は乱雑さとして有効となるビット数が少なかったためで、一方向性ハッシュ関数の場合、暗号学的には繰り返して計算負荷をあげるよりもランダムなパスワード文字数を増やす方法の方が優れています。

目次