Linux如何配置LDAP服务端与客户端集成

作者:袖梨 2026-07-07
slapd启动失败主因是slapd.d配置未正确初始化或权限错误:需停服务、清空旧配置、用slaptest -f生成新slapd.d并chown ldap:ldap,同时确保olcSuffix与olcRootDN格式规范且一致。

slapd服务启动失败:检查slapd.d初始化与权限

OpenLDAP 2.4+ 默认使用 cn=config 动态配置,直接改 slapd.conf 不生效。常见错误是启动时报 “ldap_add: Invalid syntax (21)” 或直接拒绝启动,本质是配置目录未正确生成或权限不对。

  • 必须先停掉 slapdsystemctl stop slapd
  • 备份并清空原配置:mv /etc/openldap/slapd.d /etc/openldap/slapd.d.bak
  • slaptest -f /etc/openldap/slapd.conf -F /etc/openldap/slapd.d 生成新结构(前提是 slapd.conf 存在且语法合法)
  • 关键一步:chown -R ldap:ldap /etc/openldap/slapd.d,否则 slapd 进程读不到配置文件

olcSuffix 和 olcRootDN 配置错误导致 ldapsearch 返回 “No such object”

这是客户端连得上但查不到数据的最常见原因。不是网络不通,而是服务端没声明“我在哪儿管谁”。olcSuffix 必须和你后续所有 LDIF 导入、客户端查询的 Base DN 完全一致,且格式不能少 dc=

  • 编辑 /etc/openldap/slapd.d/cn=config/olcDatabase={2}hdb.ldif
  • olcSuffix 值应为完整域名形式,例如:olcSuffix: dc=example,dc=com(不是 example.comexample
  • olcRootDN 必须匹配 olcSuffix,例如:olcRootDN: cn=admin,dc=example,dc=com
  • 修改后必须重启:systemctl restart slapd,且用 slaptest -u 验证配置语法

nslcd.conf 中 uri 和 base 配置不一致引发 getent passwd 失败

客户端能 ping 通服务器,ldapsearch -x -H ldap://192.168.10.5 -b "dc=example,dc=com" 能返回结果,但 getent passwd 为空——问题几乎一定出在 /etc/nslcd.confuribase 不匹配,或 binddn/bindpw 权限不足。

  • uri 必须带协议和结尾斜杠:uri ldap://192.168.10.5/(漏斜杠会导致连接被重定向失败)
  • base 必须与服务端 olcSuffix 完全相同:base dc=example,dc=com
  • 若服务端启用 TLS,uri 应为 ldaps://,且需配置 tls_cacertfile 指向 CA 证书路径
  • binddn 必须有足够权限读取 posixAccountposixGroup 条目,通常就是 olcRootDN

PAM 加载 pam_ldap.so 后本地用户登录变慢或失败

加了 pam_ldap.so 后,连 root 都要等 10 秒才进系统,或者本地账户突然无法登录——说明 PAM 链路把 LDAP 查询当成了必选项,而没做 fallback 控制。

  • 不要在 auth [default=bad] 这类严格模式下加载 pam_ldap.so
  • 推荐写法:auth [success=done default=ignore] pam_ldap.so use_first_pass,表示 LDAP 成功就跳过后续模块,失败则忽略继续走本地认证
  • 务必确认 /etc/pam.d/system-auth 中该行位于 pam_unix.so 之前,否则本地密码校验会被跳过
  • 如果只希望远程 SSH 使用 LDAP,就把该行加到 /etc/pam.d/sshd,而非全局 system-auth
实际部署中,最容易被跳过的其实是 slaptest -ugetent passwd 这两个验证点。前者不通过,slapd 根本不会真正加载配置;后者不返回 LDAP 用户,后面所有 PAM/NSS 都是空转。别急着改 PAM,先让 getent 跑出来再说。

相关文章

精彩推荐