		LanManager / Samba パスワードの暗号化
		-------------------------------------

Samba 用の LanManager および Windows NT 互換のパスワード暗号化の
開発によって、Samba は LanManager や Windows NT サーバと厳密に同じ
方法でユーザ接続の認証を行うことができる。

この文書は、SMB パスワード暗号化アルゴリズムがどのように機能するか、
また、これの使用を必要とするかどうかの選択の上で存在する問題は何かを
記述する。注意深く読むべきであるが、特にセキュリティについての部分と 
「PROS AND CONS」の節に注意して欲しい。

どのように機能するか?
---------------------

LanManager の暗号化は、UNIX のパスワード暗号化といくらか類似している。
サーバはユーザのパスワードがハッシュされた(hashed)値を含むファイルを
使用する。その値は、ユーザの平文な(plaintext)パスワードを受け取り、
大文字にして、先頭の 14 バイトを切り取る(または 14 バイトになるように
null バイトを詰める)ことによって生成される。この 14 バイトの値は、８バイトの
`マジック'値を暗号化するための２つの 56 ビット DES キーとして使用され、
形成した16 バイトの値がサーバとクライアントによって保存される。この値が
「ハッシュされたパスワード(hashed password)」ということを覚えておこう。

Windows NT の暗号化は、ユーザ・パスワードの Unicode バージョンで
MD4 ハッシュを行うことから成り立つ、より高い質の機構である。
これも不可逆な 16 バイトのハッシュ値を作り出す。

クライアント(LanManager、Windows for WorkGroups, Windows 95 あるいは
Windows NT)が Samba のドライブ(または Samba リソース)のマウントを望むとき、
クライアントは最初に接続を要求して、そしてクライアントとサーバが使用する
プロトコルを協定(negotiate)する。この要求に対する応答において、Samba サーバは
8 バイトの乱数を生成して付け加える。この値は応答の送信後に Samba サーバに
保存される。これは「呼びかけ(challenge)」として知られる。

呼びかけの値は、クライアントの接続毎に異なる。

クライアントは、ハッシュされたパスワード(上記したように 16 バイトの値)
を使用し、３つの 56 ビット(計 21 バイト) DES キーになるように 5 バイトの
null を追加し、それぞれのキーは呼びかけられた 8 バイトの値を暗号化する
ために使用される。暗号化により作られた 24 バイトの値は「応答(response)」
として知られる。

SMB の SMBsessionsetupX (ユーザレベルのセキュリティが選択されたとき)
または SMBtconX (共有レベルのセキュリティが選択されたとき)の呼び出しに
おいて、24 バイトの応答はクライアントによって Samba サーバへ返される。
Windows NT のプロトコル・レベルでは、上記の計算は両方のユーザ
パスワードのハッシュ値においてなされ、両方の応答が SMB 呼び出しで
返されて、２つの 24 バイト値が得られる。

Samba サーバは、自身が保持する 16 バイトのハッシュされたパスワード
(smbpasswd ファイルから読む - 後述)の値とプロトコル協定の応答時から
保持している呼びかけ(challenge)値を使用して、上記の計算を生み出す。
そして Samba が計算した 24 バイトの値が、クライアントから返された
24 バイトの値と一致するかどうかを検査する。

この値が完全に一致したなら、クライアントは正しいパスワード(もしくは
16 バイトのハッシュ値 - 下記のセキュリティの注意を参照)を知っていた
ことになり、アクセスを許可される。一致せず、クライアントが正しい
パスワードを知っていなければ、アクセスは拒否される。

Samba サーバはユーザパスワードの平文(cleartext)を知ったり保存したりしない
ことに注意して欲しい - 16 バイトのハッシュ値だけがパスワードから得られる。
平文なパスワードまたは 16 バイトのハッシュ値がネットワーク上を転送される
ことはない点にも注意 - このようにしてセキュリティを増す。

セキュリティに関する重要な注意
------------------------------

UNIX と SMB のパスワード暗号化の技術は、表向きは同じように見える。
しかし、この類似は表向きだけである。一般的に UNIX はログイン時に
ネットワークを通して平文なパスワードを送る。これはまずい。
SMB の暗号化の構成は平文なパスワードをネットワーク上に送信することは
ないが、ディスクに 16 バイトのハッシュ値を格納する。これもまずい。
なぜか？ 16 バイトのハッシュ値は「パスワードと等価」であるためだ。
その値からユーザのパスワードを得ることはできないが、修正を加えた
クライアントでサーバへのアクセスを得るために使用される可能性がある。

これには攻撃者(atacker)のためのかなりの技術的知識を必要とするで
あろうが、確実に実行可能である。したがって、smbpasswd ファイルは
すべてのユーザの平文なパスワードが入っているものとして扱うべきである。
その中身は機密を保たれなければならず、それゆえにファイルは保護される
べきである。

理想的には、ネットワーク上とディスク上どちらの平文のパスワードも必要と
しないパスワード機構を望むであろう。あいにく、Samba にほかの SMB
システム(WinNT, WfWg, Win95, そのほか)との互換性を守らせるために、
これは利用できない。


PROS AND CONS
-------------

両方の機構には利点と欠点がある。

SMB 暗号化の利点:
-----------------------------

- 平文なパスワードはネットワークを通して渡されない。ネットワーク探知器
を用いた誰かが SMB サーバへ向かうパスワードを記録することは当然ありえない。

- WinNT は SMB 暗号化パスワードを使用していないサーバとの通信を好まない。
その上、サーバがユーザ・レベルのセキュリティ方式であると、サーバの
ブラウズを拒否する。それは各々の接続においてパスワードに対するユーザ
の取得を強要し、非常に鬱陶しい。これを防ぐためにできる唯一の方法は、
SMB 暗号化を使用することである。

暗号化されないパスワードの利点:
--------------------------------------

- 平文なパスワードはディスクに保存されない。

- login や ftp のようなほかの UNIX サービスと同じパスワード・ファイルを
使用する。

- たぶん、あなたは既にほかのサービス(telnet や ftp など)を使用しており、
それらがネットワークを通して平文なテキストのパスワードを送っているため、
SMB でそれらを送信しなくてもそれほど大した意味はない。

smbpasswd ファイル
-------------------

Samba が上記のプロトコルに参加するには、ユーザ名を与えられた 16 バイトの
ハッシュ値を得られなければならない。残念ながら、UNIX パスワードの値も
一方向のハッシュ関数である(すなわち、UNIX のユーザ・パスワードのハッシュを
与えた平文なユーザ・パスワードを取り戻すのは不可能である)ため、この
16 バイトの値を持つ別のパスワード・ファイルを保持しなければならない。
これら２つのパスワード・ファイルによって UNIX /etc/passwd と smbpasswd
ファイルが同期されない問題を最小にするため、ユーティリティ 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 に設定し、
許可(permission) は次のような設定にするべきである:-

r-x------

コマンド

chmod 500 /usr/local/samba/private

はこの目的を実行できる。同様に private ディレクトリ中の smbpasswd ファイルを
root に所有させて、その許可を次のように設定したほうがよい。

rw-------

コマンド:-

chmod 600 smbpasswd.

smbpasswd ファイルの形式は

username:uid:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX:Long name:user home dir:user shell

username、uid、XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX の部分だけが重要で、
Samba コードで検査される。

２つの「:」の間にある XXX 部分の 32 文字の「X」は極めて重要である - 
smbpasswd と Samba コードは、「:」文字間に 32 の文字を持っていない
エントリの認証に失敗するだろう。最初の XXX 部分は Lanman パスワード用の
ハッシュで、２番目は Windows NT バージョン用である。

パスワード・ファイルが生成された時点では、すべてのユーザは 32 文字の「X」を
含むパスワード・エントリを持っている。既定では、そのようなエントリを持つ
ユーザのアクセスは拒絶される。ユーザがパスワードを持つと、「X」は
32 個の ASCII 文字による 16 進数(0-9, A-F)に変わる。
ユーザ・パスワードの 16 バイトのハッシュ値が ASCII 表現で存在する。

ユーザをパスワードなしに設定する(お勧めしない)には、vi を使ってファイルを
編集し、最初の 11 文字を次の ASCII テキストに置き換える。

NO PASSWORD

たとえば、ユーザ bob のパスワードを消すには、彼の smbpasswd ファイルの
エントリはこのように見える:

bob:100:NO PASSWORDXXXXXXXXXXXXXXXXXXXXX:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX:Bob's full name:/bobhome:/bobshell

ユーザが smbpasswd コマンドを使って自分のパスワードを設定することを許可
しているなら、最初は NO PASSWORD をユーザに与えたいと思うだろう。
そうすることで、ユーザは新しいパスワードに変更するときに以前のパスワードを
入力しなくても済む。(お勧めしない)

注意 : このファイルは非常に注意深く保護しなければならない。このファイルに
アクセスした誰かが(十分なプロトコルの知識を持って) SMB サーバへのアクセスを
得ることができる。従って、このファイルは標準的な UNIX の /etc/passwd ファイル
よりもさらに取り扱いに慎重を要する。

smbpasswd コマンド
------------------

smbpasswd コマンドは smbpasswd ファイルにある２つの 32 バイトのパスワード
フィールドを維持する。UNIX の passwd や yppasswd プログラムと同類にさせたい
なら、/usr/local/samba/bin (もしくは Samba バイナリの主ディレクトリ)に
インストールし、root に setuid しよう。

これを実行しないと、root ユーザが全ユーザのパスワードを設定しなければ
ならないだろう。注意して欲しい。

smbpasswd を root に setuid するには、Samba バイナリをインストールした
ディレクトリに入り、次のコマンドを(root になって)打ち込む:

chown root smbpasswd
chmod 4555 smbpasswd

smbpasswd を root に setuid してインストールすると、以下のように
使用できる。

smbpasswd
Old SMB password: <ここに古い値を入力する - NO PASSWORD ならリターンを打つだけ>
New SMB Password: <新しい値を入力する>
Repeat New SMB Password: <新しい値を再入力する>

古い値がユーザ用に保存されている現在の値と一致しない場合や、
２つの新しい値がお互い一致しない場合、パスワードは変更されない。

一般ユーザから起動すると、自分自身の Samba パスワードの変更だけ認められる。

root ユーザによる smbpasswd の実行には任意の引数をとることができ、
指定したユーザ名の SMB パスワードを
If run by the root user smbpasswd may take an optional argument,
specifying the user name whose SMB password you wish to change.
root による smbpasswd の実行では古いパスワード値を思い出させたり検査を
行わないことに注意してほしい。よって、パスワードを忘れてしまったユーザの
対してパスワードを設定することができる。

smbpasswd は passwd や yppasswd コマンドを使用する UNIX ユーザに
馴染ませるように、同じ様式で動作するようデザインされている。

注意: smbpasswd は root に setuid してインストールされるように
デザインされているため、だれもが潜在的なセキュリティの欠陥を期待して
ソース・コードを調べるかもしれないことを私は認識している。
setuid プログラムが適切に書かれていないと、システム・クラッカーのための
開かれたドアとなる。私(著者である Jeremy Allison)にすべての問題を報告
することで、このプログラムのセキュリティを確保する手伝いをしてほしい。

私の email アドレスは:-

jra@cygnus.com

Samba を LanManager 暗号化対応にするための設定
--------------------------------------------------

以下は Samba をパスワード暗号化対応に設定する方法をとても簡潔に
記述したものである。おそらくさらに完全な説明が後に付け加えられるだろう。

1) libdes ライブラリを入手し、コンパイルする。ソースは
ftp://samba.anu.edu.au/pub/libdes/ から入手できる。

2) makefile の暗号化の材料を有効にして、それが libdes ライブラリと
インクルード・ファイル(des.h が必要)を指していることを確認する。
コメントをはずす必要があるエントリは、次のようなコメントの後にある
４行である。

# This is for SMB encrypted (lanman) passwords.

変数 DES_BASE を DES ライブラリをインストールした場所を指すよう
変更しなくてはならないことに注意。

3) 通常どおりに Samba をコンパイルし、インストールする。

4) あなたのシステムで getsmbpass.c モジュールをコンパイルできないなら
Makefile から -DSMBGETPASS の定義を削除する。

5) 暗号化されたパスワードを可能にするため smb.conf の [global] セクション
に "encrypt passwords = yes" を追加する。

6) Makefile で指定した場所に初めの smbpasswd パスワード・ファイルを
作成する。既存の Makefile (正当で標準的な形式であると想定する)に
基づいてこれを行う簡単な方法は次のようになる:

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

private と smbpasswd の所有権を root に変更する。

chown -R root /usr/local/samba/private

正しい許可を /usr/local/samba/private に設定する。

chmod 500 /usr/local/samba/private

正しい許可を /usr/local/samba/private/smbpasswd に設定する。

chmod 600 /usr/local/samba/private/smbpasswd

mksmbpasswd.sh スクリプトは Samba のソース・ディレクトリにあることを
覚えておこう。

もし mksmbpasswd.sh が失敗したなら、あなたは次のようなエントリを必要と
していることを知り得る:

# SMB password file.
tridge:148:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX:Andrew Tridgell:/home/tridge:/bin/tcsh

ユーザ名と uid の欄は適切にしなければならないことに注意。また、X の数も
正しくすること。(32 個なくてはならない)

お望みなら、smbpasswd プログラムを root に setuid してインストールする。

chown root /usr/local/samba/bin/smbpasswd
chmod 4555 /usr/local/samba/bin/smbpasswd

7) smbpasswd コマンドを使用するユーザにパスワードを設定する。たとえば、
root になって「smbpasswd tridge」を実行することができる。

8) やってみよう!

いまは smbclient も暗号化に対応しているため、smbclient を使用して
これらをテストできることに注意。

Samba をミラーしている USA サイトへの注意
-----------------------------------------

DES ライブラリは USA では軍需品とみなされている。US の法の下で
このソフトウェアを輸出したり、自由に入手できる ftp サイトに置くことは
違法となる。

libdes ライブラリは samba.anu.edu.au サイトからミラーしないでください。

Thank you,

Jeremy Allison.

日本語訳について
----------------
Samba 1.9.16p10 のソースに付属していたものを翻訳しました。
誤訳などについては翻訳者にお知らせください。

    翻訳者:佐藤文優(fumiya@yk.rim.or.jp,fumiya@cij.co.jp)
    日付  :1997年2月24日(月)
