修复多个 slap_global_control:无法识别的控件:在系统日志中

Fixing multiple slap_global_control: unrecognized control: in syslog

在使用 LDAP 进行用户身份验证的 debian 8 服务器上(安装了 slapd、libpam-ldapd 和 nslcd)我多次在系统日志中收到以下消息,每次系统需要在 LDAP 中查找用户信息(例如输入 id [用户名],或设置文件夹权限等)

slap_global_control: unrecognized control: 1.3.6.1.4.1.4203.666.5.16

这个控件显然是取消引用控件。我找不到关于它的任何信息,除了它在将 LDAP 数据库存储在多个服务器上时很有用。在我的机器上从来没有这种情况。我从来没有在任何地方有意识地激活该控件。

这使得系统在某些情况下非常慢,例如当用户导入脚本为 运行 并导入大量用户时。

当用户导入 运行 时,此消息每秒可能出现大约一百次。仅在终端中键入 "id [username]" 一次时,此消息在系统日志中出现大约 10 次。

进一步调查显示,nslcd 可能与此行为有关。当 运行 nslcd 处于调试模式时,可以看到以下选项用于连接到 LDAP 服务器:

nslcd: [e8944a] <group=3000> DEBUG: ldap_initialize(ldapi:///localhost)
nslcd: [e8944a] <group=3000> DEBUG: ldap_set_rebind_proc()
nslcd: [e8944a] <group=3000> DEBUG: ldap_set_option(LDAP_OPT_PROTOCOL_VERSION,3)
nslcd: [e8944a] <group=3000> DEBUG: ldap_set_option(LDAP_OPT_DEREF,0)
nslcd: [e8944a] <group=3000> DEBUG: ldap_set_option(LDAP_OPT_TIMELIMIT,0)
nslcd: [e8944a] <group=3000> DEBUG: ldap_set_option(LDAP_OPT_TIMEOUT,0)
nslcd: [e8944a] <group=3000> DEBUG: ldap_set_option(LDAP_OPT_NETWORK_TIMEOUT,0)
nslcd: [e8944a] <group=3000> DEBUG: ldap_set_option(LDAP_OPT_REFERRALS,LDAP_OPT_ON)
nslcd: [e8944a] <group=3000> DEBUG: ldap_set_option(LDAP_OPT_RESTART,LDAP_OPT_ON)
nslcd: [e8944a] <group=3000> DEBUG: ldap_simple_bind_s(NULL,NULL) (uri="ldapi:///localhost")

所以它似乎在那里禁用了 DEREF,但是我的 slapd 配置根本没有关于 DEREF 的信息,也许这就是导致问题的原因?

如何避免关于无法识别控件的多条消息?

ldap_set_option(LDAP_OPT_DEREF,0)

这是 dereferencing an alias 在处理搜索操作期间的一个选项。很好,它被禁用(默认情况下)。但这与这里无关。

你已经知道“1.3.6.1.4.1.4203.666.5.16”就是所谓的LDAP Dereference Control的OID。此控件可用于搜索请求,让服务器 return 来自搜索找到的条目引用的条目的数据。

根据您的数据启用覆盖 slapo-deref 在数据库中可以帮助加快速度,但会导致数据被多次传输(例如,如果用户是许多人的成员团体)。

好像只能在编译nss-pam-ldapd(又名nslcd)的时候关闭。

但是恕我直言,这不是您的主要性能问题。您应该考虑使用 nscd(名称服务缓存恶魔)。否则,对 nslcd 的每个 NSS 请求都会导致远程发送 LDAP 搜索请求。

您也可以考虑使用 sssd,因为它有一个内部缓存架构,有利也有弊。 YMMV.