直接暴露27017端口在vpc内仍不安全,必须同时收紧bindip(显式配置受信子网如172.16.1.0/24)、安全组(仅放行业务子网)和实例级认证三道防线,缺一不可。

直接暴露 27017 端口在 VPC 内仍不安全,必须同时收紧 bindIp、安全组和认证三道防线。
bindIp 配置错误导致副本集心跳失败
很多团队把 bindIp 设成 127.0.0.1 或留空/写 0.0.0.0,结果不是连不上就是横向可扫。副本集成员间靠心跳通信,若某节点只绑本地回环,其他节点发不出 isMaster 请求,状态会卡在 STARTUP2。
- 正确做法是显式列出 VPC 内受信子网,例如:
bindIp: 127.0.0.1,172.16.1.0/24,172.16.2.0/24 - 华为云/阿里云 VPC 的 DNS 解析依赖特定网段(如
100.125.0.0/16),若未包含该段,rs.status()可能显示host unreachable - 改完
mongod.conf后必须执行sudo systemctl restart mongod,mongod --reload不生效
安全组规则放行过宽等于没设
常见错误是入站规则允许 0.0.0.0/0 → TCP:27017,或只按“内网”模糊判断。安全组是 VPC 内第一道闸门,它不识别应用层协议,只看 IP+端口。
- 只放行业务服务器所在子网,例如:
172.16.1.0/24→TCP:27017 - 禁止添加
0.0.0.0/0或::/0,哪怕临时调试也不建议——真实渗透中,攻击者常利用跳板机扫描内网段 - 创建规则 ≠ 自动绑定:需进入 MongoDB 实例详情页,手动点击“更多 > 安全组”完成绑定
- 出站规则无需放开——MongoDB 本身不主动外连;但若启用了
auditLog发送到远程 syslog,则需单独放行对应 UDP/TCP 端口
PyMongo 连接字符串硬编码密码是高危操作
即使网络层已收敛,明文密码出现在代码或配置文件中,仍可能被进程列表(ps aux)、日志(journalctl)、CI/CD 构建缓存泄露。
- 连接字符串必须启用
tls=true,格式为:mongodb://admin:<password>@mongodb-01.internal:27017/?authSource=admin&tls=true&tlsCertificateKeyFile=/etc/ssl/mongo.pem</password> - 密码必须从环境变量(
os.getenv("MONGO_PASSWORD"))或密钥管理服务(如 HashiCorp Vault、华为云 KMS)动态注入,禁用字符串拼接 - 自签名证书需提前部署到客户端机器,并在连接时指定
tlsCAFile,否则 PyMongo 报错SSL handshake failed
最容易被忽略的是 bindIp 和安全组的协同——只改一个,另一个就变成单点失效。比如安全组限制了源 IP,但 mongod 仍监听 0.0.0.0,一旦规则误配,风险立刻暴露;反过来,bindIp 收紧了,但安全组放行了整个 VPC 段,等于白做。











