我在 Windows 2003 R2 上使用 LDAP+kerberos 针对 Active Directory 进行身份验证。我的 krb5.conf 和 ldap.conf 似乎是正确的(根据我在网上找到的几乎所有示例)。我可以使用密码和 ssh 密钥登录主机。当我运行 getent passwd 时,我的所有 ldap 用户帐户都列出了所有重要属性。当我运行 getent group 时,会列出所有 ldap 组及其 gid,但没有组成员。如果我对任何组运行 ldapsearch 和筛选,则所有成员都会列出并带有“member”属性。因此,数据是可以获取的,只是没有正确解析。看起来我只是在 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
关键在于:此配置在不同的 Linux 机器上完全可以正常工作,但无法在我计划切换到的发行版上工作。我已从源代码安装了新机器上的pam_ldap
和nss_ldap
版本以匹配旧机器,这解决了我在此设置中遇到的另一个问题。
其他相关信息是原始 AD 盒是 Windows 2003。它的镜像因硬件故障而严重损坏,因此我尝试将另外两个 2003-R2 服务器添加到镜像树中,并最终删除旧的 2003 盒。新的 R2 盒似乎已正确加入 DC 林。
我需要做什么才能让团队正常运作?我已经用尽了所有能找到的资源,需要换个角度。任何意见都值得赞赏。
状态更新,7/31/09
我已设法调整我的配置文件以从 AD 获取完整信息,并且性能良好且快速。我用我使用的发行版的最新版本替换了旧版本的pam_ldap
和nss_ldap
,因此它恢复为标准的开箱即用安装。这是我当前的配置:
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 的成员。因此,这似乎是一个演示错误,不会干扰正常操作。
同时还发现,尽管组已列出,但有些组搜索(我不确定有多少)似乎无法正确解析。例如,当您运行“ getent group bar
”时,不会返回任何内容,但是如果您运行“ getent group|grep bar
”或“ getent group|grep <bar_gid>
”,则可以看到它确实已列出,并且您的组名和 gid 是正确的。
这仍然看起来像是 LDAP 搜索或映射错误,但我搞不清楚是什么。我比本周早些时候更接近答案了,但我真的很想解决这个最后的细节。
答案1
这可能和我不久前遇到的情况一样。如果您的 AD 组有太多成员,则会导致 Linux 中出现此类错误(在 getent 级别或之前某个位置 - ldapsearch 工作正常)。
更确切地说,错误不是关于特定成员数,而是关于每个“组行”(想想 /etc/group 中的行)的字符数大于 1023 个字符。我没有研究为什么有这个限制以及为什么是 1024。我刚刚创建了第二个组并将过多的成员移到那里。
答案2
这实际上是一个很容易修复的问题,您需要将以下内容添加到您的 ldap.conf 中:
nss_schema rfc2307bis
这告诉它枚举具有 DN 的组,而不仅仅是其 CN。另请注意,只要您拥有 2003R2 DC 或更新版本,您现在就可以使用 RFC2307 本机属性(gecos、uid 等)。