winbindd — NT サーバーで名前解決するためのネームサービススイッチ・デーモン
winbindd [-F] [-S] [-i] [-Y] [-d <debug level>] [-s <smb config file>] [-n]
このプログラムは、Samba(7) の一部である。
winbindd はデーモンであり、 最近の C ライブラリの多くに実装されているネームサービススイッチ機能のためのサービスを提供する。 ネームサービススイッチは、 ユーザーやシステムの情報を、 NIS や DNS などの様々なデータベースサービスから取得することを可能とする。 実際の動作は、 /etc/nsswitch.conf ファイルにて設定する。 ユーザーとグループは、名前の解決が行なわれた時点で、 Samba の管理者が指定したユーザー ID とグループ ID の範囲から ID を割り当てられる。
winbindd によって提供されるサービスは「winbind」と呼ばれ、 Windows NT サーバーからユーザーとグループの情報を取得するために用いる。 このサービスは関連する PAM モジュールを通じて、 認証サービスを提供することも可能である。
Samba 2.2.2 リリースの pam_winbind モジュールは、 auth と account モジュールタイプのみをサポートしている。 後者のモジュールタイプは、 システムがユーザーの UID を取得して確認するために、 単に getpwnam() を実行するだけである。 libnss_winbind ライブラリが正しくインストールされていれば、必ず成功するはずである。
以下の nsswitch データベースが winbindd サービスにより実装されている:
ホスト情報。 伝統的に hosts(5) ファイルに格納される情報で、 gethostbyname(3) 関数に利用される。 名前は WINS サーバーかブロードキャストによって解決される。
ユーザー情報。 伝統的に passwd(5) ファイルに格納される情報で、 getpwent(3) 関数に利用される。
グループ情報。 伝統的に group(5) ファイルに格納される情報で、 getgrent(3) 関数に利用される。
例えば、 以下のような設定を /etc/nsswitch.conf ファイルに記述することで、 ユーザーやグループ情報の解決を /etc/passwd や /etc/group で試みたあと、 Windows NT サーバーで解決しようとする。
passwd: files winbind group: files winbind
以下のような設定を /etc/nsswitch.conf ファイルに記述することで、 ホスト名の解決を /etc/hosts で試みたあと、 WINS サーバーで解決しようとする。
hosts: files wins
このパラメータを指定すると、 winbindd のメインプロセスはデーモン化しなくなる。 つまり、 2 回の fork(2) と端末からの切り離しを行なわない。 通常通り接続要求を処理するための子プロセスが生成されるが、 メインプロセスは終了しない。 この動作方式は、 Daniel J. Bernstein 作の daemontools パッケージに含まれる supervise と svscan や、 AIX のプロセスモニターなど、プロセス監視の下で winbindd を動作させるのに都合がよい。
このパラメータを指定すると、 winbindd はファイルの代わりに標準出力にログを出力する。
プログラムのバージョン番号を表示する。
サーバーが必要とする詳細な設定を含む設定ファイルを指定する。 このファイルには、 サーバーが提供するサービスに関する記述や、 どの printcap ファイルを利用するかといった情報が含まれている。 詳細は smb.conf を参照のこと。 デフォルトの設定ファイルの名前は、コンパイル時に決定される。
デバッグレベルを debuglevel に設定する。 debuglevel は、0 から 10 までの整数である。 このパラメータを指定しないときのデフォルト値は 0 である。
この値を大きくするほど、 サーバーの動作に関するより詳細な情報がログファイルに記録される。 レベル 0 では、致命的なエラーと重大な警告のみが記録される。 レベル 1 は日々の運用に適しており、 少量の稼働状況に関する情報を生成する。
1 より上のレベルは大量のログが生成されるので、 問題解決の時にのみ使用すべきである。 3 より上のレベルは開発者だけが利用するように設計されており、 莫大な量のログデータが生成される。 そのほとんどは非常に謎めいた内容となっている。
ログ/デバッグファイルのファイル名。 拡張子として ".client" が追加される。 ログファイルはクライアントによって削除されることはない。
コマンドラインオプションの要約を表示する。
winbindd にデーモン化と端末からの切り離しを行なわないように指示する。 このオプションは、 winbindd の対話的なデバッグが必要なときに開発者が利用する。 また、 -S パラメータが指定されたときと同じように、 ログを標準出力に出力するようになる。
キャッシュを無効にする。 winbindd は、 クライアントに応答する前にドメインコントローラーからの応答を毎回待たなければならず、 動作が遅くなる。 しかしキャッシュが参照されなくなることで、 より厳密な結果を得られるようになる。 また、ドメインコントローラーが応答しない場合、 その間 winbindd は停止してしまう。
単一デーモンモード。 winbindd は単一のプロセスだけで動作する (Samba 2.2 での動作モード)。 デフォルトの winbindd は子プロセスを起動し、 期限切れのキャッシュエントリを更新させる。
Windows NT サーバー上のユーザーとグループは、 作成されたときにドメイン内で一意の相対 ID (RID, Relative ID) を割り当てられる。 Windows NT のユーザーとグループを UNIX のユーザーとグループに変換するには、 RID とユーザー ID / グループ ID 間のマッピングが必要となる。 これは winbindd が行なう作業の一つである。
winbindd は、 ユーザーとグループを Windows NT サーバーで解決すると、 ユーザー ID とグループ ID を指定された範囲から割り当てる。 既存のユーザーとグループは、 クライアントがユーザーまたはグループの列挙コマンドを実行するとすぐにマッピングされるが、 ID は最初に解決された時点で順番に割り当てられる。 割り当てられた UNIX 側の ID は、 Samba のロックディレクトリ以下のデータベースに格納され、利用される。
警告: RID と UNIX の ID 変換用のデータベースは、 winbindd がユーザーとグループのマッピング情報を格納する唯一の場所である。 このファイルが削除されたり壊れたりすると、 ユーザー ID とグループ ID がどの Windows NT ユーザーあるいはグループの RID に対応しているかを winbindd が認識することができなくなってしまう。
winbindd デーモンの設定は、 smb.conf(5) ファイル内の設定パラメータで行う。 すべてのパラメータは、 smb.conf の [global] セクション内に記述しなければならない。
ドメインコントローラーを利用したユーザーとグループの解決と認証を行なうには、 winbindd を以下のように設定する。 この設定例は、Red Hat Linux 6.2 で動作確認した。
/etc/nsswitch.conf に以下の記述を行なう:
passwd: files winbind group: files winbind
/etc/pam.d/* 内の auth 行を以下のような設定に置き換える:
auth required /lib/security/pam_securetty.so auth required /lib/security/pam_nologin.so auth sufficient /lib/security/pam_winbind.so auth required /lib/security/pam_pwdb.so use_first_pass shadow nullok
特に、 sufficient キーワードと use_first_pass キーワードを使用している点に注意すること。
また、account 行を以下の設定に置き換える:
account required /lib/security/pam_winbind.so
次はドメインへの参加である。 net プログラムを以下のように実行する:
net join -S PDC -U Administrator
-S に続くサーバー名は、 プライマリドメインコントローラー (PDC) のコンピューター名か IP アドレスを指定する。 -U に続くユーザー名は、 PDC 上で administrator 権限を持つドメインユーザーであれば何でもよい。
次に libnss_winbind.so を /lib に、 pam_winbind.so を /lib/security にコピーする。 /lib/libnss_winbind.so から /lib/libnss_winbind.so.2 へのシンボリックリンクも用意する必要がある。 ただし古いバージョンの glibc を使用しているなら、 シンボリックリンク先は /lib/libnss_winbind.so.1 にしなければならない。
最後に、 smb.conf(5) に以下のような設定を記述する:
[global] winbind separator = + winbind cache time = 10 template shell = /bin/bash template homedir = /home/%D/%U idmap uid = 10000-20000 idmap gid = 10000-20000 workgroup = DOMAIN security = domain password server = *
以上の設定を終えたら winbindd を起動する。 すると、ユーザーとグループ用のデータベースが、 NT ユーザーとグループが含まれ増加してゆくのがわかるだろう。 また、ユーザーを「ドメイン名+ユーザー名」という形式で指定することで、 ドメインユーザーが UNIX にログインできることも確認できるだろう。 getent passwd と getent group コマンドを実行すれば、 winbindd が正常に稼働していることを確認できる。
以下の注意点は、 winbindd の設定や実行の際に有用である:
winbindd が機能するには、同じマシン上で nmbd(8) を実行していなければならない。 winbindd は、起動時と SIGHUP シグナルを受信したときに、 信頼するドメインの一覧を Windows NT サーバーに問い合わせる。 このため、 実行中の winbindd に新しいサーバー間の信頼関係を認識させるためには、 SIGHUP シグナルを送る必要がある。
PAM は、非常に設定ミスを犯しやすい。 PAM の設定ファイルを変更する際は、 何を行なっているかをきちんと確認すること。 PAM の設定を誤ることで、 誰もシステムにログインできなくなってしまうこともあり得る。
複数の UNIX マシンで winbindd を実行すると、通常は、 winbindd によって割り当てられるユーザー ID とグループ ID は同一にはならない。 ユーザー ID とグループ ID はローカルマシン内でのみ有効である。
Windows NT の RID から UNIX のユーザー ID とグループ ID へのマッピングファイルが壊れたりなくなったりした場合、 マッピング情報は失われてしまう。
以下のシグナルが winbindd デーモンを操作するために 利用可能である。
smb.conf(5) ファイルを再読み込みさせ、 実行中の winbindd にパラメータの変更を反映させる。 このシグナルにより、 ユーザーとグループ情報のキャッシュもクリアされる。 また、winbindd が信頼するドメインの一覧も再取得される。
ステータス情報として、 winbindd が割り当てたユーザー ID とグループ ID の数などの情報を、 ログファイルに書き込みさせる。
ネームサービススイッチの設定ファイル。
winbind クライアントが winbindd と通信するための UNIX パイプ。 セキュリティ上の理由で、 winbind クライアントは /tmp/.winbindd ディレクトリと /tmp/.winbindd/pipe ファイルの両方の所有者が root の時のみ winbindd デーモンとの接続を行なおうとする。
winbind の「特権」クライアントが winbindd と通信するための UNIX パイプ。 セキュリティ上の理由で、 winbindd のいくつかの機能 (ntlm_auth ユーティリティが必要とする機能など) へのアクセスは制限されている。 デフォルトでは、 「root」グループに属するユーザーだけがアクセスできる。 管理者は、 $LOCKDIR/winbindd_privilaged のグループパーミッションを変更することで、 「squid」が ntlm_auth を利用できるようにするなどが可能である。 winbind クライアントは $LOCKDIR/winbindd_privilaged ディレクトリと $LOCKDIR/winbindd_privilaged/pipe ファイルの両方の所有者が root の時のみ winbindd デーモンとの接続を行なおうとする。
ネームサービススイッチ・ライブラリの実装。
Windows NT の RID から UNIX の ユーザー/グループ ID へのマッピング情報の保管場所。 ロックディレクトリ ($LOCKDIR) は、 Samba のコンパイル時に --with-lockdir オプションを用いて指定する。 デフォルトは /usr/local/samba/var/locks である。
キャッシュされたユーザー/グループ情報の保管場所。