KeyFile权限错误是mongod启动失败主因:mongod用户需对KeyFile及其父目录有读/执行权,文件权限应为400且无执行位;内容须字节级一致,用sha256sum验证;配置中keyFile必须为绝对路径并重启服务;客户端连接仍需--authenticationDatabase指定认证库。

KeyFile权限不对导致mongod启动失败
绝大多数节点间认证失败,根本不是KeyFile内容错了,而是Linux系统拒绝读取——mongod进程默认以mongod用户运行,但KeyFile常被创建在root下且权限过宽或过窄。
必须确保:
- KeyFile路径对
mongod用户可读(不能是600却属root且不属mongod组) - 文件不能有执行位(
chmod 400 /etc/mongod-keyfile最稳妥) - 父目录也得让
mongod用户能进入(比如/etc通常OK,但/home/user/keys大概率不行)
sudo -u mongod cat /etc/mongod-keyfile测试是否真能读;读不出,直接报Failed to load keyfile: Permission denied,后续所有auth错误都是假象。
KeyFile内容不一致触发“Authentication failed”
副本集每个节点的KeyFile必须字节级完全相同——连末尾换行符都不能差。常见翻车点:
- 用
echo "secret" > keyfile生成,Windows编辑器保存为UTF-16或带BOM - 不同节点用
openssl rand -base64 756各自生成,结果当然不一致 - scp传输时启用了ASCII模式,悄悄转换了换行符
scp -p(保留权限)同步到所有节点。验证方式:在各节点运行sha256sum /etc/mongod-keyfile,输出必须一模一样。
mongod.conf里security.keyFile路径写错或没生效
配置项security.keyFile值必须是绝对路径,且不能包含环境变量或波浪号(~)。常见错误:
- 写成
keyFile: ./keyfile(相对路径,mongod会去工作目录找,通常是/) - 写成
keyFile: ~/keyfile(shell展开由shell做,mongod不认) - 修改了conf但忘了
sudo systemctl restart mongod,或者改的是/etc/mongod.conf却实际加载了/lib/systemd/system/mongod.service里指定的其他配置路径
db.adminCommand({getCmdLineOpts: 1}),看返回里的parsed.security.keyFile字段是否是你预期的路径。
启用KeyFile后连接Mongo Shell必须显式加--authenticationDatabase
KeyFile只管节点间通信,客户端连副本集仍需用户名密码——但很多人以为开了KeyFile就不用输账号了,结果mongo --host rs1.example.com:27017直接被拒,报not authorized on admin to execute command { replSetGetStatus: 1.0 }。
这是因为:
- KeyFile不提供客户端认证能力
- 你必须先用
mongo -u <user> -p <pass> --authenticationDatabase admin</pass></user>登录 - 如果用户是在
admin库创建的,--authenticationDatabase admin不能省;如果在myapp库创建,就得换成--authenticationDatabase myapp
--authenticationDatabase参数是新手最常卡住的地方,错误信息完全不提这个参数,只说“not authorized”。
重置KeyFile本质是三件事:内容统一、权限闭合、配置落地。最容易被忽略的是父目录权限和getCmdLineOpts验证——很多人改完conf就重启,却没确认mongod进程到底加载了哪个路径的KeyFile。










