MongoDB 默认放行的是谁
MongoDB 默认不启用访问控制,任何能连上 27017 的客户端都能直接读写数据库,包括删除整个库。勒索事件中最常见的组合就是“端口暴露 + 未开启认证”,攻击者批量扫描、清库并留下索取赎金的信息。加固需要同时做两件事:在配置里启用 authorization 要求账号登录,并把绑定地址收到回环或内网。启用认证有固定的顺序要求,做反了会把自己锁在库外。
基本信息
| 加固项 | 数据库认证与监听地址收敛 |
|---|---|
| 适用平台 | Linux/Windows(MongoDB 4.x 及以上) |
| 权限要求 | 数据库管理员与系统 root |
| 达标判据 | authorization 为 enabled,bindIp 不含公网地址 |
| 配置文件 | /etc/mongod.conf |
典型使用场景
- 公网暴露的 MongoDB 做紧急收敛
- 新部署实例按标准模板初始化,避免沿用默认配置
- 等保测评中“访问控制”与“数据完整性”条款整改
- 从单机迁移到副本集时统一认证方案
- 审计备份与监控脚本的账号权限是否最小化
核查现状
核查现状
ss -tlnp | grep ':27017 ' # 监听地址与进程
grep -E 'authorization|bindIp|port' /etc/mongod.conf # 关键配置项
mongosh --quiet --eval 'db.adminCommand({getCmdLineOpts:1})' 2>/dev/null | head -20 # 运行时生效参数
mongosh --quiet --eval 'db.runCommand({connectionStatus:1})' 2>/dev/null # 当前会话是否已认证加固步骤(顺序不能反)
加固步骤(顺序不能反)
# 1) 先创建管理员账号(此时尚未开启认证,本地可直连)
# mongosh --quiet --eval 'db.getSiblingDB("admin").createUser({user:"siteAdmin",pwd:passwordPrompt(),roles:[{role:"root",db:"admin"}]})'
# 2) 再改配置并重启生效:
# security:
# authorization: enabled
# net:
# bindIp: 127.0.0.1,10.0.1.10
systemctl restart mongod
ss -tlnp | grep ':27017 ' # 复核绑定地址已收敛关键配置项
| 配置项 | 作用 | 注意事项 |
|---|---|---|
| security.authorization | 开启访问控制 | 启用前必须先有管理员账号,否则无法登录 |
| net.bindIp | 限定监听地址 | 写 127.0.0.1 或内网地址,不要用 0.0.0.0 |
| net.port | 非默认端口 | 只降低被扫到的概率,不能替代认证 |
| 安全组与主机防火墙 | 边界控制 | 与 bindIp 双层配合,一层失效仍有保护 |
| 账号与角色 | 最小权限 | 监控与备份各用独立的最小权限账号 |
开启认证的顺序不能颠倒:必须先创建管理员账号,再把 authorization 设为 enabled 并重启。反过来做会立刻失去所有数据库访问能力,只能靠本地手段恢复,生产环境容易演变成中断事故。
副本集与分片集群的认证链路更长:开启 authorization 时通常需要节点间的密钥文件或内部证书认证,且要按拓扑滚动执行、逐节点验证。集群环境变更前先确认拓扑与副本状态,按维护窗口推进,避免一次性全量重启。