Я задал этот вопрос о stackoverflow и понял, что могу получить здесь лучшие ответы.
Попытка настроить Samba + OpenLDAP с помощью nss_ldap в Linux. Все программное обеспечение скомпилировано мной из исходников, поэтому никаких RPM, YUM и т. Д.
Использование Pozix Linux, который является нашим собственным дистрибутивом - ванильная система входа в систему, что означает, что дистрибутив изначально полагается на стандартные / etc / passwd, / etc / group.
Установлено все необходимое программное обеспечение для преобразования системы в систему на основе LDAP, которая, похоже, работает с другим программным обеспечением, таким как SSH, кроме SAMBA.
Удалось присоединить Windows7 к автономному PDC Samba, я не могу войти в систему с учетной записью домена, если эта учетная запись также не добавлена в файл / etc / passwd.
Я получаю: пользователь в passdb, но getpwnam () не работает!
Все, что я прочитал, указывает на проблему с NSS_LDAP. Вот список того, что я сделал:
Все на сайте samba.org, глава 5 о том, как сделать пользователей счастливыми, работает, за исключением:
./smbclient // tsrvr / test -Utest
Это создает сообщение об ошибке темы в log.smbd, а журнал отладки ldap показывает запрос на проверку без ошибок и с успешным возвращаемым значением.
Если я помещу "test" в / etc / passwd, то все заработает!
Это как если бы связь между nss_ldap и smbd была нарушена, и я подчеркиваю связь, потому что LDAP выглядит нормально (slapcat, ldapsearch, и т.д ... все работают) ... Похоже, что библиотека nss_ldap получает возвращаемое значение, которое при передаче обратно smbd , это как-то не понятно.
Буду очень признателен за любые предложения. Я часто вижу эту проблему в списке. Часто связано с PAM, но я не использую PAM.
Кроме того, если я открою файл / etc / passwd и добавлю строку для соответствующего пользователя, я смогу войти.
Я не использую PAM. Я добавил два обновления реестра Windows7, необходимых для сайта Samba.org.
Программный стек выглядит следующим образом: Samba 3.5.3 OpenLDAP 2.4.21 nss_ldap 264
---------------------[ Обновить ]---------------------
Я начал смотреть исходный код Samba.
Я нашел эту функцию в samba3 / auth / auth_util.c (около строки 580)
auth_serversupplied_info *result;
const char *username = pdb_get_username(sampass);
pwd = getpwnam_alloc(result, username);
pwd оценивается как NULL, даже если имя пользователя действительное. getpwnam_alloc выделяет память для структуры результатов и заполняет ее UID Unix, первичным GID и т. д.
Все, что я читал, говорит, что этот звонок использует NSS. Я надеюсь, что кто-то из команды Samba знает об этом, и я могу вмешаться.
--------------------- [обновление] --------------------- Изучение исходного кода самбы здесь вот что я открываю:
Ошибка происходит в auth / auth_util.c (строка 580) с вызовом getpwnam_alloc
getpwnam_alloc пытается выполнить какое-то кеширование, и если имя пользователя не найдено в недавнем кеше, код не справляется с вызовом:
sys_getpwnam находится в lib / system.c, который является просто оболочкой для getpwnam
Документировано здесь: http://opengroup.org/onlinepubs/007908775/xsh/getpwnam.html
Не появляется, поскольку Samba проверяет описанную ошибку; добавит отладку и отчитается.
Определенно отказ библиотеки ОС, реализующей getpwnam, но пока не знаю, что именно.
РЕШЕНО !!!!!!!!!!!
У меня есть сценарий, который запускал Samba (NMBD, SMBD), а также OpenLDAP (SLAPD). Это сценарий RC, который считывает данные конфигурации из файла, чтобы определить, среди прочего, какие процессы уже запущены, не запускается ли зависимый процесс и т. Д. Вот фрагмент соответствующей части сценария. Последняя строка копирует на место версию nsswitch.conf, указывающую на использование поиска LDAP.
while [ $i -lt $MAXPROCS ];
do
PID=${PROC[$i]}
StartProc $PID
if test $? != 0; then
echo "!!! Aborting Any Remaining Start-up Processes !!!"
exit 1
fi
i=$(($i+1))
done
cp /etc/rc.d/pozix/nsswitch.conf.ldap /etc/nsswitch.conf
И после выключения я делал следующее: обратите внимание, я копирую файл nsswitch.conf, в котором есть записи «noldap».
while [ $i -lt $MAXPROCS ];
do
PID=${PROC[$i]}
StopProc $PID
i=$(($i+1))
done
cp /etc/rc.d/pozix/nsswitch.conf.noldap /etc/nsswitch.conf
Оказывается, что в сценарии запуска samba хочет, чтобы содержимое nsswtich.conf содержало записи ldap до вызова. Вот что я сделал, чтобы исправить свои проблемы:
cp /etc/rc.d/pozix/nsswitch.conf.ldap /etc/nsswitch.conf
while [ $i -lt $MAXPROCS ];
do
PID=${PROC[$i]}
StartProc $PID
if test $? != 0; then
cp /etc/rc.d/pozix/nsswitch.conf.noldap /etc/nsswitch.conf
echo "!!! Aborting Any Remaining Start-up Processes !!!"
exit 1
fi
i=$(($i+1))
done
Таким образом, кажется, что то, как вы запускаете SMBD, так же важно, как и когда вы его запускаете. Если вы запустите SMBD, когда nsswitch.conf не имеет записей LDAP, вы получите версию smbd, работающую, связанную с nss_ldap.so, думая, что она должна полагаться только на / etc / passwd (если это все, что есть в файле nsswitch.conf) и изменение содержимого nsswitch.conf после запуска SMBD не имеет никакого эффекта.
Надеюсь, это поможет другим сборщикам систем ....
nss_ldap настраивает систему входа в Linux на использование LDAP для аутентификации, а не Samba. Вам все равно нужно указать Samba, чтобы она использовала ldap для аутентификации. Например:
ldap ssl = off
ldap admin dn = cn=Manager,dc=ldappdc,dc=mydomain,dc=com
ldap suffix = dc=ldappdc,dc=mydomain,dc=com
ldap user suffix = ou=People
ldap group suffix = ou=Group
ldap idmap suffix = ou=Idmap
ldap machine suffix = ou=Hosts
Конечно, Samba должна быть построена с поддержкой LDAP.
Теперь получите smbldap-инструменты для создания пользователей / групп / и т.д. в вашей базе данных LDAP. smbldap-tools создаст учетные записи пользователей с соответствующими форматами паролей (один для Linux, один для Samba) и другими необходимыми атрибутами.
Вот как будет выглядеть полная запись LDAP:
dn: uid=someuser,ou=People,dc=corp,dc=example,dc=com
objectClass: top
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
objectClass: sambaSamAccount
cn: someuser
displayName: someuser
gecos: System User
gidNumber: 513
givenName: someuser
homeDirectory: /home/someuser
loginShell: /bin/bash
sambaAcctFlags: [U]
sambaHomeDrive: H:
sambaHomePath: \\%L\someuser
sambaKickoffTime: 2147483647
sambaLMPassword: FBB7BAF5868B4CBAAAD3B435B51404EE
sambaLogoffTime: 2147483647
sambaLogonScript: logon.bat
sambaLogonTime: 0
sambaNTPassword: D4CB2D67B19490FB090A6EDEC60E3EAE
sambaPrimaryGroupSID: S-1-5-21-1603264347-769597993-3324459097-513
sambaProfilePath: \\%L\profiles\someuser
sambaPwdCanChange: 0
sambaPwdLastSet: 1277051243
sambaPwdMustChange: 1280939243
sambaSID: S-1-5-21-1603264347-769597993-3324459097-3006
shadowLastChange: 14780
shadowMax: 45
sn: someuser
uid: someuser
uidNumber: 1003
userPassword:: e1NTSEF9Z2RueUNBMnVDMWVrejZLZGg4OGNLUmRJRU9zdlJFdE8=