必须先配keyFile再启副本集,因其是节点间握手唯一凭证,首次启动前未配置则无法动态启用;需chmod 400、chown mongod:mongod,且security.authorization与security.keyFile必须同时启用。

高可用集群本身不等于安全,没做安全加固的副本集或分片集群,就像给金库装了自动门却忘了上锁——节点能选主、能故障转移,但攻击者连密码都不用试就能删库勒索。
为什么必须先配 keyFile 再启副本集
副本集节点间通信默认无认证,仅靠 replSet 名字识别彼此。一旦网络暴露(比如 bind_ip: 0.0.0.0 或防火墙放行 27017),任何知道 replica set name 的机器都能伪装成合法节点加入集群,执行 rs.add()、接管选举,甚至清空数据。
-
keyFile是节点间握手的唯一凭证,不是可选配置,是强制信任链起点 - 必须在首次启动
mongod前就写入配置,否则初始化后的副本集无法动态开启该机制 - 生成后必须严格控制权限:
chmod 400 /etc/mongo-keyfile && chown mongod:mongod /etc/mongo-keyfile,否则服务拒绝启动
mongod.conf 中安全配置的硬性顺序
顺序错一步,整个认证链就断。尤其注意 security 模块内参数的依赖关系:
-
security.authorization: enabled必须和security.keyFile同时存在,只开 authorization 不设 keyFile,副本集初始化会卡在STARTUP2状态 -
net.bindIp要早于security块定义,否则即使写了127.0.0.1,192.168.10.101,若前面没声明net:顶层键,配置会被忽略 -
setParameter: enableLocalhostAuthBypass: false必须显式关闭——这是 MongoDB 默认保留的本地绕过漏洞,生产环境不关等于留后门
管理员用户必须在 admin 库且用 SCRAM-SHA-256 创建
旧版 db.addUser() 已废弃,且默认使用弱哈希;新集群必须用 createUser 指定强算法:
use admin
db.createUser({
user: "clusterAdmin",
pwd: "Tru3Str0ngP@ssw0rd2026!",
roles: [ { role: "root", db: "admin" } ],
mechanisms: ["SCRAM-SHA-256"]
})
- 用户必须建在
admin数据库,其他库的用户无法登录管理接口 -
mechanisms字段不能省略,否则可能回退到 SHA-1,被离线爆破 - 创建后立即测试:
mongo -u clusterAdmin -p 'Tru3Str0ngP@ssw0rd2026!' --authenticationDatabase admin 127.0.0.1:27017,失败则说明authorization未生效或用户建错库
最容易被忽略的 systemd 服务级限制
配置文件再严,如果 systemd 允许服务以 root 启动、开放所有网络族、不限制内存,安全就是纸糊的:
- 检查
/lib/systemd/system/mongod.service,确保有:RestrictAddressFamilies=AF_UNIX AF_INET AF_INET6(禁用 AF_PACKET 等原始套接字) - 添加:
NoNewPrivileges=true和PrivateTmp=true,防止提权和临时文件污染 - Ubuntu 20.04+ 还需确认 AppArmor profile 已加载:
aa-status | grep mongod,没输出说明 profile 未启用,得手动aa-enforce /etc/apparmor.d/usr.bin.mongod
这些限制不在 mongod.conf 里,但缺一不可——它们堵的是配置文件管不到的底层逃逸路径。


















