客户端是否需要 Nscd 才能访问非匿名访问的 LDAP 服务器?

客户端是否需要 Nscd 才能访问非匿名访问的 LDAP 服务器?

我有一台 Ubuntu-18.04 机器,需要设置它来访问不支持匿名查找的 LDAP 服务器。

我想知道神经胶质细胞是否需要在此 Ubuntu 客户端上运行?

我发现的大多数指南都建议一切都应该正常没有Nscd 正在运行,但是对我来说情况似乎并非如此。

为了进行此项设置,我安装了以下软件包:libnss-ldap、、和。libpam-ldapldap-auth-confignscd

我的/etc/ldap.conf样子如下:

base dc=mycompany,dc=com
uri ldap://192.168.3.123
ldap_version 3
rootbinddn cn=admin,dc=mycompany,dc=com
pam_password md5

我的/etc/ldap.secret包含正确的根绑定 DN 凭据。

我的/etc/nsswitch.conf样子如下:

passwd:         compat systemd ldap
group:         compat systemd ldap
shadow:         compat
gshadow:        files
...

文件/etc/etc/pam.d/common-password/pam.d/common-auth/etc/pam.d/common-account包含以下行:

auth     [success=1 default=ignore]      pam_ldap.so use_first_pass
account       [success=1 default=ignore]      pam_ldap.so 
password     [success=1 user_unknown=ignore default=die]     pam_ldap.so try_first_pass

我可以使用以下命令明确查询 LDAP 服务器并以管理员用户身份进行身份验证(使用文件中的密码/etc/ldap.secret):

$ ldapsearch -L -H ldap://192.168.3.123 -D 'cn=admin,dc=mycompany,dc=com' -W -b 'dc=mycompany,dc=com' uid=myuser

我还可以使用以下命令明确查询 LDAP 服务器并以我自己的身份进行身份验证(使用我自己的 LDAP 密码):

$ ldapsearch -L -H ldap://192.168.3.123 -D 'uid=myuser,ou=people,dc=mycompany,dc=com' -W -b 'dc=mycompany,dc=com' uid=myuser

通过nscd运行,我可以运行以下getent命令来查询有关我自己用户的信息。我既可以以我自己的用户身份运行此命令,也可以以 root 身份运行此命令:

$ getent passwd myuser
myuser:x:1000062:1000000:My User:/home/myuser:/bin/bash
$ sudo getent passwd myuser
myuser:x:1000062:1000000:My User:/home/myuser:/bin/bash

但是,如果我停止nscd,那么我将无法再getent以普通用户身份运行该命令。以 root 身份运行时它仍然有效:

$ sudo systemctl stop nscd
$ getent passwd myuser
$ sudo getent passwd myuser
myuser:x:1000062:1000000:My User:/home/myuser:/bin/bash

getent当我以普通用户身份运行时nscd,未运行,我在 systemd 日志中收到以下消息:

getent[11347]: nss_ldap: failed to bind to LDAP server ldap://192.168.3.123: Inappropriate authentication
getent[11347]: nss_ldap: reconnecting to LDAP server...
getent[11347]: nss_ldap: could not search LDAP server - Server is unavailable

我猜测为什么会发生这种情况,是因为在nscd运行时,它充当中间人并成功连接到我的 LDAP 服务器,以管理员用户身份进行身份验证。当getent我以普通用户nscd身份运行时,这一切都是透明的。

但是,如果nscd没有运行,那么getent就不知道是向我询问用户的 LDAP 密码,还是在查询 LDAP 服务器时仅使用我的用户的 LDAP 密码。

以 root 身份运行时getentgetent只知道读取/etc/ldap.secret并使用它来与 LDAP 服务器进行身份验证。


有没有办法设置系统,使getent普通用户无需nscd运行命令即可使用?在这种情况下是否需要匿名访问 LDAP?

答案1

有没有办法设置系统,使得像 getent 这样的命令可以为普通用户工作,而不依赖于 nscd 的运行?

是的。

神经胶质细胞只是所有 NSS 地图的缓存守护程序。实际上,它对 LDAP 或用于从远程服务器检索地图数据的任何其他协议一无所知。

getent[11347]: nss_ldap: 无法绑定到 LDAP 服务器

如果您的 LDAP 服务器当前不可用,则您无法从那里检索任何地图数据。

您可能在 nscd 的数据库中仍有缓存条目(请参阅 /var/lib/nscd 或类似目录)。如果 nscd 未运行,则无法提供其缓存数据。如果它正在运行,它将提供其缓存数据,直到达到缓存 TTL(请参阅 /etc/nscd.conf)。

就这么简单。

不要遵循使用 PADL 的 nss_ldap 和 pam_ldap 的过时方法。而是看看运行ssd 的或者nss-pam-ldapd

原因是 nss_ldap 和 pam_ldap 直接链接到每个进程,例如盖特恩。因此,如果对文件使用更严格的文件权限ldap配置文件这对于访问 NSS 映射的每个进程都不起作用。此外,LDAP 连接不会被缓存,从而导致性能非常差。

如果您之前以 root 用户身份访问过 NSS 映射,并且结果被缓存,那么其他用户访问缓存映射条目时,该映射也会起作用。但并非没有神经胶质细胞正在运行,且缓存结果相当不可靠。

相关内容