Samba-3.0.25 と SFU スキーマでハマった
CentOS を 5.1 にしたところ,Samba 3.0.23 から 3.0.25 にあがってました。メジャーバージョンが一緒であれば基本的にパッケージのリビジョンは上がらないと思っていたんですが。
で,以前 winbind と SFU を使ってユーザ情報・認証を一元管理していたんですが,それがうまく動かなくなっていました。
あれこれソースを深追いしたんですが詳しい原因とか書くのは面倒なので結論だけ書きます。
私の場合,
- uid / gid の mapping (
idmap
) は rid を使う - ただし,ActiveDirectory のスキーマを SFU 拡張しておき,Home Directory や Shell に指定があった場合はそれを用いる
というちょっと変わった指向で運用しています。
で,以前使っていた smb.conf
で,今回に関係する設定子の抜粋を先にあげておきます。
# bad example [global] algorithmic rid base = 10000 # 今回は関係しないので以後省略 idmap backend = rid:HOGE=10000-19999 idmap uid = 10000-19999 idmap gid = 10000-19999 winbind nss info = sfu template template homedir = /home/%U template shell = /sbin/nologin
このままの設定では 3.0.25 にしたとたん,SFU スキーマを見に行ってくれなくなってしまいました。以降,その対策方法です。
全ドメイン共通設定の場合
idmap backend = rid idmap uid = 10000-19999 idmap gid = 10000-19999 winbind nss info = sfu template homedir = /home/%U template shell = /sbin/nologin
結論だけいうと,winbind nss info
には sfu
のみ指定します(ただし,Windows Server 2003 R2 がディレクトリサーバの場合,rfc2307
を指定します*1)。
template
も指定していると,こちらがデフォルトの nss info mapping になってしまい,SFU の情報を見てくれなくなってしまいます。
たとえば(後述のように)
winbind nss info = sfu:HOGE template
のようにドメインを指定すれば逃れられますが,本節の趣旨からいうと sfu
だけにしておいたほうがいいでしょう。
ちなみに,SFU スキーマに値が存在しない場合ですが,きちんと template homedir / shell
の値に fallback してくれます。この辺,実は nss info mapping ではなく,nsswitch/winbindd_user.c
の winbindd_fill_pwent()
で行っています。なので template
は指定する必要がないのです。
あるドメインについてのみ行う場合
Samba 3.0.25 から複数ドメインでの idmap 機能の設定がやりやすくなりました*2。
idmap domains = HOGE idmap config HOGE:default = yes idmap config HOGE:backend = rid idmap config HOGE:range = 10000-19999 idmap config HOGE:base_rid = 0 winbind nss info = sfu:HOGE
base_rid
というものについてちょっと説明します。rid idmap
モジュールでのマッピング式は下記のようになっています。
UNIX uid = RID - base_rid + <lowest range>
たとえば私の場合,RID = 1190 なので,上記の設定と式に当てはめると,UNIX uid = 11190 となります。
1000 以下の RID は,Domain Users などの既存のユーザ・グループに慣例的に割り当てられており,一般ユーザの RID は 1000 以上となります。なので,base_rid
を 1000 にしておくと,ちょっと綺麗な UNIX uid にすることができます。と,idmap_rid に書いてあるのですが,gid についても適用されそうなので,ちょっと問題かも。
結論
あたかも「全ドメイン共通設定の場合」のほうがよさげですが,実際には互換モードとして残っているだけっぽいので後者のほうがベターです。また,挙動としても後者のほうが安定しているようです。
具体的には,前者の設定でユーザIDの逆マッピングを調べてみると,
$ ls -l /home total 4 drwxr-xr-x 9 11190 10513 4096 Dec 5 12:08 dayflower (まだマッピングされていない) $ sudo /sbin/service winbind start (winbind を動かす) $ ls -l /home total 4 drwxr-xr-x 9 11190 10513 4096 Dec 5 12:08 dayflower (逆マッピングが成立していない) $ id dayflower uid=11190(dayflower) gid=10513(domain users) groups=10513(domain users),10512(domain admins) (一度ルックアップしておくと) $ ls -l /home total 4 drwxr-xr-x 9 dayflower domain users 4096 Dec 5 12:08 dayflower (キャッシュに基づいて逆マッピングが成立している)
のようになりますが,後者の設定で調べてみると
$ ls -l /home total 4 drwxr-xr-x 9 11190 10513 4096 Dec 5 12:08 dayflower $ sudo /sbin/service winbind start $ ls -l /home total 4 drwxr-xr-x 9 dayflower domain users 4096 Dec 5 12:08 dayflower (最初から逆マッピングが成立している)
望ましい結果になっています。
あと idmap alloc
系の設定パラメータについては意味がよくわかりませんでしたんでパスします。