不能同时启用 SCRAM 和 LDAP,因为 MongoDB 认证机制为单入口设计,security.authentication.mechanisms 仅允许指定一个值,启动时拒绝多机制共存配置。

不能在同一个 MongoDB 部署中混合启用 SCRAM 和 LDAP 作为**主身份验证机制**——security.authentication.mechanisms 只允许指定一个值(如 SCRAM-SHA-256 或 LDAP),且 MongoDB 启动时会拒绝多个机制共存的配置。
为什么不能同时启用 SCRAM 和 LDAP?
MongoDB 的认证流程是单入口设计:启动时通过 security.authentication.mechanisms 指定唯一机制,后续所有客户端连接都必须使用该机制完成初始认证。即使你启用了 security.authorization: true,它控制的是「已认证用户能否执行操作」,不改变认证入口本身。
常见误解是认为“LDAP 用户走 LDAP,本地用户走 SCRAM”可行——但实际中:
• 如果设为 LDAP,所有连接(包括 mongosh 直连、备份脚本、监控 agent)都必须提供 LDAP 凭据或通过代理(如 saslauthd);
• 如果设为 SCRAM-SHA-256,LDAP 用户根本无法登录,除非你在 $external 数据库中手动创建同名 SCRAM 用户(这等于放弃 LDAP 管理优势)。
替代方案:用 $external + LDAP 实现“类混合”效果
真正可行的做法是:启用 LDAP 作为唯一认证机制,但把部分管理用户“映射”到 $external 数据库,再赋予其本地操作权限。这需要满足两个前提:
- 部署必须是 MongoDB Enterprise(Community 不支持 LDAP)
- 必须配置
security.ldap.userToDNMapping或security.ldap.authz.queryTemplate,让 MongoDB 能将用户名解析为 LDAP DN 并完成绑定
例如,你想让运维人员用 LDAP 登录,同时保留一个本地备份账号 backup-admin:
use $external
db.createUser({
user: "backup-admin",
roles: [
{ role: "backup", db: "admin" },
{ role: "clusterMonitor", db: "admin" }
],
authenticationRestrictions: [{
clientSource: ["10.10.20.5"],
serverAddress: ["mongodb-prod-01.example.com"]
}]
})
⚠️ 注意:backup-admin 仍需通过 LDAP 认证(比如 AD 中存在同名账户),否则无法触发 $external 用户查找。MongoDB 不会“fallback”到 SCRAM;它只查 $external,而该库中的用户必须由 LDAP 服务验证通过后才被接受。
容易踩的坑:saslauthd 权限与连接池行为
当使用 saslauthd 代理 LDAP 认证时,以下问题高频导致 Mongo::Auth::Unauthorized 或连接超时:
-
saslauthd套接字路径的父目录(如/var/run/saslauthd)必须对运行mongod的用户有r-x权限,否则进程无法读取 socket 文件 - 在 RHEL/CentOS 等默认链接
libldap(非线程安全版)的系统上,LDAP 查询是串行阻塞的;高并发下延迟飙升,建议显式启用连接池:setParameter: { ldapUseConnectionPool: true } - 未配置 TLS 的 LDAP 查询(
ldap://)会被现代 AD 拒绝,错误类似LDAP Result Code 49 "Invalid Credentials",必须改用ldaps://或 STARTTLS
真正复杂的点在于权限映射粒度:LDAP 用户登录后,默认只有 $external 数据库的最小权限,所有业务数据库访问都要靠 security.ldap.authz.queryTemplate 动态拉取角色——这个模板一旦写错(比如 DN 匹配失败),用户就变成「能登录但无任何权限」,错误日志里只显示模糊的 not authorized on admin to execute command,排查时得同时检查 LDAP 服务器返回、MongoDB 日志级别(verbosity: { auth: 2 })和模板语法。











