不能明文存储ldap绑定密码,因配置文件易被日志、备份、同步机制泄露,且高权限账号泄露等于失去目录控制权;应使用querypasswordexec动态注入密码,并在轮换时同步更新ldap目录、密钥后端及重启agent。

不能把 ldap.bind.queryPassword 明文写进配置文件,也不能长期复用同一密码——这是硬性安全红线。
为什么不能直接写进 mongod.conf 或 Ops Manager 配置?
MongoDB Enterprise 允许在配置中指定 security.ldap.bind.queryPassword,但该值一旦落盘,就可能被日志、备份、运维工具或权限宽松的文件系统泄露。更关键的是:Ops Manager / Cloud Manager 的配置同步机制会把整个配置推送到每个 agent 主机,等于把密码分发到所有节点。
- 即使文件权限设为
600,仍无法防止进程内存 dump、调试器附加或 root 用户读取 - 配置变更历史(如 Git 仓库、CMDB)极易意外留存明文密码
- LDAP 绑定账号通常具有高权限(如
cn=admin,dc=example,dc=com),泄露即等同于目录控制权丢失
正确做法:用 queryPasswordExec 动态注入密码
MongoDB Agent 支持通过外部命令获取密码,避免任何持久化存储。你只需在 mms.conf(Agent 配置文件)中启用执行模式:
security.ldap.bind.queryPasswordExec = /usr/local/bin/get-ldap-pw.sh
该脚本必须满足:
- 输出仅一行纯密码,无空格、换行、ANSI 字符
- 自身权限严格(如
700),且仅限mongodb用户可执行 - 不记录日志、不缓存结果、不依赖网络服务(避免引入新故障点)
- 示例脚本内容:
#!/bin/bash<br>aws ssm get-parameter --name "/prod/mongodb/ldap-bind-pw" --with-decryption --query "Parameter.Value" --output text
轮换时必须同步更新三处,缺一不可
LDAP 密码轮换不是改一个地方就能生效。以下三项必须原子性更新:
- LDAP 目录中绑定用户的密码(通过
ldappasswd或管理界面) - 凭证存储后端(如 HashiCorp Vault、AWS SSM Parameter Store、Azure Key Vault)中的密文值
- Agent 启动后首次调用
queryPasswordExec的时机 —— 必须重启mongodb-mms-agent进程,否则旧密码仍缓存在内存中
注意:queryPasswordExec 不支持热重载;Agent 不会定期重新执行它,只在每次需要 LDAP 绑定时调用一次(例如用户登录、角色同步触发时)。所以重启 Agent 是强制手段。
额外风险点:别忽略 saslauthd 套接字路径权限
如果你用的是 saslauthd 模式(Linux 上常见),security.sasl.saslauthdSocketPath 指向的 Unix 域套接字父目录,必须对运行 mongod 的用户有 r-x 权限。否则即使密码正确,也会报错:Failed to authenticate via saslauthd: Permission denied。这不是密码问题,是目录权限卡住的——排查时容易误判。











