MongoDB 5.0副本集启动要求keyFile权限严格为400(仅所有者可读),chmod 600亦被拒绝;需同时设置security.keyFile和security.authorization: enabled,并使用DNS主机名配置replSet成员,且须排查SELinux/AppArmor拦截。

Keyfile权限必须是400,不是600
MongoDB 5.0起对keyFile权限执行硬性校验:只有chmod 400被接受,chmod 600或644都会导致启动失败,并报错Keyfile permissions are too open。这不是警告,是直接拒绝启动。
-
chmod 400 /etc/mongo-keyfile是唯一安全且被接受的权限设置 - 执行
chown前先改权限,否则某些系统会重置权限位 - 属主必须是运行
mongod进程的用户(如mongod或mongodb),不能是root - 避免把
keyFile放在/tmp、/home或NFS挂载点——部分文件系统无法精确满足400语义
配置文件里要同时启用keyFile和authorization
只配keyFile不开启authorization: enabled,副本集成员间虽能通信,但客户端仍可无密码连接,等于白做。二者必须共存:
-
security.keyFile用于节点间内部认证 -
security.authorization: enabled用于客户端连接鉴权(如mongosh) - 两者在
mongod.conf中属于同一级配置项,不可嵌套或遗漏 - 示例片段:
security: authorization: enabled keyFile: /etc/mongo-keyfile
启动前必须用DNS主机名而非IP地址配置replSet成员
从MongoDB 5.0开始,如果rs.initiate()中任意成员使用IP地址(如"192.168.1.10:27017"),该节点将无法通过启动验证,直接退出。必须全部使用可解析的DNS主机名。
- 检查
/etc/hosts或DNS服务,确保所有节点能互相ping通并nslookup成功 - 初始化时
members数组里的host字段必须是"node1.example.com:27017"这类形式 - 配置文件中的
net.bindIp可以保留0.0.0.0或具体IP,但replSet拓扑定义必须用主机名 - 若环境无DNS,至少在每台机器的
/etc/hosts中静态映射所有节点,例如:192.168.1.10 node1.example.com
SELinux或AppArmor常被忽略,但会静默拦截keyFile读取
即使ls -l显示权限和属主完全正确,服务仍可能启动失败或日志里只报Permission denied——这八成是SELinux(RHEL/CentOS/Fedora)或AppArmor(Ubuntu/Debian)在拦截。
- 临时验证:执行
setenforce 0(SELinux)或aa-disable /usr/bin/mongod(AppArmor),再试启动 - SELinux永久修复:
semanage fcontext -a -t mongod_etc_t "/etc/mongo-keyfile",然后restorecon -v /etc/mongo-keyfile - AppArmor需确认
/etc/apparmor.d/usr.bin.mongod中包含/etc/mongo-keyfile r,规则 - 别跳过
journalctl -u mongod -n 50 --no-pager,真正原因往往藏在最后几行里
400权限后仍起不来——这时候大概率是SELinux上下文没更新,或者rs.initiate()里混用了IP和主机名。动手前先看日志,比反复重试高效得多。


















