我正在使用 LDAP+kerberos 对 Windows 2003 R2 上的 Active Directory 进行身份验证。我的 krb5.conf 和 ldap.conf 似乎是正确的(根据我在网上找到的几乎所有样本)。我可以使用密码和 ssh 密钥登录主机。当我运行 getent passwd 时,我的所有 ldap 用户帐户都列出了所有重要属性。当我运行 getent 组时,列出了所有 ldap 组及其 gid,但没有组成员。如果我在任何组上运行 ldapsearch 和过滤器,则所有成员都与“成员”属性一起列出。所以数据是可以拿来的,只是没有被正确解析。看来我只是在 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 机器上可以 100% 正常工作。它不适用于我打算切换到的发行版。我已经从源代码安装了新盒子的版本pam_ldap
以nss_ldap
匹配旧盒子,这解决了我在此设置中遇到的另一个问题。
其他相关信息是原来的 AD 框是 Windows 2003。它的镜像死于可怕的硬件死亡,所以我试图在镜像树中再添加两个 2003-R2 服务器并最终放弃旧的 2003 框。新的 R2 盒子似乎已经正确地加入了 DC 森林。
我需要做什么才能让小组工作?我已经用尽了我能找到的所有资源,需要一个不同的角度。任何输入表示赞赏。
状态更新,2009 年 7 月 31 日
我已经设法调整了我的配置文件以从 AD 中获取完整信息,并且性能很好而且很敏捷。我用我正在使用的发行版的当前版本替换了 back-rev'd 副本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 搜索或映射错误,但我不知道它是什么。我比本周早些时候更接近了,但我真的很想解决最后一个细节。
这可能是我不久前遇到的相同情况。如果您的 AD 组成员过多,则会在 Linux 中导致此类错误(在 getent 级别或之前的某个位置 - ldapsearch 工作正常)。
更准确地说,错误不是关于特定数量的成员,而是关于每个“组行”的字符数(想想 /etc/group 中的行)大于 1023 个字符。我没有研究为什么有这个限制以及为什么有 1024。我刚刚创建了第二个组并将过多的成员移到那里。
这实际上是一件很容易解决的事情,您需要将以下内容添加到您的 ldap.conf 中:
这告诉它枚举具有 DN 的组,而不仅仅是它们的 CN。另请注意,只要您拥有 2003R2 DC 或更新版本,您现在就可以使用 RFC2307 原生属性(gecos、uid 等)。