用户在passdb,但getpwnam()失败!

我在stackoverflow问这个问题,并意识到我可能在这里得到更好的答复。

尝试使用nss_ldap uner Linux设置Samba + OpenLDAP。 所有的软件是由我从源编译,所以没有RPM,YUM等…

使用Pozix Linux是我们自己的发行版 – vanillalogin系统是开箱即用的,发行版依赖于标准的/ etc / passwd,/ etc / group。

安装了所有必要的软件,将系统转换为基于LDAP的系统,似乎与除SAMBA以外的其他软件(如SSH)一起工作。

能够joinWindows7到Samba独立的PDC,我不能login一个域帐户,除非该帐户也被添加到/ etc / passwd文件。

我得到:用户在passdb,但getpwnam()失败!

我读过的所有内容都指向了NSS_LDAP问题。 以下是我所做的事情清单:

  1. getent passwd显示用户完美无瑕
  2. 我能够使用仅在LDAP数据库中的用户帐户进入同一个Linux主机。
  3. 身份validationtesting(testing是我的testing帐户只有在LDAP)的工作
  4. ./pdbedit -Lvtesting工程
  5. ./net rpc权限列表帐户-Uroot的作品,我看到根拥有所有必要的权利
  6. 从stackoverflow的每一个build议,我改变了我的nsswitch.conf文件从(文件ldap)到(ldap文件),实质上改变了gent passwd的转储顺序并没有解决问题。
  7. 注释掉rootbinddn并添加带有纯文本版本密码的bindpw,以消除ldap.secret的任何问题
  8. smb.conf有ldapsam:trusted = yes
  9. smb.conf和ldap.conf都有ssl off
  10. 不运行nscd

在samba.org网站上的第5章关于使用户开心作品除了:

./smbclient // tsrvr / test -Utest

这会在log.smbd中产生主题错误消息,并且ldapdebugging日志会显示testing的查询,且没有错误且返回值成功。

如果我把“testing”放入/ etc / passwd,那么它就起作用了!

这就好像nss_ldap和smbd之间的关系被破坏,我强调关系,因为LDAP看起来不错(slapcat,ldapsearch等等…都可以)…看起来,nss_ldap库获得的返回值是smbd ,它不知何故是不明白的。

我真的很感激任何build议。 我经常看到这个问题。 通常与PAM相关,但我不使用PAM。

此外,如果我打开/ etc / passwd文件并为有问题的用户添加一行,则可以login。

我没有使用PAM。 我添加了每个Samba.org站点所需的两个Windows7registry更新。

软件堆栈如下:Samba 3.5.3 OpenLDAP 2.4.21 nss_ldap 264

——————— [更新] ———————

我开始研究Samba源代码。

我在samba3 / auth / auth_util.c中find了这个函数(关于第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团队中有这方面知识的人可以参加。

——————— [update] ———————在这里检查samba源代码是我发现的:

失败发生在auth / auth_util.c(第580行),调用getpwnam_alloc

getpwnam_alloc尝试进行某种caching,如果在最近的caching中找不到用户名,代码将通过调用:

在lib / system.c中find的sys_getpwnam,它只是getpwnam的包装器

logging在这里: http : //opengroup.org/onlinepubs/007908775/xsh/getpwnam.html

不会像Samba那样出现检查描述的errno; 将添加一些debugging和回报。

绝对是执行getpwnam操作系统库失败,但不知道什么。

解决了!!!!!!!!!!!

我有一个启动Samba(NMBD,SMBD)以及OpenLDAP(SLAPD)的脚本。 这是一个RC脚本,它从文件中读取configuration数据,以确定哪些进程已经在运行,或者依赖进程是否无法启动等等。这是脚本中相关部分的一个片段。 最后一行将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 

事实certificate,在启动场景中,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链接的smbd版本,认为它只应依赖/ etc / passwd(如果是nsswitch.conf文件中的所有文件)和在SMBD运行后更改nsswitch.conf内容不起作用。

希望这有助于其他系统的build设者….

nss_ldap将Linuxlogin系统configuration为使用LDAP进行身份validation,而不是Samba。 您仍然必须告诉Samba使用ldap进行身份validation。 例如:

 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支持来构build。

现在获取smbldap-tools在LDAP数据库中创build用户/组/ etc。 smbldap-tools将使用正确的密码格式(一个用于Linux,一个用于Samba)和其他必需的属性来创build用户帐户。

以下是一个完整的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=