openldap统一认证跑不起来,八成卡在slapd.d初始化或olcrootpw配置上;ldapsearch报“no such object”或“referral”,基本可断定数据库未加载、suffix未生效,或ldif修改后权限/格式错误。

OpenLDAP统一认证跑不起来,八成卡在 slapd.d 初始化或 olcRootPW 配置上;ldapsearch 报 “No such object” 或 “Referral”,基本可以断定数据库没加载、suffix 没生效,或者 LDIF 修改后权限/格式错了。
slapd.d 动态配置必须初始化,否则服务启动等于空转
OpenLDAP 2.4+ 强制使用 cn=config(即 /etc/openldap/slapd.d)动态配置,旧式 slapd.conf 只能当初始化模板用。跳过这步,slapd 虽然能启动,但实际没加载任何数据库定义,ldapsearch -x -b '' -s base namingContexts 会直接报错或返回空。
- 先停服务:
systemctl stop slapd - 备份原配置:
mv /etc/openldap/slapd.d /etc/openldap/slapd.d.bak - 复制模板(RHEL/CentOS):
cp /usr/share/openldap-servers/slapd.conf.obsolete /etc/openldap/slapd.conf;Ubuntu 则通常跳过此步,直接用dpkg-reconfigure slapd - 编辑
/etc/openldap/slapd.conf,确保含这两行(域名按需替换):suffix "dc=example,dc=com"rootdn "cn=admin,dc=example,dc=com"
再把slappasswd -s your_password生成的{SSHA}xxx填进rootpw行 - 执行初始化:
slaptest -f /etc/openldap/slapd.conf -F /etc/openldap/slapd.d,成功后必须改权限:chown -R ldap:ldap /etc/openldap/slapd.d
olcSuffix 和 olcRootDN 必须严格匹配,且不能漏 dc=
修改数据库后缀时,olcSuffix 和 olcRootDN 的 DN 格式必须完全一致,且每个组件都得是 dc=xxx 形式。写成 o=example 或漏掉 dc=,ldapsearch -x -b "dc=example,dc=com" 就会返回 “Referral” 或 “No such object”。
Linux AI 服务器 — 将 Linux 服务器转换为本地 AI 推理集群。使用 systemd、NVIDIA CUDA 实现无头 Linux AI,零 GUI 开销。
- 编辑文件:
vi /etc/openldap/slapd.d/cn=config/olcDatabase={2}mdb.ldif(注意:新版默认是mdb,不是hdb;CentOS 7/8 可能是{2}hdb,先ls /etc/openldap/slapd.d/cn=config/olcDatabase=*确认) - 确认以下三行值正确且对齐(注意缩进只能是 Tab,不能是空格):
olcSuffix: dc=example,dc=comolcRootDN: cn=admin,dc=example,dc=comolcRootPW: {SSHA}xxx - 改完别直接重启 —— 先校验:
slaptest -u -F /etc/openldap/slapd.d,失败就说明 LDIF 格式或引用有误 - 重启前务必确认
slapd进程没残留:pkill -f slapd && systemctl start slapd
基础 Schema 必须导入,否则无法添加用户条目
刚初始化完的 OpenLDAP 默认只加载 minimal schema,inetOrgPerson、nis 这类关键 Schema 都没加载。不导入,后续用 ldapadd 加用户就会报错 “objectClass ‘posixAccount’ requires attribute ‘uidNumber’”,因为服务器根本不认识这些 objectClass。
- 逐个导入(顺序不能乱,
cosine和core必须在最前):ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/cosine.ldifldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/core.ldifldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/nis.ldifldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/inetorgperson.ldif - 检查是否生效:
ldapsearch -Y EXTERNAL -H ldapi:/// -b cn=schema objectClasses | grep -A 2 'posixAccount',有输出才说明nis成功加载 - 如果提示
SASL(-1): generic failure,大概率是/var/run/openldap/ldapi权限不对,补一句:chown ldap:ldap /var/run/openldap/ldapi && chmod 700 /var/run/openldap/ldapi
客户端 NSS-PAM 集成失败,问题通常不在 LDAP 服务端
getent passwd 没输出、su - ldapuser 提示 “User not known to the underlying authentication module”,这类问题 90% 出在本地客户端链路:要么 nslcd 没跑,要么 /etc/nsswitch.conf 里 passwd: files ldap 写成了 passwd: files [NOTFOUND=return] ldap 这种错误 fallback,要么 /etc/sssd/sssd.conf 和 /etc/nslcd.conf 冲突共存。
- 确认
nslcd已启用:systemctl enable --now nslcd,然后查日志:journalctl -u nslcd -n 50 --no-pager - 检查
/etc/nsswitch.conf中这几行是否为:passwd: files ldapgroup: files ldapshadow: files ldap - 验证连接:
ldapsearch -x -H ldap://your-ldap-server -b "dc=example,dc=com" -D "cn=admin,dc=example,dc=com" -W "(uid=root)",能查到才说明网络和凭据没问题 - 别同时开
sssd和nslcd—— 二者功能重叠,冲突时getent行为不可预测
真正容易被忽略的是 LDIF 文件里的缩进和换行:所有 olc* 属性值前必须是 Tab,不能是空格;changetype: modify 后必须空一行再写 replace:;ldapadd 导入时若某行末尾多了不可见空格,整个 LDIF 就会静默失败 —— 日志里可能只显示 “modifying entry”,但实际什么都没改。










