MongoDB 安全事件的防范与反思

社区编辑2018-05-18 12:55


作为旨在为用户提供最优 MongoDB云服务的网易云基础服务团队在第一时间追踪了相关报道并做出自检反应。
 
网易云基础服务 MongoDB服务从设计之初就将数据的安全性列为第一位,但本着高度负责的态度网易云基础服务在获取信息后还是立马对自己的 MongoDB服务进行了安全自检,果然且显然,网易云基础服务没让大家失望。
 
这次事件从技术层面看并没有什么高深之处,应对措施也非常简洁方便,下面结合网易云基础服务 MongoDB来进行解析。
 
首先,不要把 MongoDB实例直接暴露在公网下,这是原则问题。可以说云服务商没有任何理由将用户的数据存储服务部署在公网环境。
 
网易云基础服务用户的 MongoDB实例都部署在私有网络中,跟公网相隔离。通过这个措施,可以抵挡掉绝大部分攻击和伤害。进一步来讲,MongoDB实例所在的私网是用户专用的,也就是说,该私网对网易云基础服务中的其他用户也是隔离的,这就又消除了被同一云平台下其他用户攻击的可能。
 
其次,为 MongoDB实例开启认证并设置访问账号,这也是最基本的。启动认证后,访问者若不指定正确的账号和密码就无法正常访问 MongoDB实例。密码应该设置成字母、数字和特殊符号的组合,这样可极大增强被破解的难度。显然,包括网易云基础服务 MongoDB在内的主流 MongoDB云服务都开启了认证。
 
可以说,做到上述几点,基本上可以保证用户的 MongoDB数据是安全的。但还可以做得更好。
 

1.做好账号权限控制

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

2.将 MongoDB端口设置为非默认端口

 
大家都知道27017端口是 MongoDB的,3306端口是 MySQL的,暴露在公网的 MongoDB实例,如果使用默认端口,别有用心的黑客 telnet下就连上了。而如果你选择其他端口,虽无法从根本上解决问题,但至少加了层防护,所以也可以考虑。
 
在网易云基础服务平台,用户在创建网易云基础服务 MongoDB实例时可以指定端口。除了这层防护,网易云基础服务还提供了平台级的安全保证。网易内部有专门的安全部门负责扫描和识别安全隐患,一旦发现会立即通知相应的产品负责人在第一时间解决问题,排除隐患。
 v

3.有备份可以用来恢复数据

 
如果因为上述防护没有做到位等原因,用户的 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实例迁到网易云基础服务上。
 
最后总结下,对于数据存储这类安全性要求极高的服务,应该把部署和运维交给专业的团队,不能用“临时工”。欢迎大家使用网易云基础服务MongoDB服务。