FreeBSD 8.0 + nss_ldap 會讓 user 的 supplementary group 無效

這個問題是 FreeBSD 8.0 才開始有的。
一般人應該都知道一個 user 可以有一個 primary group,
以及多個 supplementary groups。
前者是直接設定在 passwd / master.passwd 檔裡,
後者是設定在 group 檔裡。
現在的問題就是把 group 放在 LDAP 上面,
無論 user 是系統上的還是 LDAP 上的,
把他們加入 LDAP 上的 group 內都會無效。
不過這是只有把 ldap 加在 nsswitch.conf 的 compat_passwd 和 compat_group 裡才會發生,
這個功能好像在 FreeBSD 8.0 壞掉了,
不然就是有什麼新的設定要改。

簡單說只要是 /etc/nsswitch.conf 是這樣寫的話:

通常會有這種需求是要使用 multi-source (在 passwd/group 裡使用 +/- 的功能),
所以會使用到 compat mode。
如果是用過 NIS 的應該很熟悉了才對,
使用 compat mode 至少要在 master.passwd 裡放一行 +:*::::::::,
然後 group 裡放一行 +:*:: 或 +:*:0:。
當然這是最基本的用法而已,
混合 NIS 和 LDAP 的時候這種 +/- 可以寫得更複雜更多元化。

但是在 FreeBSD 8.0 這樣設的話,
把任何 user 加入 ldap 上的 group 都會無效 (除非那個 group 是直接設成 user 的 primary group)。
根據我觀察 LDAP client/server 的行為後發現,
在 FreeBSD 8.0 之前都會先去 LDAP 上抓出所有的 group,
然後再檢查每個 group 的 memberUid 欄看看這個 user 是不是在這 group 裡,
但是 FreeBSD 8.0 開始這個步驟就沒有了,
導致只有 primary group 有效而已。

已經在 freebsd-stable 上問過這個問題了,
但是還是沒有解,
所以現在只好暫時設定成這樣暫時不使用 compat mode:

因為沒在用 compat mode 了,
所以已經沒使用 NIS 的可以把那幾行 + 開頭的從 master.passwd / group 裡移除。