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.cwinbindd_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 系の設定パラメータについては意味がよくわかりませんでしたんでパスします。