mongodb 4.4 不支持原生 ldap 身份验证,必须通过 sasl + saslauthd 代理实现,仅支持 scram-sha-1/scram-sha-256;需正确配置 saslauthd 的 ldap 机制、unix socket 路径及 selinux 策略,并确保 mongod 启动时指定 --auth 和 --setparameter saslauthdpath。

MongoDB 4.4 不支持原生 LDAP 身份验证,必须走 SASL + saslauthd 代理路径,且仅限 SCRAM-SHA-1/SCRAM-SHA-256 认证机制。 直接在 mongod.conf 里配 ldap 或启用 security.authorization: ldap 会启动失败或被忽略——这是常见误操作的根源。
saslauthd 必须启用 ldap 机制,且配置文件路径和加载顺序不能错
不同发行版加载 saslauthd 配置的方式不一致,硬编码路径极易出错:
- CentOS/RHEL/Fedora:编辑
/etc/sysconfig/saslauthd,确保MECH=ldap,且FLAGS="-O /etc/saslauthd.conf"显式指定配置文件(默认不读) - Ubuntu/Debian:编辑
/etc/default/saslauthd,设MECHANISMS="ldap",并确认START=yes;saslauthd.conf仍需手动放在/etc/下 - 关键点:
saslauthd启动时不会自动探测/etc/saslauthd.conf,必须用-O参数显式传入,否则它只用内置的 pam 或 shadow 机制
saslauthd.conf 的 LDAP 连接参数必须严格匹配 OpenLDAP 实际结构
OpenLDAP 的 ldap_filter 写错一个字符,saslauthd -v -n 1 测试就会返回 authentication failed,但日志里不提示具体哪条过滤规则失败:
-
ldap_servers: ldaps://ldap.example.com:636—— 必须用ldaps://或明确加ldap_tls_ciphers,纯ldap://在 4.4+ 默认被拒绝 -
ldap_search_base: ou=users,dc=example,dc=com—— 必须是完整 DN,不能省略ou=或写成dc=example.com -
ldap_filter: (uid=%u)—— %u 是 MongoDB 传来的用户名,若 OpenLDAP 实际用cn或sAMAccountName,这里必须同步改,否则查不到条目 - 调试建议:先用
ldapsearch -x -H ldaps://... -D "cn=admin,..." -W -b "ou=users,..." "(uid=testuser)"手动验证过滤逻辑是否通
MongoDB 4.4 的 saslauthd 集成依赖 Unix socket 通信,权限和 SELinux 容易卡住
mongod 进程必须能读写 /var/run/saslauthd/mux,否则报错 Cannot connect to saslauthd server: Permission denied:
- 确认
saslauthd已运行:systemctl status saslauthd,且ps aux | grep saslauthd显示-a saslauthd -m /var/run/saslauthd -
mongod用户(通常是mongod)必须属于saslauthd用户组:usermod -a -G saslauthd mongod - SELinux 环境下,
setsebool -P authlogin_nsswitch_use_ldap on和semanage fcontext -a -t var_run_t "/var/run/saslauthd(/.*)?"必须执行,否则 socket 创建失败 - 不要尝试把
saslauthd改成 TCP 模式(-n参数),MongoDB 4.4 只认 Unix socket
最常被跳过的环节是:改完 saslauthd.conf 后没重启 saslauthd,或者 mongod 启动时没加 --auth 和 --setParameter saslauthdPath=/var/run/saslauthd/mux。这两个参数缺一不可,且路径必须和 saslauthd 实际监听的 socket 完全一致——多一个斜杠或少一个字母都会静默失败。











