VPC内暴露27017端口仍危险,因未启用认证、bindIp配置不当及安全组放行过宽会导致横向渗透;必须同时满足VPC隔离、安全组最小化放行和实例级认证三条件。

为什么直接暴露 27017 端口在 VPC 里仍然危险
很多团队误以为“部署在 VPC 内 = 安全”,结果在内部网络中仍监听 0.0.0.0:27017,且未启用认证。一旦某台业务服务器被攻陷,攻击者可横向扫描内网,直连 MongoDB 实例并执行 db.getMongo().getDBNames() 泄露全部库名——这在真实渗透测试中高频复现。
真正安全的私有云访问控制必须同时满足三个条件:VPC 网络隔离 + 安全组最小化放行 + MongoDB 实例级认证启用。缺一不可。
mongod.conf 中 bindIp 必须收敛到 VPC 子网 CIDR,不能只写 127.0.0.1
仅绑定本地回环会阻断所有远程连接,包括合法的业务服务;但写成 0.0.0.0 或留空则等于放弃第一道网络防线。
- 正确做法是显式列出受信子网,例如:
bindIp: 127.0.0.1,172.16.1.0/24,172.16.2.0/24(对应你 VPC 下的业务子网和数据库子网) - 若使用华为云或阿里云,注意其 VPC 内网 DNS 解析可能依赖特定网段,
bindIp配置错误会导致副本集成员间心跳失败 - 修改后必须执行
sudo systemctl restart mongod,仅重载配置不生效
安全组规则要精确到源 IP 段,且禁止开放 0.0.0.0/0
云平台安全组是 VPC 内最外层的访问闸门。常见错误是:为图省事,在入站规则中允许任意源访问 TCP:27017,以为“反正我在内网”。这是典型的安全错觉。
- 只放行业务服务器所在子网,例如:
172.16.1.0/24 → TCP:27017 - 禁止添加
0.0.0.0/0或::/0规则,哪怕临时调试也不建议 - 出站规则无需特别放开——MongoDB 本身不主动外连,但若启用了
auditLog发送到远程 syslog,需单独放行对应端口 - 安全组绑定操作必须完成:创建规则 ≠ 自动生效,需进入 MongoDB 实例详情页,手动选择“更多 > 安全组”进行绑定
PyMongo 连接字符串里不能硬编码密码,且必须启用 tls=true
即使网络层已收敛,明文密码出现在代码或配置文件中,仍可能被日志、进程列表或配置中心泄露。TLS 不仅防窃听,还能防止中间人伪造响应。
- 连接字符串格式应为:
mongodb://admin:<password>@mongodb-01.internal:27017/?authSource=admin&tls=true&tlsCertificateKeyFile=/etc/ssl/mongo.pem</password> - 密码必须从环境变量或密钥管理服务(如 HashiCorp Vault、华为云 KMS)动态注入,禁用字符串拼接
- 自签名证书需提前部署到客户端机器,并在连接时指定
tlsCAFile,否则 PyMongo 会因证书校验失败静默拒绝连接 - 若使用 MongoDB Atlas 或云厂商托管服务,
tls=true是强制要求,不加会导致连接超时而非报错
最容易被忽略的是:安全组和 bindIp 收敛之后,仍要验证 MongoDB 是否真的只响应授权请求。用一台不在白名单内的 VPC 内机器执行 telnet mongodb-01.internal 27017,应直接失败;再用白名单机器连接后执行 db.runCommand({connectionStatus: 1}),确认 authInfo.isAuthenticated 为 true。这两步不验证,等于没闭环。


















