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

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

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

尝试在 Linux 中使用 nss_ldap 设置 Samba + OpenLDAP。所有软件都是我从源代码编译的,因此不需要 RPM、YUM 等...

使用我们自己的发行版 Pozix Linux - 原始登录系统意味着开箱即用,该发行版依赖于标准 /etc/passwd、/etc/group。

安装所有必要的软件,将系统转换为基于 LDAP 的系统,该系统似乎可以与 SAMBA 之外的其他软件(如 SSH)一起使用。

能够将 Windows7 加入 Samba 独立 PDC,我无法使用域帐户登录,除非该帐户也添加到 /etc/passwd 文件中。

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

我读到的所有内容都指向 NSS_LDAP 问题。以下是我所做的事情的列表:

  1. getent passwd 显示用户一切正常
  2. 我能够使用仅存在于 LDAP 数据库中的用户帐户通过 ssh 进入同一个 Linux 主机。
  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:trusted = yes
  9. smb.conf 和 ldap.conf 都启用了 SSL
  10. 未运行 nscd

samba.org 网站第 5 章中有关如何让用户满意的所有内容均有效,除了:

./smbclient //tsrvr/测试-Utest

这会在 log.smbd 中生成主题错误消息,并且 ldap 调试日志显示测试查询没有错误且返回值成功。

如果我将“测试”放入 /etc/passwd,那么它就可以工作!

就好像 nss_ldap 和 smbd 之间的关系被破坏了一样,我强调关系是因为 LDAP 出现问题(slapcat、ldapsearch 等……全部工作)……看起来 nss_ldap 库正在获取一个返回值,当将其交还给 smbd 时,它不知何故无法被理解。

我会非常感激任何建议。我经常看到这个问题被列出。通常与 PAM 有关,但我没有使用 PAM。

此外,如果我打开 /etc/passwd 文件并为相关用户添加一行,那么我就可以登录。

我没有使用 PAM。我添加了 Samba.org 网站所需的两个 Windows7 注册表更新。

软件堆栈如下: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 检查 errno 时未出现描述;将添加一些调试并报告。

肯定是 OS 库实现 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

关机时我做了以下操作;请注意,我复制了一个包含“noldap”条目的 nsswitch.conf 文件。

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 与何时启动一样重要。如果在 nsswitch.conf 没有 LDAP 条目时启动 SMBD,您将获得一个链接到 nss_ldap.so 的 smbd 版本,认为它应该只依赖于 /etc/passwd(如果 nsswitch.conf 文件中只有这些内容),并且在 SMBD 运行后更改 nsswitch.conf 内容不会产生任何效果。

希望这对其他系统构建者有所帮助....

答案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=

相关内容