Назад | Перейти на главную страницу

Запрос passwd ldap к ActiveDirectory не выполняется у половины из 2500 пользователей

Мы просто настроили ActiveDirectory в моей компании и импортировали всех пользователей и группы Linux.

На клиенте linux: (настроен для запроса ldap в nsswitch.conf):

Если я выполняю обычный ldapsearch на сервере AD ldap, я получаю полное число около 2580 пользователей. Но если я сделаю это, он получит только часть всех пользователей, в количестве 1221:

getent passwd | wc -l

Запуск его с помощью strace показывает своего рода попытку восстановить соединение

Мои идеи были такими: запускает ли процедура аутентификации linux ldapsearch с параметром, несовместимым с AD ldap? Или, возможно, это проблема с кодировкой. Пользователь 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)                           = ?

Возможно, вы работаете с ограничением размера страницы AD LDAP. Я не помню, что это было у меня в голове, но это означает, что клиент LDAP должен иметь возможность поддерживать расширение подкачки. Это извлекает большие запросы кусками определенного размера. В нашем дереве почти 30 000 учетных записей, если считать в «Компьютеры и пользователи», поэтому для его получения требуется поддержка разбиения по страницам. Может быть что passwd getent не поддерживает его, но запросы отдельных пользователей работают нормально.