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

Пользователь в passdb, но getpwnam () не работает!

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

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