我在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问题。 以下是我所做的事情清单:
在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=