Chapter 13. LanMan と NT Password の暗号化

Jeremy Allison

Samba Team

19 Apr 1999

Table of Contents

初めに
どのようにして動作するか?
smbpasswd ファイル

初めに

Samba用の、LanManager と Windows NT互換のパスワード暗号化は、 LanManager または Windows NT サーバーと正確に同じ方法で、ユーザーの接続を 検証することが出来るようになっている。

この文書は、どのようにSMB パスワードの暗号化アルゴリズムが動作し、 それを使うことを選択する場合に、何が問題化について記述している。この文書を 特に、セキュリティと"PROS and CONS"節を注意深く読むべきである。

どのようにして動作するか?

LanManagerの暗号化はUNIパスワードの暗号化と若干似ている。サーバーは、 ユーザーのパスワードをハッシュ化した値を含むファイルを使う。これは、ユーザーからの 平文パスワートを得て、それを大文字化し、14文字で打ち切るか、NULL文字を14文字に なるまで埋めることのどちらかを行って作成する。この14バイトの値は、'特別な' 8バイトの値に暗号化されるため、2つの56ビットDESキーとして使われ、サーバーと クライアントによって保存される16バイトの値に整形される。これは、 "ハッシュ化されたパスワード"として知られる。

Windows NTの暗号化は非常に高品質のメカニズムで、ユニコード版の、 ユーザーのパスワード上で、MD4ハッシュを行うことから成り立っている。これはまた、 可逆変換不可能な16バイトハッシュ値である。

クライアント(LanManager, Windows for WorkGroups, Windows 95 か Windows NT)がSambaドライブ(かSambaリソース)をマウントしようとした時、 最初に接続を要求し、クライアントとサーバーが使うプロトコルを調整する。 この要求のリプライ中で、Sambaサーバーは8バイトのランダム値を生成し添付する。 これは、"チャレンジ"と呼ばれ、リプライが返ってくることに備えてSambaサーバー中に 保存される。チャレンジはすべてのクライアント接続毎に異なる。

クライアントは次にハッシュ化されたパスワード(上記で説明されている 16バイト値)を使い、5つのNULL文字を追加し、3つの56ビットDESキーとし、 それは、おのおのチャレンジの8バイト値を暗号化するのに使われ、"レスポンス" と呼ばれる24バイトの値に整形する。

SMB呼び出しSMBsessionsetupX(ユーザーレベルセキュリティが選択された場合)中か、 STBtconX呼び出し(共有レベルセキュリティが選択された場合)中で、24バイトの レスポンスはクライアントによってSambaサーバーに戻される。Windows NTプロトコル レベル用に、上記の計算が、ユーザーのパスワードのハッシュ両方ととレスポンス両方に 対して行われ、2つの24バイト値がSMB呼び出しに対して戻される。

Sambaサーバーは次に上記の計算を、サーバー内に保存されている16バイトの ハッシュ化されたパスワード(後述するsmbpasswdから読んで)、 ネゴシエートプロトコルの返答から得たチャレンジ値を使って再度行う。それは 次に、計算した24バイトの値がクライアントから返されたものと一致するかを 確認する。

もしも、それらの値が性格に一致するならば、クライアントが正しいパスワード (か、16バイトのハッシュ化された値 - 以下のセキュリティに関する注意を参照) を使っていて、その結果アクセスは許可される。もしもそうでない場合、 クライアントは正しいパスワードを使っておらず、アクセスは拒否される。

Sambaサーバーはユーザーの平文パスワードを受け取ったり、格納することは 決してないことに注意。それに由来する16バイトのハッシュ値のみである。また、 平文パスワードまたは16バイトのハッシュ値はネットワーク上を決して流れない。 そのため、セキュリティは向上する。

smbpasswd ファイル

