Moss: "What do you call Negative One, alone, in a room?"
Prime: "I don't know, what do you call Negative One, alone, in a room?"
Moss: "Overnumerousness!"
(C) The IT Crowd
Задача: допустить к Squid только пользователей определенной группы Active Directory.
Приборы и материалы : Active Directory с группами, содержащими более 1000 пользователей и Samba3, входящая в указанный домен AD.
При попытке получить список пользователей густонаселенной группы процесс winbind может падать не желая показывать пользователей, входящих в эту группу:
# wbinfo -t
checking the trust secret for domain ITCROWD via RPC calls succeeded
# wbinfo --user-groups=moss
16777221
16777223
16777220
Для небольшой группы все в порядке:
# wbinfo --gid-info=16777223
it_crowd:x:16777223:moss,roy,jen
Для очень большой группы ничего (хотя в эту группу должны входить все пользователи домена):
# wbinfo --gid-info=16777221
domain_users:x:16777221:
А для большой группы и вовсе ошибка:
# wbinfo --gid-info=16777220
failed to call wbcGetgrgid: WBC_ERR_DOMAIN_NOT_FOUND
Could not get info for gid 16777220
В логах при этом:
[2011/09/01 16:48:32.321651, 0] ../lib/util/debug.c:413(talloc_log_fn)
Bad talloc magic value - unknown value
[2011/09/01 16:48:32.322093, 0] lib/util.c:1116(smb_panic)
PANIC (pid 3845): Bad talloc magic value - unknown value
[2011/09/01 16:48:32.325653, 0] lib/util.c:1220(log_stack_trace)
BACKTRACE: 22 stack frames:
#0 winbindd(log_stack_trace+0x18) [0x7f1fc3a824aa]
#1 winbindd(smb_panic+0x4c) [0x7f1fc3a82586]
#2 winbindd(+0x45be90) [0x7f1fc3d5ce90]
#3 winbindd(+0x45bf84) [0x7f1fc3d5cf84]
#4 winbindd(+0x45c302) [0x7f1fc3d5d302]
#5 winbindd(+0x436283) [0x7f1fc3d37283]
#6 winbindd(dcerpc_lsa_lookup_sids3+0x2e) [0x7f1fc3d3754b]
#7 winbindd(winbindd_lookup_sids+0xcf) [0x7f1fc39e86b7]
#8 winbindd(+0xeaed2) [0x7f1fc39ebed2]
#9 winbindd(+0xd94a2) [0x7f1fc39da4a2]
#10 winbindd(_wbint_LookupGroupMembers+0x5d) [0x7f1fc39f4052]
#11 winbindd(+0xfa73f) [0x7f1fc39fb73f]
#12 winbindd(winbindd_dual_ndrcmd+0x100) [0x7f1fc39f2d27]
#13 winbindd(+0xf0f9a) [0x7f1fc39f1f9a]
#14 winbindd(+0xf11dc) [0x7f1fc39f21dc]
#15 winbindd(tevent_common_loop_immediate+0x10a) [0x7f1fc3a8f946]
#16 winbindd(run_events_poll+0x3c) [0x7f1fc3a8e171]
#17 winbindd(+0x18d7bc) [0x7f1fc3a8e7bc]
#18 winbindd(_tevent_loop_once+0x74) [0x7f1fc3a8eaa7]
#19 winbindd(main+0xa9e) [0x7f1fc39d1f05]
#20 /lib64/libc.so.6(__libc_start_main+0xfd) [0x7f1fc1524cdd]
#21 winbindd(+0xce8f9) [0x7f1fc39cf8f9]
[2011/09/01 16:48:32.327631, 0] lib/fault.c:372(dump_core)
dumping core in /var/log/samba/cores/winbindd
Разглядывание исходных текстов Samba3 выявило разный подход при работе с группами до 1000 пользователей и более: для больших групп записи получаются в результате нескольких запросов к контроллеру домена. Память в этом случае выделяется дополнительно, что и приводит к ошибке:
(gdb) bt
#0 0x00007f1fc1538905 in raise () from /lib64/libc.so.6
#1 0x00007f1fc153a0e5 in abort () from /lib64/libc.so.6
#2 0x00007f1fc3a76daf in dump_core () at lib/fault.c:391
#3 0x00007f1fc3a8266c in smb_panic (why=<value optimized out>) at lib/util.c:1132
#4 0x00007f1fc3d5ce90 in talloc_abort_unknown_value (ptr=<value optimized out>) at ../lib/talloc/talloc.c:341
#5 talloc_chunk_from_ptr (ptr=<value optimized out>) at ../lib/talloc/talloc.c:360
#6 0x00007f1fc3d5cf84 in __talloc (context=0x7f1fc5ad7180, size=9) at ../lib/talloc/talloc.c:555
#7 0x00007f1fc3d5d302 in __talloc_strlendup (t=<value optimized out>, p=0x7f1fc5bd6f10 "reynholm", len=8)
at ../lib/talloc/talloc.c:1923
Быстрое решение проблемы также было найдено - отказ от использования LDAP протокола при обращении к контроллеру домена:
# testparm -s
Load smb config files from /etc/samba/smb.conf
Loaded services file OK.
Server role: ROLE_DOMAIN_MEMBER
[global]
display charset = UTF-8
workgroup = ITCROWD
realm = ITCROWD.COM
security = ADS
winbind enum users = Yes
winbind enum groups = Yes
winbind use default domain = Yes
winbind normalize names = Yes
idmap config * : range = 16777216-33554431
idmap config * : backend = tdb
winbind rpc only = Yes
После добавления winbind rpc only = Yes все встало на свои места:
# wbinfo --gid-info=16777221 | awk -F, '{print NF}'
124361
# wbinfo --gid-info=16777220 | awk -F, '{print NF}'
1954
Медленное, но верное решение в виде патча отправлено разработчикам Samba3.