!==
!== ENCRYPTION.txt for Samba release 2.0.7 26 Apr 2000
!==
寄稿者: Jeremy Allison <samba@samba.org>
更新日:	1999/04/19
注意:	WinNT.txt も参照のこと

翻訳者:	佐藤文優 <fumiya@samba.gr.jp>
翻訳者:	高橋基信 <monyo@samba.gr.jp>
更新日:	1999/09/17

主題:	LanManager / Samba パスワードの暗号化
============================================================================

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

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

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

LanManager の暗号化は、UNIX のパスワード暗号化といくらか類似している。
サーバは、ユーザのパスワードをハッシュ化 (hashed) した値を含むファイルを
使用する。この値を得るには、まず、ユーザの平文 (plaintext) パスワードを
受け取り、大文字にして、先頭の 14 バイトを切り取る(または 14 バイトに
なるように null バイトを詰める)。この 14 バイトの値は、8 バイトの
「マジック」値を暗号化するための 2 つの 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 バイトの値)
を利用して、3 つの 56 ビット DES キー(計 21 バイト)になるように 5 バイトの
null を追加し、それぞれのキーは呼びかけられた 8 バイトの値を暗号化する
ために使用される。暗号化により作られた 24 バイトの値は「応答 (response)」
と呼ばれる。

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

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

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

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

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

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

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

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


賛否両論 (PROS AND CONS)
------------------------

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

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

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

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

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

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

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

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

注意として、Windows NT 4.0 Service Pack 3 では、既定で許可される認証が
変更されて、平文パスワードが*絶対に*ネットワークへ送信されないようになった。
これを解決するには、Samba を暗号化パスワードをサポートするように変えるか
平文パスワードが再び有効になるよう Windows NT のレジストリを編集するかの
どちらかである。詳細なやり方は文書 WinNT.txt を参照のこと。

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

Samba が上記のプロトコルに参加するには、ユーザ名を与えられた 16 バイトの
ハッシュ値を得られなければならない。残念ながら、UNIX パスワードの値も
一方向のハッシュ関数である(すなわち、UNIX のユーザ・パスワードのハッシュを
与えた平文のユーザ・パスワードを取り戻すのは不可能である)ため、この
16 バイトの値を持つ別のパスワード・ファイルを保持しなければならない。
これら 2 つのパスワード・ファイルによって 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:[Account type]:LCT-<last-change-time>:Long name

username、uid、XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX、[Account type]、
last-change-time の部分だけが意味を持ち、Samba コードで検査される。

2 つの「:」の間にある 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:[U          ]:LCT-00000000:Bob's full name:/bobhome:/bobshell

ユーザが smbpasswd コマンドを使って自分のパスワードを設定することを
許可しているなら、最初は NO PASSWORD をユーザに与えたいと思うだろう。
そうすることで、ユーザは新しいパスワードに変更するときに以前のパスワードを
入力しなくても済む(お勧めはしない)。これを smbpasswd プログラムに
実現させるには、smbpasswd がユーザのパスワードなしで smbd デーモンに
接続できるようにしなければならない。smb.conf の [global] セクションに
以下の行を追加する:

    null passwords = true

上記シナリオが推奨されない理由はこれである。サーバでこれを有効にしなくても
済むように、できれば最初に既定のパスワードをユーザに与えるようにしよう。

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

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

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

Samba 1.9.18p4 では、このプログラムの所有者を root にして setuid ビットを
立ててインストールしてはならない(ほかのプログラムが偶然 root として
実行されないように、新しい smbpasswd コードがその制限を課している)。

現在の smbpasswd はクライアント/サーバ方式で動作し、ユーザのパスワードを
変更するためにローカルの smbd に接続する(訳注: このため allow hosts
パラメータに 127.0.0.1 が含まれていないと、smbpasswd によるパスワードの
変更は拒否されてしまう)。これにより、以下のような莫大な恩恵を得られる。

1) もう smbpasswd は setuid root されない。
   潜在的で広い範囲のセキュリティ問題がなくなる。

2) smbpasswd に Windows NT サーバのパスワードを変更する機能が付いた。
   (NT のプライマリ・ドメイン・コントローラに要求を送り、
    NT のドメイン・ユーザのパスワードを変更する場合だけ機能する)

一般ユーザが smbpasswd を実行するには以下のように入力する。

    smbpasswd
    Old SMB password: <ここに古い値を入力 - 古いパスワードがないならリターン>
    New SMB Password: <新しい値を入力>
    Repeat New SMB Password: <新しい値を再入力>

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

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

root ユーザから実行するときは、smbpasswd の引数に SMB パスワードを
変更したいユーザ名を指定することができる。root による smbpasswd の実行では
古いパスワード値を入力させたり検査を行わないことに注意してほしい。
よって、root はパスワードを忘れてしまったユーザのパスワードを
設定することができる。

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

smbpasswd を利用する際の詳細についてはマニュアルを参照のこと。
マニュアルには常に最終的な言及がされている。

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

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

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

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

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

4) 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:[U          ]:LCT-00000000:Andrew Tridgell:/home/tridge:/bin/tcsh

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

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

6) やってみよう!

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

==============================================================================
脚注: WinNT.txt も参照のこと
訳注: Win95.txt も参照のこと
