「パスワードファイル」の版間の差分
ページの作成:「 == パスワードファイル == ユーザIDとアカウント名を対応させているのがパスワードファイル /etc/passwdです。パスワードファ...」 |
|||
(2人の利用者による、間の18版が非表示) | |||
1行目: | 1行目: | ||
== パスワードファイル == | 本章を読む前に、まずパスワードを使った認証メカニズムについての一般論である[[システムにおけるパスワード管理の概要]]のページを先に読んでから本章に進むことをお薦めします。 | ||
== パスワードファイル /etc/passwd == | |||
ユーザIDとアカウント名を対応させているのがパスワードファイル | ユーザIDとアカウント名を対応させているのがパスワードファイル | ||
11行目: | 13行目: | ||
* ユーザID : ユーザを認識するための数値 | * ユーザID : ユーザを認識するための数値 | ||
* グループID : グループを認識するための数値 | * グループID : グループを認識するための数値 | ||
* コメントフィールド : 名前等の情報を記述するフィールド | * コメントフィールド([[GECOSフィールド]]) : 名前等の情報を記述するフィールド | ||
* ホームディレクトリ : ホームディレクトリ | * ホームディレクトリ : ホームディレクトリ | ||
* シェルパス : 利用するシェルのパス、もしくはシェルに相当するコマンド | * シェルパス : 利用するシェルのパス、もしくはシェルに相当するコマンド | ||
<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ディストリビューションでは、一般ユーザが(ハッシュ値となっている)パスワードを直接参照することはありません。 | |||
29行目: | 33行目: | ||
その知られてはいけない情報とはパスワードの情報です。 | その知られてはいけない情報とはパスワードの情報です。 | ||
=== | |||
=== パスワードの生成 === | |||
もちろんこのパスワードは、すでに一方向性ハッシュ関数によって撹拌されている値となってなっています。 | もちろんこのパスワードは、すでに一方向性ハッシュ関数によって撹拌されている値となってなっています。 | ||
したがって、パスワードファイルの中にあるすでに撹拌されているパスワードのハッシュ値だけ持っていても、 | したがって、パスワードファイルの中にあるすでに撹拌されているパスワードのハッシュ値だけ持っていても、 | ||
そこから元のパスワードを逆算することはできません。 | そこから元のパスワードを逆算することはできません。 | ||
:補足 パスワードの生成や管理についての詳しい説明は「[[システムにおけるパスワード管理の概要]]」の章を参照のこと。 | |||
パスワードが完全なランダムであった場合<ref>ただし辞書攻撃などが可能な類推可能な文字からなるパスワードであれば、現在ではほぼ一瞬で見つけることが出来ます。</ref>、総当たりで見つける方式しか使えません。 | |||
ただし、このままでは同じパスワード入力が同じハッシュ値になってしまいます。 | ただし、このままでは同じパスワード入力が同じハッシュ値になってしまいます。 | ||
パスワードのパターンを事前に計算し、逆引きのテーブルを用意することが可能となってしまします。 | パスワードのパターンを事前に計算し、逆引きのテーブルを用意することが可能となってしまします。 | ||
そのため、同じパスワード入力が同じハッシュ値にならないようにSalt(塩)と呼ぶランダムな初期値を加えます。 | そのため、同じパスワード入力が同じハッシュ値にならないようにSalt(塩)と呼ぶランダムな初期値を加えます。 | ||
UNIX オリジナルの方法では暗号化するためのDESを用いたメッセージ認証コード方式DES-CBC- | |||
<ref>このDES-CBC-MACの暗号学的安全性に関しての議論は http://www.cs.berkeley.edu/~daw/talks/crypt3-asia00-slides.ps を参照のこと。</ref> | 現在のGNU/Linuxではディストリビューションにより、オリジナルのUNIXが使っていたパスワードのメカニズムをベースとしたパスワード認証の方法を用いているものと、[http://www.linux-pam.org/ Linux-PAM]と呼ばれる包括的なパスワード認証のためのフレームワークを用いているものがあります。近年ではメジャーなディストリビューションの多くはLinux-PAMを採用しています。 | ||
UNIX オリジナルの方法では暗号化するためのDESを用いたメッセージ認証コード方式DES-CBC-MAC | |||
<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 , 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回繰り返して計算します。 | ||
48行目: | 64行目: | ||
[[ファイル:Password-hash.png|450px|thumb|center|パスワードの生成]] | |||
; 捕捉 : 図中では「暗号化したパスワード」という表現を使っていますが、本来は復号することができないので暗号化という言葉は暗号の考え方からして適切ではありません。しかし慣用的に「暗号化したパスワード」という言葉を使うので、ここではあえて使っています。正しくは「パスワードのハッシュ値」あるいは「パスワードのMAC値」です。 | |||
=== パスワードの保管 === | |||
オリジナルのUNIXではパスワードファイル/etc/passwdの中にユーザ名やユーザIDと共にパスワードのハッシュ値が格納されており、誰でも参照することが可能でした。 | オリジナルのUNIXではパスワードファイル/etc/passwdの中にユーザ名やユーザIDと共にパスワードのハッシュ値が格納されており、誰でも参照することが可能でした。 | ||
攻撃側は、パスワード候補を用意し、その出力をパスワードファイルの中にあるパスワードのハッシュ値と比較することによって効率的にパスワードを見つけることが可能です。 | 攻撃側は、パスワード候補を用意し、その出力をパスワードファイルの中にあるパスワードのハッシュ値と比較することによって効率的にパスワードを見つけることが可能です。 | ||
そこで変換後のパスワードを一般ユーザが直接は参照できない別ファイルに取っておき、認証するコマンドやメンテナンスのコマンドのみがアクセスできるようにしました。これがシャドーパスワードの仕組みです。 | そこで変換後のパスワードを一般ユーザが直接は参照できない別ファイルに取っておき、認証するコマンドやメンテナンスのコマンドのみがアクセスできるようにしました。これがシャドーパスワードの仕組みです。 | ||
<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 | -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> | |||
== 脚注 == | == 脚注 == |
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
脚注
- ↑ ただし辞書攻撃などが可能な類推可能な文字からなるパスワードであれば、現在ではほぼ一瞬で見つけることが出来ます。
- ↑ CBC-MACに関してはwikipedia(英語版)を参照のこと。
- ↑ このDES-CBC-MACの暗号学的安全性に関しての議論は http://www.cs.berkeley.edu/~daw/talks/crypt3-asia00-slides.ps , http://www.cypherpunks.ca/~iang/pubs/crypt3-asia00.pdf を参照のこと。
- ↑ これは計算負荷をあげているものですが、これはDESを使っていた時は乱雑さとして有効となるビット数が少なかったためで、一方向性ハッシュ関数の場合、暗号学的には繰り返して計算負荷をあげるよりもランダムなパスワード文字数を増やす方法の方が優れています。
目次へ