MongoDB安全事件的防范与反思

此文已由作者温正湖授权网易云社区发布。

欢迎访问网易云社区,了解更多网易技术产品运营经验。


近段时间来,全球范围内数以万计的MongoDB实例被攻击,作为旨在为用户提供最优MongoDB云服务的网易蜂巢MongoDB团队在第一时间跟进了相关报道,虽然蜂巢MongoDB服务从设计初就将数据的安全性列为第一位,确保用户数据安全,但本着高度负责的态度我们对MongoDB服务又进行了安全自检,显然,结果也没让大家失望。这次事件从技术层面看并没有什么高深之处,应对措施也非常方便,下面结合蜂巢MongoDB进行介绍。


首先,不要把MongoDB实例直接暴露在公网下,这是原则问题。可以说没有任何理由将您的数据存储服务部署在公网环境,蜂巢用户的MongoDB实例都部署在私有网络中,跟公网相隔离。通过这个措施,可以抵挡掉绝大部分伤害。进一步,MongoDB实例所在的私网是用户专用的,也就是说,该私网对蜂巢中的其他用户也是隔离的,这又消除了被同一云平台下其他用户攻击的可能。


其次,为MongoDB实例开启认证并设置访问账号,这也是最基本的。启动认证后,访问者若不指定正确的账号和密码就无法正常访问MongoDB实例。密码应该设置成字母、数字和特殊符号的组合,可以极大降低被破解的难度。显然,包括蜂巢MongoDB在内的主流MongoDB云服务都开启了认证。


可以说,做了上述几点,基本上可以保证您的MongoDB数据是安全的。但还可以做得更好。


做好账号权限控制。MongoDB引入了非常细粒度的基于角色的权限控制机制(RBAC),实例拥有者可以为不同的MongoDB使用者提供适当权限等级的账号,比如仅能读/写某个集合、数据库;为MongoDB管理员提供 dbAdmin/userAdmin等权限的账号,可参考官方文档https://docs.mongodb.com/manual/core/authorization/,该文档对权限管理进行了详细地介绍。这样,即使某个账号泄露或被攻破,也可以最大限度减少损失。蜂巢MongoDB服务为用户提供readWriteAnyDatabase权限的账号,用户仅能通过云控制台来修改密码。避免账号泄露密码被篡改。后续,我们还将为用户提供增强版的MongoDB数据库和账号管理功能,敬请期待!


将MongoDB端口设置为非默认端口。大家都知道27017端口是MongoDB的,3306是端口MySQL的,暴露在公网的MongoDB实例,如果使用默认端口,别有用心的他们telnet下就连上了。当然了,你选择其他端口无法从根本上解决问题,但至少加了层防护,所以也应该考虑。在网易蜂巢云平台,用户在创建蜂巢MongoDB实例时可以指定端口。


在网易蜂巢(云计算基础服务),除了以上防护外,我们还提供了平台级的安全保证,网易内部有专门的安全部门负责扫描和识别安全隐患,一旦发现既会通知相应的产品负责人第一时间解决问题,排除隐患。


如果因为上述防护没有做到位等原因,您的MongoDB实例还是被攻破了,数据被删或被勒索,那么至少应该有备份可以用来恢复数据。所以平时做好数据备份是非常重要的,不仅仅在防“盗”(黑客)时有用,防“火”(软硬件故障)时也很有用,同时也可以用来防止数据被误删。蜂巢MongoDB提供手动备份功能,用户可以随时为您的实例进行备份,比如在load完一批重要数据后;还提供了自动备份能力,周期性地将您的数据备份到网易对象存储服务NOS上,免费的哦!在需要进行数据恢复时,用户可选择对应时间点的备份,将数据恢复到一个新的实例上。


到此,本文可以结束了。但我一直有个疑问未解:为什么会有那么多裸奔的MongoDB实例?我认真阅读了该事件被报道后的几乎每篇文章,但目前还没有分析这些实例的具体情况,这些实例创建者到底是些什么人,是不是“傻子太多,骗子不够用了”?下面谈谈我的看法:


裸奔的MongoDB很多是用于学习的。MongoDB目前已经在全球数据库排老四了,肯定有一大波App开发者、数据库运维、在校学生和其他对MongoDB感兴趣的朋友们在学习MongoDB,那么在公有云平台上搭建个测试实例用于学习这种事情很好理解。什么,开启认证设置密码?一是或许还不会,二是估计也是嫌麻烦,反正裸奔也挺时尚。


裸奔的MongoDB很多是用于测试的。这么火的MongoDB,公司要上新业务做数据库选型时,怎么也得纳入候选列表,那就得搭个测试环境,调研试用一番,再测测功能。于是,也会产生一堆实例,或许数据量还挺大的。


如果上面两种情况占了裸奔实例大部分,那么不是坏事,我们应该以积极的心态来看待。当然,可能还有很多的确是跑着线上业务的。对于这部分实例,可能又可以分为两种:


一是,程序开发者搭建的。因为MongoDB对移动App开发者等程序员来说比较友好,使用JSON、模式自由、故障移动处理,所以很省事、上手很快,某些项目为了赶进度,或为了控制成本,团队中没有专门的数据库运维,直接让App开发搭个用于存储后端数据的MongoDB实例,于是,难免就出现在公网裸奔的MongoDB实例。对于这种情况,真不能怪App开发,人家本来就不是干这块的。MongoDB能够大大提高项目的开发效率,确实很好用,但团队中如果没有MongoDB运维能人,劝项目的负责人还是将MongoDB部署在专业的MongoDB云服务平台上或请MongoDB官方技术团队协助吧,但相比应该前一种更实惠,尤其是网易蜂巢MongoDB云服务。


二是,确实是团队专职的运维人员负责搭建的。对于这类,只能说:“把数据库暴露在公网实在是心太大…”。暴露在公网而且不设密码,这行为绝对是公害啊,被坑的项目负责人应该把他们一个个找出来判刑,并把名单全球公布,永久封杀。然后把MongoDB实例迁到蜂巢上。


最后总结下,对于数据存储这类安全性要求极高的服务,应该把部署和运维交给专业的团队,不能用“临时工”。欢迎大家使用网易蜂巢(云计算基础服务)MongoDB服务。




网易云免费体验馆,0成本体验20+款云产品! 

更多网易技术、产品、运营经验分享请点击





相关文章:
【推荐】 玩转可视化--来聊聊地图投影的学问
【推荐】 MySQL不带where条件的UPDATE和DELETE 限制操作说明
【推荐】 FUI-我离钢铁侠还差几步?

没有更多推荐了,返回首页