生产环境必须禁用mongod --bind_ip 0.0.0.0,仅绑定内网地址并配防火墙白名单;强制启用security.authorization;关闭net.http.enabled和rest;配置审计日志并保留≥180天。

生产环境必须禁用 mongod --bind_ip 0.0.0.0
开发环境常为图省事直接绑定全网段,但生产环境暴露 mongod 到公网等同于敞开数据库大门。哪怕有认证,未加固的 MongoDB 实例仍可能被暴力扫出弱口令、或利用未修复的 CVE(如 CVE-2016-6494)绕过认证。
- 开发可接受:
mongod --bind_ip 127.0.0.1,192.168.1.100(仅限本机+内网测试机) - 生产强制要求:
--bind_ip 10.10.20.50(仅业务服务器所在子网网关地址),配合防火墙白名单 - 若用容器部署,
docker run中不能漏掉--network=host或显式--publish,否则默认桥接模式可能绕过宿主机防火墙规则
security.authorization: enabled 在生产不是可选项,而是启动前提
开发时关掉权限系统很常见——方便快速查数据、改集合。但生产环境一旦启用该配置,所有连接都必须带凭证,且角色权限需最小化。很多人忽略的是:开启后,localhost exception 机制仅在首次初始化时生效;如果实例已运行、再补开 authorization,旧连接会直接断开,且 admin 数据库里没提前建好用户就彻底锁死。
- 上线前必须执行:
mongo --eval "db.createUser({user:'admin',pwd:'xxx',roles:['root']})",再改配置重启 - 应用连接字符串必须含
?authSource=admin,否则默认去当前库验权,报错Authentication failed - 别给应用账号
root角色;读服务用read,写服务用readWrite,删操作单独配临时账号
生产环境必须关闭 net.http.enabled 和 rest 接口
MongoDB 自带的 HTTP 状态页(默认 :28017)和 REST API 是调试利器,但也是攻击面。它不走 auth 流程,只要能连上端口就能看到连接数、内存使用、甚至部分集合名——足够辅助后续定向爆破。
- 开发配置中可能留着:
net.http.enabled: true、rest: true - 生产配置中这两项必须显式设为
false,或干脆从配置文件里删掉(默认即关闭) - 检查是否残留:
curl -s http://prod-mongo:28017/ | grep -q "MongoDB" && echo "危险:HTTP接口未关闭"
日志与审计策略在生产环境不可妥协
开发通常不记操作日志,但生产必须记录谁、何时、对哪个集合执行了 dropDatabase 或 remove({})。MongoDB 社区版不支持细粒度审计,只能靠 systemLog.verbosity: 1 + 外部日志采集;企业版则需开启 auditLog 并指定输出到 syslog 或文件。
- 社区版最低要求:
systemLog.destination: file+systemLog.logAppend: true+ 每日轮转脚本 - 关键字段不能过滤:确保日志含
clientIP、cmd、ns(命名空间)、secs - 最容易被跳过的点:日志路径权限设为
600,避免普通用户读取,否则审计形同虚设
真正难的不是加几行配置,而是让 DBA 和运维达成共识:审计日志必须和应用日志走同一套收集链路,且保留周期不低于 180 天——这点在资源紧张时最常被砍掉。

















