越来越多的关于mongodb泄露的事件暴露出来了, 影响还是挺大的,提高mongodb的使用安全主有两个办法
1是改变默认端口27017 改成其他的端口
2是使用mongodb的auth 用户名密码验证机制, 不要不使用密码去裸奔。
今天分享的是用iptables再进一步进行ip访问的限制。
先介绍一下mongodb自带的bind_ip
启动参数,
假设服务器的端扣口 27017
服务器的内网ip 192.168.0.99
服务器外网的ip 111.111.111.111
开发人员办公室IP 222.222.222.222
bind_ip
的意思是mongodb运行时是绑定在哪个ip的
如果设置成bind_ip=127.0.0.1
, 这样意味着只有服务器本机可以连到mongodb上。
如果设置成bind_ip=127.0.0.1, 192.168.0.99
, 这样意味着除了本机,局域网也可以通内网ip进行访问
如果设置成bind_ip=127.0.0.1, 192.168.0.99, 111.111.111.111
这样意味着 所有的外网IP都可以访问了,效果等同于不用bind_ip参数
仅仅使用bind_ip的话没办法限制部分外网ip进行访问, 所以需要借助iptables的帮忙
iptables就是用来配置服务器的访问规则, 我们现在的目标是 内网可以访问mongodb,外网只有指定的IP可以访问。
首先禁止所有的IP访问 27017端口
iptables -I INPUT -p tcp --dport 27017 -j DROP
然后允许访问本机IP访问27017端口
iptables -I INPUT -s 127.0.0.1 -p tcp --dport 27017 -j ACCEPT
然后允许局域网访问, 这里子网掩码一定要写对 不然不生效 如果写成192.168.0.0/24 而服务器的ip段又不是这么设置的 就没法生效了
iptables -I INPUT -s 192.168.0.0/16 -p tcp --dport 27017 -j ACCEPT
最后允许外网某IP可以访问
iptables -I INPUT -s 222.222.222.22 -p tcp --dport 27017 -j ACCEPT
检查设置的ip规则
iptables --list INPUT --line-numbers
iptables --list INPUT --line-numbers
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 ACCEPT tcp -- localhost anywhere tcp dpt:27017
2 ACCEPT tcp -- 172.16.0.0/16 anywhere tcp dpt:27017
3 ACCEPT tcp -- 192.168.0.0/16 anywhere tcp dpt:27017
4 ACCEPT tcp -- 222.222.222.222 anywhere tcp dpt:27017
5 DROP tcp -- anywhere anywhere tcp dpt:27017
这里的行数可以用来删除规则,删除num为5的规则
iptables -D INPUT 5
iptables -A 添加规则
iptables -I 插入规则到指定num,默认1
iptables -D 删除指定num的规则
这里值得注意的是 可以理解iptables生效规则是从下往上, 从num大到小,
像例子中的 DROP所有访问在最后一句 先执行, 然后再往上 ACCPET这些可以认为是添加的例外,
如果DROP是第一行其他的几个允许访问的规则都会因为被覆盖掉而失效。
理解这个规则之后就会理解什么时候改用iptables -I 什么时候用iptables -A (一般都是用 -I)
iptables的保存, 上面的这些操作系统重启后 就没了,一般要进行iptables的保存,
根据系统的不同, ubuntu系统如果想保存的话 可以参考
The easy way is to use iptables-persistent.
Install iptables-persistent:
sudo apt-get install iptables-persistent
After it's installed, you can save/reload iptables rules anytime:
sudo /etc/init.d/iptables-persistent save
sudo /etc/init.d/iptables-persistent reload
Ubuntu 16.04 Server
The installation as described above works without a problem, but the two commands for saving and reloading above do not seem to work with a 16.04 server. The following commands work with that version:
sudo netfilter-persistent save
sudo netfilter-persistent reload