必须停机操作,否则节点握手失败、复制中断;keyfile须用openssl rand -base64 756生成,长度1008字节,存于专用目录;权限设为600、属主mongod:mongod;配置需同时启用authorization、keyfile和clusterauthmode: keyfile。

必须停机操作,不能边运行边加 KeyFile,否则节点间握手失败、复制中断甚至数据回滚。
KeyFile 生成必须用 openssl rand -base64 756
随便 echo 一个字符串或用弱熵工具生成的密钥,MongoDB 会直接拒绝加载,日志里报 No keys found for replica set 或 Invalid key length。756 是经过验证的安全长度,Base64 编码后刚好落在 6–1024 字符范围内,且满足内部校验要求。
- 命令必须是
openssl rand -base64 756 > /path/to/keyfile,不能少空格、不能漏-out参数(部分旧版 OpenSSL 要求) - 路径别放在
/tmp或/etc,推荐/var/lib/mongodb/keyfile这类专用目录,避免被系统扫描或误清理 - 生成后立刻检查长度:
wc -c /path/to/keyfile,应为 1008 字节(756 字节原始熵经 Base64 编码后膨胀约 1.33 倍)
权限和属主错一个就认证失败
mongod 启动时读取 keyFile 是以运行用户身份进行的,权限不对会导致“文件不可读”静默失败——节点能启动,但无法加入副本集,rs.status() 显示 STARTUP2 或 REMOVED,日志里只有模糊的 Failed to load key。
- 必须执行
chmod 600 /path/to/keyfile(400也行,但600更常见且明确) - 必须执行
chown mongod:mongod /path/to/keyfile(假设服务由mongod用户运行;用ps aux | grep mongod确认实际用户) - Docker 场景下注意挂载权限:
-v /host/keyfile:/container/keyfile:ro,容器内仍需chown,否则mongod进程读不到
配置文件里 security 必须同时写全三项
只开 authorization: enabled 不够,只配 keyFile 也不够。内部通信和客户端访问是两层认证,缺一不可,且 clusterAuthMode: keyFile 必须显式声明,MongoDB 4.2 默认是 auth 模式,不兼容副本集握手。
- 配置块必须严格如下(缩进、冒号、换行都不能错):
security: keyFile: /var/lib/mongodb/keyfile authorization: enabled clusterAuthMode: keyFile
- 所有节点的
mongod.conf中replSetName、bindIp、port必须完全一致,否则rs.add()会因 DNS 解析失败或认证超时静默失败 - 别用 IP 直接写
bindIp,改用主机名(如bindIp: localhost,mongo1.example.com),MongoDB 5.0+ 已禁止纯 IP 启动
管理员用户必须在停机后、首次本地连接时创建
启用 KeyFile 后,localhost 接口仍是唯一免认证入口,但这个窗口只存在于第一次启动且尚未创建任何用户时。一旦创建了第一个用户,localhost 免认证机制立即关闭——没提前建好用户,你就彻底锁死在集群外面了。
- 所有节点启动前,先停掉整个副本集;逐个用
mongod --config xxx.conf --bind_ip 127.0.0.1单节点启动(确保只监听本地) - 用
mongosh --host 127.0.0.1:27017连上单节点,在admin库执行db.createUser(...),角色至少含userAdminAnyDatabase - 确认返回
1后,再关掉该节点,按正常配置(含完整bindIp)重启;重复此流程直到所有节点都完成用户创建
最易被忽略的是 clusterAuthMode: keyFile 这一行——它不出现在多数默认配置模板里,但漏掉就等于只装了门锁没配钥匙,节点互相看得见却打不开门。











