我有一台 Ubuntu-18.04 机器,需要设置它来访问不支持匿名查找的 LDAP 服务器。
我想知道神经胶质细胞是否需要在此 Ubuntu 客户端上运行?
我发现的大多数指南都建议一切都应该正常没有Nscd 正在运行,但是对我来说情况似乎并非如此。
为了进行此项设置,我安装了以下软件包:libnss-ldap
、、和。libpam-ldap
ldap-auth-config
nscd
我的/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 身份运行时getent
,getent
只知道读取/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 映射,并且结果被缓存,那么其他用户访问缓存映射条目时,该映射也会起作用。但并非没有神经胶质细胞正在运行,且缓存结果相当不可靠。