[Mongodb] 借mongodb被入侵勒索事件,谈下Linux服务器端口安全问题
一、缘由:
最近几天Mongodb勒索事件甚嚣尘上:由于对外网开放访问并且没有开启授权机制被删库、远程拖库、勒索。接着又曝出Elasticsearch被勒索事件,缘由一样,Elasticsearch服务暴露在公网上并且
Elasticsearch是没有账号安全体系的。再者联想到前些日子,Redis未授权访问漏洞,同样是因为Redis没有暴露在公网、没有设置授权认证,而引起的。
做为专职运维人员来说,这些漏洞和勒索事件,只要有一件发生就必须引起警觉和漏洞扫描防治措施的启动。
入侵了数据库,会把数据删掉,哪怕不太重要也会多多少少引起一些问题,让你花更多时间去补回数据。利用Redis未授权访问漏洞,入侵了服务器,那你这台机器就危险了,木马,历史操作记录,
数据库操作记录,各种数据会被拿走,如果长期潜伏你确不知道,就很麻烦了。有的木马很难干掉的话,你只能重装系统了,这又是个不小的工作量。
莫非定律说:会出错的事总会出错;如果你担心某种情况发生,那么它就更有可能发生。所以不要心存侥幸,安全问题重在预防。
二、解决办法:
Mongodb未授权访问漏洞介绍见这里:http://www.freebuf.com/news/59143.html
Redis未授权访问漏洞介绍见这里:http://blog.knownsec.com/2015/11/analysis-of-redis-unauthorized-of-expolit/
Elasticsearch漏洞介绍见这里:拿什么拯救你,我的 Elasticsearch
对于将后台服务、数据服务的端口暴露在公网解决办法如下(以ES为例,mongodb等类似):
其一,初段开发人员都有一个疑问,我要是把 host 绑到了内网 ip,我在本地开发的时候可改怎么访问服务,测试它呢?总不能每次都登录到服务器,使用 curl 来访问吧,那得多难用?!
直接上答案,推荐力度按次序由小到大:
1)使用 nginx 做反向代理,将一个公网 ip 和端口代理到 es 的服务上,用完就把 nginx 这个代理关掉。当然,nginx 本身是支持基础安全账号机制的。
2)在服务器上部署一个 shadowsocks 服务,本地开一个 client 连过去,然后把 es 的访问地址(比如 10.0.0.10:9200)代理到 shadowsocks client开放的 代理上(比如socks5),就可以自由访问了。
当然,你可以访问其他所有的内网服务哦。
3)最推荐的方案,还是在服务器装一个 openvpn 服务,本地开发人员连接 vpn 后,内网的服务就可以访问了。当然,这个方案成本有些高,需要有一定的运维能力。
其二,有没有啥方法可以防止以后又出现这种傻×行为呢?比如就有一个 es 服务不小心配置成 0.0.0.0 了
有方案,上防火墙,常见的就是 iptables。简单讲,就是对本地开放的 ip 和端口建立白名单,比如常见的 iptables 配置如下,这个配置开放了 80( http 服务 )、443( https 服务)和 22 ( ssh 端口)这三个端口
*filter :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [0:0] -A INPUT -i lo -j ACCEPT -A INPUT -i eth0 -j ACCEPT -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT -A INPUT -p tcp --dport 22 -j ACCEPT -A INPUT -p tcp --dport 80 -j ACCEPT -A INPUT -p tcp --dport 443 -j ACCEPT -A INPUT -j DROP COMMIT
其三,一些个人经验总结
1)前端进程和后端进程一定要分别部署在不同的机器上,避免前端因为漏洞等被侵入,造成后端服务和数据不可用,规避风险。
2)后端服务即那些不对直接和用户交互的服务、数据库服务,一定要添加防火墙规则,合理控制访问权限,避免被攻击利用。
3)对于数据库相关服务,要养成定时备份的好习惯,最坏情况下数据丢失被删除也不怕。
4)对于前端服务,要做好某个IP访问频率的限制,避免被人合理利用攻击。
三、附录
推荐一个网站:ZooomEye,钟馗之眼,是一个针对网络空间的搜索引擎。他的爬虫是专门扫描网络上服务器的,比如他拿到一个IP,就开始探测这个IP上有哪些端口开放、利用一些方法获取重要的开放服务的信息。
利用他,可以对自己的服务器做一个简单的漏洞扫描(当然前提是他已经更新过你服务器的信息)。https://www.zoomeye.org/