1

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

slap_global_control: unrecognized control: 1.3.6.1.4.1.4203.666.5.16

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

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

当用户导入运行时,此消息每秒可能出现大约一百次。在终端中仅键入一次“id [用户名]”时,此消息在 syslog 中出现大约 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 的信息,也许这就是导致问题的原因?

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

4

1 回答 1

2

ldap_set_option(LDAP_OPT_DEREF,0)

这是在处理搜索操作期间取消引用别名的选项。它被禁用(默认情况下)很好。但这在这里不相关。

正如您已经发现的那样,“1.3.6.1.4.1.4203.666.5.16”是所谓的LDAP Dereference Control的 OID 。此控件可用于搜索请求,以让服务器从搜索找到的条目所引用的条目中返回数据。

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

似乎只能在编译nss-pam-ldapd(又名nslcd)时关闭。

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

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

于 2018-10-26T13:33:24.437 回答