mongodb副本集节点间通信必须使用统一keyfile认证,其内容须为6–1024字符的base64字符串(不含等号),linux下权限严格限定为chmod 600且属主可读,否则mongod启动失败;客户端访问需另行启用rbac并创建用户,二者机制完全分离。

副本集内部通信必须用密钥文件统一认证
副本集节点之间不靠用户名密码通信,而是靠共享密钥文件做身份校验。只要密钥内容一致、权限正确,节点才能互相识别并加入集群。这和客户端连接是两套机制,不能混为一谈。
密钥文件需满足三个硬性条件:
• 内容长度在 6 到 1024 字符之间
• 只能含 base64 字符集(A-Za-z0-9+/=)
• Linux 下必须设为 chmod 600,且属主对文件有读权限,否则 mongod 启动直接失败
常见错误:
• 把密钥文件复制到各节点后没改权限,报错 Permissions for the keyfile are too open
• 用 echo "xxx" > keyfile 生成,末尾带换行符导致校验失败
• 在不同节点上分别生成密钥,内容不一致,节点始终显示 SECONDARY 或反复初始化
客户端访问必须单独启用 RBAC 并创建用户
密钥文件只管节点间通信,不解决外部连接问题。客户端(比如应用代码、mongosh、可视化工具)连进来时,必须走基于角色的访问控制(RBAC),也就是先建用户、再赋角色、最后用账号密码登录。
关键动作顺序不能错:
• 先停掉所有节点,加好 security.keyFile 配置再启动
• 连上任意节点(此时还无 auth),在 admin 库执行 db.createUser()
• 至少创建一个带 userAdminAnyDatabase 角色的用户,否则后续无法增删其他用户
• 修改配置文件开启 security.authorization: enabled,重启全部节点
容易忽略的点:
• --authenticationDatabase "admin" 必须显式指定,否则默认去当前库找用户,会报 Authentication failed
• 用户的认证数据库(db 字段)和实际操作的数据库可以不同,但角色定义里的 db 是权限作用域,别写错
• MongoDB 5.0+ 不再接受纯 IP 地址配置副本集成员,必须用 DNS 主机名,否则节点启动卡在 Waiting for quorum
分片集群要同时配 keyFile 和 mongos 用户体系
分片集群比副本集多一层路由逻辑,安全配置也更碎:每个 shard、config server、mongos 都得有相同的密钥文件;而 mongos 本身不存数据,但它要代理所有客户端请求,所以用户必须在 mongos 上创建,不能只在某个 shard 上建。
实操要点:
• 所有 mongod 实例(shard + configsvr)配置 security.keyFile
• 所有 mongos 实例也要配同样的 security.keyFile,否则无法连接 config server
• 连 mongos 创建用户,例如:mongo --port 27017 -u root -p --authenticationDatabase admin
• 分片本地维护操作(如块迁移、手动均衡)需直连 shard 节点,并用该 shard 的本地管理员用户登录
典型陷阱:
• 只给 shard 配了 keyFile,忘了给 mongos 配,结果 mongos 启动报 Failed to load config server connection string
• 在某个 shard 上创建用户后就以为全局可用,实际该用户只对该 shard 生效,跨分片查询仍被拒绝
• config server 没开 authorization,但 shard 开了,导致 mongos 能连 config 但查不到元数据,报 not master and slaveOk=false
生产环境别用密钥文件,X.509 才是正解
密钥文件适合测试,但上线后它暴露的是静态共享密钥,一旦泄露整个集群就裸奔。X.509 证书支持单向/双向 TLS、证书吊销、有效期控制,才是生产级方案。
迁移到 X.509 的真实代价:
• 每个节点需独立证书,还得由同一 CA 签发,运维复杂度陡增
• mongod 启动参数从 --keyFile 变成 --tlsMode=requireTLS --tlsCertificateKeyFile=/path/to.pem --tlsCAFile=/path/to/ca.pem
• 客户端连接命令也得加 --tls --tlsCAFile,驱动代码里要显式配置 TLS 选项
• 副本集初始化时,members[n].host 必须用证书里 SAN 字段声明的域名,不能写 IP
最常被跳过的细节:
• 证书的 subjectAltName 必须包含所有节点的 DNS 名称,漏一个就握手失败
• MongoDB 默认不校验证书有效期,但生产环境必须打开 tlsClusterFile 并配好 CRL(证书吊销列表)
• mongos 和 mongod 的 TLS 配置项名称不完全一致,抄错一个字段就会静默降级为非加密通信











