Linux上针对AD的LDAP查询返回没有成员的组

我正在使用LDAP + Kerberos来对Windows 2003 R2上的Active Directory进行身份validation。 我的krb5.conf和ldap.conf似乎是正确的(根据我在网上find的几乎所有样本)。 我可以使用密码和ssh密钥login到主机。 当我运行getent passwd时,我所有的ldap用户帐户都列出了所有重要的属性。 当我运行getent时,所有ldap组和它们的gid被列出,但是没有组成员。 如果我在任何组上运行ldapsearch和filter,则所有成员都以“member”属性列出。 所以数据在那里,只是没有被正确parsing。 看起来我只是在ldap.conf中使用了一个不正确的映射,但我看不到它。 我已经尝试了几个变化,都给出了相同的结果。

这是我目前的ldap.conf:

host <ad-host1-ip> <ad-host2-ip> base dc=my,dc=full,dc=dn uri ldap://<ad-host1> ldap://<ad-host2> ldap_version 3 binddn <mybinddn> bindpw <mybindpw> scope sub bind_policy hard nss_reconnect_tries 3 nss_reconnect_sleeptime 1 nss_reconnect_maxsleeptime 8 nss_reconnect_maxconntries 3 nss_map_objectclass posixAccount User nss_map_objectclass posixGroup Group nss_map_attribute uid sAMAccountName nss_map_attribute gidNumber msSFU30GidNumber nss_map_attribute uidNumber msSFU30UidNumber nss_map_attribute cn cn nss_map_attribute gecos displayName nss_map_attribute homeDirectory msSFU30HomeDirectory nss_map_attribute loginShell msSFU30LoginShell nss_map_attribute uniqueMember member pam_filter objectcategory=User pam_login_attribute sAMAccountName pam_member_attribute member pam_password ad 

这里是踢球者:这个configuration在另一个不同发行版的Linux机器上工作得很好。 它不适用于我打算转换到的发行版。 我已经从源代码安装了pam_ldapnss_ldap的版本,以匹配旧的盒子,这固定了我在这个设置中遇到的另一个问题。

其他相关信息是原来的AD框是Windows 2003.它的镜像死了一个可怕的硬件死亡,所以我试图添加两个更多的2003-R2服务器的镜像树,最终放弃旧的2003年框。 新的R2框似乎已经正确地join了DC森林。

我需要做些什么来让小组工作? 我用尽了所有的资源,需要一个不同的angular度。 任何input赞赏。


状态更新,7/31/09

我已经设法调整我的configuration文件,从AD得到完整的信息,性能是不错的,活泼。 我用我目前正在使用的发行版的当前版本replace了pam_ldapnss_ldap的back-rev'd副本,所以它回到了标准的开箱即用安装。 这是我目前的configuration:

 host <ad-host1-ip> <ad-host2-ip> base dc=my,dc=full,dc=dn uri ldap://<ad-host1> ldap://<ad-host2> ldap_version 3 binddn <mybinddn> bindpw <mybindpw> scope sub bind_policy soft nss_reconnect_tries 3 nss_reconnect_sleeptime 1 nss_reconnect_maxsleeptime 8 nss_reconnect_maxconntries 3 nss_connect_policy oneshot referrals no nss_map_objectclass posixAccount User nss_map_objectclass posixGroup Group nss_map_attribute uid sAMAccountName nss_map_attribute gidNumber msSFU30GidNumber nss_map_attribute uidNumber msSFU30UidNumber nss_map_attribute cn cn nss_map_attribute gecos displayName nss_map_attribute homeDirectory msSFU30HomeDirectory nss_map_attribute loginShell msSFU30LoginShell nss_map_attribute uniqueMember member pam_filter objectcategory=CN=Person,CN=Schema,CN=Configuration,DC=w2k,DC=cis,DC=ksu,DC=edu pam_login_attribute sAMAccountName pam_member_attribute member pam_password ad ssl off tls_checkpeer no sasl_secprops maxssf=0 

现在剩下的问题是当你运行groups命令时,没有列出所有的订阅组。 有些是(一个或两个),但不是全部。 组成员仍然很荣幸,例如文件和打印机访问。 getent group foo仍显示用户是foo组的成员。 所以这似乎是一个演示错误,不会干扰正常的操作。

也有一些(我还没有确定究竟有多less)组search不能正确parsing,即使该组列出。 例如,当你运行“ getent group bar ”时,没有任何东西被返回,但是如果你运行“ getent group|grep bar ”或者“ getent group|grep <bar_gid> ”,你可以看到它确实列出了,你的组名和gid是正确。

这仍然看起来像一个LDAPsearch或映射错误,但我无法弄清楚它是什么。 我比本周早些时候更接近了heckuva,但我真的很想把最后的细节弄清楚。

不久以前,我可能遇到同样的情况。 如果你的AD组有太多的成员,它会在Linux中引起这样的错误(在getent级别的地方或者在它之前 – ldapsearch工作正常)。

更确切地说,错误不是关于特定数量的成员,而是关于每个“组群”(来自/ etc / group的思路)的字符数大于1023个字符。 我没有看到为什么这个限制在那里,为什么是1024.我刚刚创build了第二个小组,并把过多的成员移到那里。

这实际上是一个很容易解决的问题,您需要将以下内容添加到您的ldap.conf中:

 nss_schema rfc2307bis 

这告诉它枚举具有DN的组而不仅仅是它们的CN。 还要注意,只要你有一个2003R2 DC或者更新的版本,你现在可以使用RFC2307原生属性(gecos,uid等)。