我们正在使用 LDAP 通过 nslcd 对我们设备的用户进行身份验证,并且在系统日志中看到如下消息:
/var/log/syslog.1:Dec 20 06:25:11 T53-1014-014 nslcd[1496]: [398c89] <passwd="*"> "*": name denied by validnames option
/var/log/syslog.1:Dec 20 06:25:11 T53-1014-014 nslcd[1496]: [4fe9f9] <passwd="*"> "*": name denied by validnames option
/var/log/syslog.1:Dec 20 06:25:14 T53-1014-014 nslcd[1496]: [b5af5c] <passwd="*"> "*": name denied by validnames option
/var/log/syslog.1:Dec 20 06:25:15 T53-1014-014 nslcd[1496]: [1226bb] <passwd=-1> ldap_search_ext() failed: Can't contact LDAP server
/var/log/syslog.1:Dec 20 06:25:15 T53-1014-014 nslcd[1496]: [1226bb] <passwd=-1> no available LDAP server found, sleeping 1 seconds
/var/log/syslog.1:Dec 20 06:25:16 T53-1014-014 nslcd[1496]: [34b6a8] <passwd="*"> "*": name denied by validnames option
/var/log/syslog.1:Dec 20 06:25:16 T53-1014-014 nslcd[1496]: [233c99] <passwd=-1> ldap_search_ext() failed: Can't contact LDAP server
/var/log/syslog.1:Dec 20 06:25:16 T53-1014-014 nslcd[1496]: [233c99] <passwd=-1> no available LDAP server found, sleeping 1 seconds
/var/log/syslog.1:Dec 20 09:01:04 T53-1014-014 nslcd[1496]: [0c57b1] <passwd=-1> ldap_search_ext() failed: Can't contact LDAP server
/var/log/syslog.1:Dec 20 09:01:04 T53-1014-014 nslcd[1496]: [0c57b1] <passwd=-1> no available LDAP server found, sleeping 1 seconds
我们希望摆脱这些消息,而不是简单地重新配置记录的内容。因此,我们最好了解发生了什么,然后重新配置系统,这样这些消息就不会再生成。但如何分析呢?
问题在于,任何进程都可以执行一些操作来触发系统执行身份验证操作,但在日志中您无法看到哪个进程触发了身份验证操作。您如何分析这个问题?
如果有帮助的话,我愿意在 nslcd 源中添加额外的诊断代码并部署该已检测的可执行文件。
我们使用的是旧的 Ubuntu 发行版:12.04,nss-pam-ldapd-0.8.4
更新:我创建了一个修改版的 nslcd,它可以记录连接到它的应用程序的命令行。这显然很有帮助。
答案1
从man 5 nslcd.conf
有效名称 REGEX
此选项可用于指定如何在系统内验证用户名和组名。此模式用于检查从 LDAP 请求和返回的所有用户名和组名。
正则表达式应指定为 POSIX 扩展正则表达式。表达式本身需要用斜杠 (/) 字符分隔,并且可以在末尾附加“i”标志以指示匹配不区分大小写。默认值为 /^[a-z0-9。@$()]([a-z0-9.@$() \~-]*[a-z0-9._@$()~-])?$/i
我假设您正在尝试请求带有“'(可能有人认为文件通配符适用于用户名)或来自 ldap 的响应消息包含带有 '' 在里面。
您可以尝试解决有问题的用户名或更改validnames
正则表达式,使其接受“*”作为有效的用户名。
笔记这样做可能会导致意外问题,尤其是在使用 '*' 作为表达式的 shell 脚本中,如果没有正确转义或引用的话。