必须用 mongodb enterprise 版本,community 版不支持 ldap;6.0 仍支持 ldap over tls,但已在 8.0 中被标记为弃用,后续大版本将移除;仅适用于副本集或分片集群,单节点不支持;需通过 saslauthd 配置 tls 加密通道并验证证书链与权限。

必须用 MongoDB Enterprise 版本,Community 版不支持 LDAP;6.0 仍支持 LDAP over TLS,但注意它已在 8.0 中被标记为弃用,后续大版本会移除。
确认 MongoDB 版本与部署类型
LDAP over TLS 只在 MongoDB Enterprise 中可用,且仅适用于副本集或分片集群(mongos + mongod),单节点 standalone 不支持 LDAP 身份验证。
- 运行
mongod --version或连接后执行db.version(),确认输出含enterprise字样 - 检查部署拓扑:通过
rs.status()(副本集)或sh.status()(分片集群)确认角色和成员状态 - 若使用 Kubernetes Operator,必须通过
spec.security.authentication.ldap配置,不能写进CustomResourceDefinition本身
配置 saslauthd + TLS 加密通道
Linux 环境下 MongoDB 6.0 默认依赖系统级 saslauthd 进程代理 LDAP 查询,TLS 必须由该进程端到端终止,MongoDB 本身不直连 LDAP 服务器。
-
saslauthd启动时需加-O /etc/saslauthd.conf指向配置文件,其中必须包含ldap_tls_ciphers、ldap_tls_check_peer和ldap_tls_cacert_file -
/etc/saslauthd.conf中的ldap_servers必须是 LDAPS URL(如ldaps://ad.example.com:636),不能是ldap://明文地址 - 确保
saslauthd进程能读取 CA 证书文件,且 MongoDB 启动用户对/var/run/saslauthd/目录有 socket 访问权限 - 重启
saslauthd后,用testsaslauthd -u testuser -p password验证通路,失败时看/var/log/auth.log中的 TLS 握手错误
启动 mongod 时启用 LDAP 身份验证机制
关键不是“开启 LDAP”,而是让 mongod 使用 PLAIN 或 SCRAM-SHA-256 以外的认证机制——即显式指定 ldap 作为 SASL 服务名,并绑定到本地 saslauthd。
- 启动参数中必须含:
--auth --setParameter authenticationMechanisms=PLAIN(注意是PLAIN,不是LDAP;LDAP 是后端,机制名仍是 PLAIN) - 若用配置文件,写入:
security: authorization: enabled setParameter: authenticationMechanisms: "PLAIN"
- 连接测试时,客户端必须用
mongo --username user --password --authenticationMechanism=PLAIN --host rs0/example.com:27017,少任何一项都会 fallback 到本地 SCRAM 认证 - 错误日志里出现
Failed to authenticate但无 LDAP 相关线索?大概率是saslauthdsocket 路径不对,检查START=yes和MECH_OPTIONS="-a /var/run/saslauthd/mux"是否匹配
LDAPS 连接常见失败点
绝大多数“LDAP over TLS 失败”实际卡在操作系统层 TLS 握手,MongoDB 日志里往往只显示 generic SASL error,需从底层排查。
- 用
openssl s_client -connect ad.example.com:636 -CAfile /path/to/ca.pem直连验证证书链和主机名是否匹配 - Active Directory 默认要求 SNI,而旧版
saslauthd(如 RHEL 7 自带)不发 SNI;升级到saslauthd≥ 2.1.27 或改用 OpenLDAP 的slapd代理 - 证书中的
subjectAltName必须包含 LDAP 服务器 FQDN;若用 IP 地址连接,subjectAltName必须含IP:xxx.xxx.xxx.xxx,否则 OpenSSL 拒绝校验 - 防火墙放行的是
636(LDAPS),不是389;有些云厂商安全组默认只开 389,需手动添加规则
真正容易被忽略的是:MongoDB 6.0 对 saslauthd 的 socket 权限极其敏感,哪怕 mongod 以 mongod 用户运行,也必须确保该用户属于 sasl 组,且 /var/run/saslauthd/ 目录的 group 权限为 sasl、mode 为 2755。这点在容器化部署中极易出错,因为 init 容器常覆盖掉 socket 目录权限。











