Пользователь в passdb, но getpwnam() не удаётся!

Пользователь в passdb, но getpwnam() не удаётся!

Я задал этот вопрос на 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. Вот список того, что я сделал:

  1. getent passwd показывает пользователям все отлично
  2. Я могу подключиться по ssh к тому же хосту Linux, используя учетную запись пользователя, которая есть только в базе данных LDAP.
  3. id test (test — это моя тестовая учетная запись только в LDAP), которая работает
  4. ./pdbedit -Lv тест работает
  5. ./net rpc права список учетных записей - Uroot работает, я вижу, что у root есть все необходимые права
  6. по предложению stackoverflow я изменил свой файл nsswitch.conf с (files ldap) на (ldap files), что по сути изменило порядок дампа getent passwd и не решило проблему.
  7. закомментировал rootbinddn и добавил bindpw с открытой версией пароля, чтобы исключить любые вопросы с ldap.secret
  8. smb.conf имеет ldapsam:trusted = yes
  9. smb.conf и ldap.conf оба имеют ssl-отключение
  10. Не работает 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=

Связанный контент