我们刚刚在公司设置了 ActiveDirectory 并导入了所有 Linux 用户和组。
在Linux客户端上:(在nsswitch.conf中配置为询问ldap):
如果我对 AD ldap 服务器进行常见的 ldapsearch,我会得到大约 2580 个用户的完整数量。但是如果我这样做,它只会得到所有用户的一部分,数量为 1221:
getent passwd | wc -l
使用 strace 运行它,显示出尝试重新连接
我的想法是:Linux 身份验证程序是否使用与 AD ldap 不兼容的参数运行 ldapsearch ?或者可能是编码问题。Windows 用户在 AD 中输入各种字符。
也许有人可以解释一下这个问题并提示如何进一步调试!?
这是我们的 ldap.conf
host audc01.mycompany.de audc03.mycompany.de
base ou=location,dc=mycompany,dc=de
ldap_version 3
binddn cn=manager,ou=location,dc=mycompany,dc=de
bindpw Password
timelimit 120
idle_timelimit 3600
nss_base_passwd cn=users,cn=import,ou=location,dc=mycompany,dc=de?sub
nss_base_group ou=location,dc=mycompany,dc=de?sub
# RFC 2307 (AD) mappings
nss_map_objectclass posixAccount User
# nss_map_objectclass shadowAccount User
nss_map_objectclass posixGroup Group
nss_map_attribute uid sAMAccountName
nss_map_attribute cn sAMAccountName
# Display Name
nss_map_attribute gecos cn
##
nss_map_attribute homeDirectory unixHomeDirectory
nss_map_attribute loginShell msSFU30LoginShell
# PAM attributes
pam_login_attribute sAMAccountName
# Location based login
pam_groupdn CN=Location-AU-Login,OU=au,OU=Location,DC=mycompany,DC=de
pam_member_attribute msSFU30PosixMember
##
pam_lookup_policy yes
pam_filter objectclass=User
nss_initgroups_ignoreusers avahi,avahi-autoipd,backup,bin,couchdb,daemon,games,gdm,gnats,haldaemon,hplip,irc,kernoops,libuuid,list,lp,mail,man,messagebus,news,proxy,pulse,root,rtkit,saned,speech-dispatcher,statd,sync,sys,syslog,usbmux,uucp,www-data
这里是堆栈跟踪
strace getent passwd
poll([{fd=4, events=POLLIN|POLLPRI|POLLERR|POLLHUP}], 1, 120000) = 1 ([{fd=4, revents=POLLIN}])
read(4, "0\204\0\0\0A\2\1", 8) = 8
read(4, "\4e\204\0\0\0\7\n\1\0\4\0\4\0\240\204\0\0\0+0\204\0\0\0%\4\0261.2."..., 63) = 63
stat64("/etc/ldap.conf", {st_mode=S_IFREG|0644, st_size=1151, ...}) = 0
geteuid32() = 12560
getsockname(4, {sa_family=AF_INET, sin_port=htons(60334), sin_addr=inet_addr("10.1.35.51")}, [16]) = 0
getpeername(4, {sa_family=AF_INET, sin_port=htons(389), sin_addr=inet_addr("10.1.5.81")}, [16]) = 0
time(NULL) = 1297684722
rt_sigaction(SIGPIPE, {SIG_DFL, [], 0}, NULL, 8) = 0
munmap(0xb7617000, 1721) = 0
close(3) = 0
rt_sigaction(SIGPIPE, {SIG_IGN, [], 0}, {SIG_DFL, [], 0}, 8) = 0
rt_sigaction(SIGPIPE, {SIG_DFL, [], 0}, NULL, 8) = 0
rt_sigaction(SIGPIPE, {SIG_IGN, [], 0}, {SIG_DFL, [], 0}, 8) = 0
write(4, "0\5\2\1\5B\0", 7) = 7
shutdown(4, 2 /* send and receive */) = 0
close(4) = 0
shutdown(-1, 2 /* send and receive */) = -1 EBADF (Bad file descriptor)
close(-1) = -1 EBADF (Bad file descriptor)
exit_group(0) = ?
答案1
您可能遇到了 AD LDAP 页面大小限制。我不记得那是什么了,但它确实意味着 LDAP 客户端需要能够支持分页扩展。这将以特定大小的块检索大型查询。如果您在计算机和用户中计算,我们的树中有近 30,000 个帐户,因此获取它需要分页支持。可能不passwd getent
支持它,但查询单个用户就可以正常工作。