我在 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 问题。以下是我所做的事情的列表:
- getent passwd 显示用户一切正常
- 我能够使用仅存在于 LDAP 数据库中的用户帐户通过 ssh 进入同一个 Linux 主机。
- id test(test 是我在 LDAP 中唯一的测试账户)有效
- ./pdbedit -Lv 测试工作
- ./net rpc rights list accounts -Uroot 有效,我看到 root 拥有所有必要的权限
- 根据 stackoverflow 的建议,我将 nsswitch.conf 文件从 (files ldap) 更改为 (ldap files),这实质上改变了 getent passwd 的转储顺序并且并未解决问题。
- 注释掉 rootbinddn 并添加带有明文密码的 bindpw,以消除 ldap.secret 的任何问题
- smb.conf 有 ldapsam:trusted = yes
- smb.conf 和 ldap.conf 都启用了 SSL
- 未运行 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=