Sambaが上記のプロトコルに参加するために、それがユーザー名と等価ならば、 16バイトのハッシュ値を検索できる必要がある。残念ながら、UNIXパスワードの 値は1方向ハッシュ関数による値なので(すなわち、UNIXのハッシュとして与えられた、 ユーザーの平文パスワードを検索することは不可能である)、この16バイト値を含む 分離されたパスワードファイルを用意しなければならない。2つのパスワードファイルに 起因する、同期ずれ問題を最小限にするために、UNIXの /etc/passwdsmbpasswd、 ユーティリティmksmbpasswd.shがUNIXの /etc/passwdからsmbpasswdファイルを生成するために 提供されている。

使用している/etc/passwdファイルからsmbpasswd ファイルを生成するために、以下のコマンドを使用する:

$ cat /etc/passwd | mksmbpasswd.sh > /usr/local/samba/private/smbpasswd

もしも、NISを使っているシステム上ならば、以下を使用する

$ ypcat passwd | mksmbpasswd.sh > /usr/local/samba/private/smbpasswd

mksmbpasswd.shプログラムは、Sambaソース ディレクトリ中にある。既定値では、smbpasswdファイルは下記にある:

/usr/local/samba/private/smbpasswd

/usr/local/samba/private/ ディレクトリの 所有者は、rootに設定すべきであり、それのアクセス許可設定は、0500 (chmod 500 /usr/local/samba/private)に設定すべきである。

同じように、privateディレクトリ内のsmbpasswdファイルはrootが所有 すべきであり、それのアクセス許可設定は、0600 (chmod 600 smbpasswd)にすべきである。

smbpasswdファイルの形式は以下の通り(ここでは行を折り返している。 smbpasswdファイル内では、1つのエントリー毎に1行となっている):

username:uid:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX:
	[Account type]:LCT-<last-change-time>:Long name
	

Although only the username, uid, XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX, [Account type]と last-change-timeセクションのみが重要であり、Sambaソースコード 内ではそれらのみが参照される。

XXXセクション中に、32の'X'文字の間に2つの':'文字があることが、 特に重要で、smbpasswdとSambaのコードは、 ':'の文字の間に32文字がない任意のエントリーについては認証に失敗する。 最初のXXXセクションはLanman passwordハッシュで、2番目はWindows NT 用である。

passwordファイルが生成された時、すべてのユーザーは32個の'X'文字を含む パスワードエントリーを持つ。既定値で、これはこのユーザーに対して、何らの アクセスも許可しない。ユーザーがパスワードを設定すると、'X'文字は32バイトの ASCII16進数値(0-9,A-F)に変わる。これは、ユーザーのパスワードの、 16バイトハッシュ値を表現したものである。

(推奨しないが)ユーザーがパスワードを持たないようにするためには、viを 使ってこのファイルを編集し、最初の11文字をASCII文字列 "NO PASSWORD"(引用符は勘定に入れない)に置き換える。

たとえば、ユーザーbobのパスワードをなくすには、彼のパスワードファイルの エントリーを以下のようにする:

bob:100:NO PASSWORDXXXXXXXXXXXXXXXXXXXXX:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX:
	[U          ]:LCT-00000000:Bob's full name:/bobhome:/bobshell
	

もしも、自分自身でsmbpasswdコマンドを使ってパスワードを設定することを認めて いるならば、(推奨しないが)ユーザーがパスワードを再設定する時に、以前の パスワードを入力しなくてすむよう、初期値としてユーザーに NO PASSWORD を設定しても よいだろう。これを行うためには、smbpasswdプログラムは そのユーザーがパスワードなしで動くために、smbdデーモンに 接続できる必要がある。これを行うには以下のような設定を

null passwords = yes

smb.confファイルの[global]セクションに(これが、なぜ上記の記述が 推奨されないかの理由である)記述する。出来れば、最初に各ユーザーの初期パスワードを 設定すれば、使用するサーバー上でこれを有効にしなくてすむ。

注意 : このファイルはとても注意深く保護すべきである。 誰でもがこのファイルにアクセスできると言うことは、(プロトコルについて 十分な知識がなくても)使用するSMBサーバーへのアクセス権を得ることが出来ることに なるからである。ファイルはそのため通常のUNIX/etc/passwd ファイルよりもより機密性が高い。