外观
MongoDB IP白名单
适用场景
- 生产环境中限制只有应用服务器才能访问MongoDB
- 跨数据中心部署时限制特定区域的访问
- 开发测试环境中限制团队成员的IP访问
- 云环境中限制特定VPC或子网的访问
单节点MongoDB IP白名单配置
配置方法
- 修改mongod.conf配置文件
yaml
# mongod.conf
net:
port: 27017
bindIp: 0.0.0.0 # 绑定到所有网卡,结合IP白名单使用
security:
authorization: enabled # 启用认证- 使用防火墙配置IP白名单
- Linux (iptables)
bash
# 允许特定IP访问MongoDB端口
iptables -A INPUT -p tcp --dport 27017 -s 192.168.1.0/24 -j ACCEPT
iptables -A INPUT -p tcp --dport 27017 -j DROP # 默认拒绝所有其他IP- Linux (firewalld)
bash
# 添加允许访问的IP段
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port protocol="tcp" port="27017" accept'
firewall-cmd --reload- Windows防火墙
通过Windows防火墙高级设置,创建入站规则,限制只有特定IP可以访问27017端口。
复制集MongoDB IP白名单配置
配置方法
- 修改mongod.conf配置文件
yaml
# mongod.conf
net:
port: 27017
bindIp: 0.0.0.0 # 复制集成员需要互相访问
security:
authorization: enabled
keyFile: /path/to/keyfile # 复制集密钥文件
replication:
replSetName: rs0- 防火墙配置
对于复制集,需要允许以下IP访问:
- 所有复制集成员的IP地址
- 应用服务器IP地址
- 管理工具IP地址
bash
# 允许复制集成员之间通信
for ip in 192.168.1.10 192.168.1.11 192.168.1.12; do
iptables -A INPUT -p tcp --dport 27017 -s $ip -j ACCEPT
done
# 允许应用服务器访问
iptables -A INPUT -p tcp --dport 27017 -s 10.0.0.0/16 -j ACCEPT
# 默认拒绝
iptables -A INPUT -p tcp --dport 27017 -j DROP分片集群MongoDB IP白名单配置
配置方法
- 修改各组件的配置文件
- mongod (分片节点)
yaml
net:
port: 27018
bindIp: 0.0.0.0
security:
authorization: enabled
keyFile: /path/to/keyfile
replication:
replSetName: shard1
sharding:
clusterRole: shardsvr- mongod (配置节点)
yaml
net:
port: 27019
bindIp: 0.0.0.0
security:
authorization: enabled
keyFile: /path/to/keyfile
replication:
replSetName: configRS
sharding:
clusterRole: configsvr- mongos (路由节点)
yaml
net:
port: 27017
bindIp: 0.0.0.0
security:
keyFile: /path/to/keyfile
sharding:
configDB: configRS/192.168.1.20:27019,192.168.1.21:27019,192.168.1.22:27019- 防火墙配置
对于分片集群,需要允许以下IP访问:
- 所有集群组件(mongod分片、mongod配置、mongos)的IP
- 应用服务器IP
- 管理工具IP
bash
# 允许集群内部通信
for ip in 192.168.1.10 192.168.1.11 192.168.1.12 192.168.1.20 192.168.1.21 192.168.1.22 192.168.1.30; do
iptables -A INPUT -p tcp -m multiport --dports 27017,27018,27019 -s $ip -j ACCEPT
done
# 允许应用服务器访问mongos
for port in 27017; do
iptables -A INPUT -p tcp --dport $port -s 10.0.0.0/16 -j ACCEPT
done
# 默认拒绝
iptables -A INPUT -p tcp -m multiport --dports 27017,27018,27019 -j DROPMongoDB Atlas IP白名单配置
配置方法
- 登录MongoDB Atlas控制台
- 选择目标集群,点击"Network Access"
- 点击"Add IP Address"
- 可以选择:
- "Add Current IP Address":添加当前机器IP
- "Allow Access From Anywhere":允许所有IP访问(不推荐生产环境)
- "Add IP Range":添加IP段
- 点击"Confirm"
最佳实践
- 生产环境中只允许特定IP或IP段访问
- 使用VPC对等连接或专用链路替代公网IP白名单
- 定期审查和更新IP白名单
云环境IP白名单配置
AWS EC2安全组
- 创建或选择安全组
- 添加入站规则:
- 类型:自定义TCP
- 端口范围:27017
- 源:特定IP或IP段
- 将安全组关联到MongoDB实例
Azure网络安全组
- 创建或选择网络安全组
- 添加入站安全规则:
- 源:特定IP或IP段
- 目标端口范围:27017
- 协议:TCP
- 操作:允许
- 将网络安全组关联到子网或网络接口
Google Cloud防火墙规则
bash
gcloud compute firewall-rules create mongodb-allow --allow tcp:27017 --source-ranges 10.0.0.0/16 --target-tags mongodbIP白名单管理最佳实践
- 最小权限原则:只允许必要的IP访问MongoDB
- 定期审查:每季度或半年审查一次IP白名单,移除不再需要的IP
- 自动化管理:使用基础设施即代码工具(Terraform、CloudFormation)管理IP白名单
- 变更审批流程:修改IP白名单需要经过审批流程
- 监控和告警:监控IP白名单的变更,设置告警
- 文档化:记录IP白名单的使用目的和变更历史
常见问题(FAQ)
Q1: IP白名单和认证机制的关系是什么?
A1: IP白名单是网络层的访问控制,认证机制是应用层的访问控制。两者应该结合使用,提供多层次的安全保护。即使IP在白名单中,用户仍然需要提供正确的用户名和密码才能访问MongoDB。
Q2: 复制集环境中,是否需要在防火墙中开放所有节点的IP?
A2: 是的,复制集成员之间需要互相通信,所以需要在防火墙中允许所有复制集成员的IP访问MongoDB端口。同时,还需要允许应用服务器和管理工具的IP访问。
Q3: 如何处理动态IP的情况?
A3: 对于动态IP,可以考虑以下解决方案:
- 使用VPN连接,将动态IP转换为固定的VPN IP
- 使用云服务商提供的动态DNS服务
- 对于MongoDB Atlas,可以使用API自动更新IP白名单
- 考虑使用零信任网络架构
Q4: IP白名单配置错误会导致什么问题?
A4: IP白名单配置错误可能导致:
- 应用服务器无法连接到MongoDB
- 复制集成员之间无法通信,导致复制集故障
- 管理工具无法访问MongoDB,影响运维操作
- 集群组件之间无法通信,导致分片集群故障
Q5: 如何验证IP白名单是否生效?
A5: 可以通过以下方法验证IP白名单:
- 从不在白名单中的IP尝试连接MongoDB,应该连接失败
- 从在白名单中的IP尝试连接MongoDB,应该连接成功
- 检查防火墙日志,确认被拒绝的连接尝试
- 使用telnet或nc命令测试端口可达性
Q6: 生产环境中是否应该使用"允许所有IP访问"的配置?
A6: 不推荐。生产环境中应该严格限制IP访问,只允许必要的IP或IP段访问MongoDB。"允许所有IP访问"会大大增加安全风险,容易受到暴力破解和恶意攻击。
Q7: 如何在不中断服务的情况下更新IP白名单?
A7: 可以按照以下步骤更新IP白名单:
- 先添加新的IP到白名单
- 测试新IP可以正常访问
- 移除不再需要的旧IP
- 验证服务仍然正常运行
这样可以避免因更新IP白名单导致服务中断。
