%20%D0%BD%D0%B5%20%D1%83%D0%B4%D0%B0%D1%91%D1%82%D1%81%D1%8F!.png)
Я задал этот вопрос на StackOverflow и понял, что здесь я могу получить более точные ответы.
Попытка настроить Samba + OpenLDAP с использованием nss_ldap в Linux. Все программное обеспечение скомпилировано мной из исходников, поэтому никаких RPM, YUM и т. д.
Используем Pozix Linux, наш собственный дистрибутив — ванильная система входа в систему, то есть дистрибутив «из коробки» полагается на стандартные /etc/passwd, /etc/group.
Установлено все необходимое программное обеспечение для преобразования системы в систему на основе LDAP, которая, похоже, работает с другим программным обеспечением, таким как SSH, за исключением SAMBA.
Удалось подключить Windows 7 к автономному PDC Samba, но я не могу войти в систему с помощью учетной записи домена, пока эта учетная запись не будет добавлена в файл /etc/passwd.
Я получаю: user в passdb, но getpwnam() не выполняется!
Все, что я читал, указывает на проблему NSS_LDAP. Вот список того, что я сделал:
- getent passwd показывает пользователям все отлично
- Я могу подключиться по ssh к тому же хосту Linux, используя учетную запись пользователя, которая есть только в базе данных LDAP.
- id test (test — это моя тестовая учетная запись только в LDAP), которая работает
- ./pdbedit -Lv тест работает
- ./net rpc права список учетных записей - Uroot работает, я вижу, что у root есть все необходимые права
- по предложению stackoverflow я изменил свой файл nsswitch.conf с (files ldap) на (ldap files), что по сути изменило порядок дампа getent passwd и не решило проблему.
- закомментировал rootbinddn и добавил bindpw с открытой версией пароля, чтобы исключить любые вопросы с ldap.secret
- smb.conf имеет ldapsam:trusted = yes
- smb.conf и ldap.conf оба имеют ssl-отключение
- Не работает nscd
Все, что написано на сайте 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 выделяет память для структуры результата и заполняет ее Unix UID, основным GID и т. д.
Все, что я читал, говорит, что этот вызов использует NSS. Надеюсь, кто-то из команды Samba, кто разбирается в этом, сможет вмешаться.
---------------------[ обновление ]--------------------- Изучая исходный код 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, но пока не ясно, какая именно.
решение1
РЕШЕНО!!!!!!!!!!!
У меня есть скрипт, который запускал 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 не даст никакого эффекта.
Надеюсь, это поможет другим сборщикам систем....
решение2
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=