Mongodb安全性初探

http://www.phpweblog.net/GaRY/archive/2011/08/18/Mongodb_secuirty_anaylze.html
Author: wofeiwo
Date: 2011-08-18

Mongodb,这么火的玩意其实早就想好好研究一下了。之前一直没空仔细学学新的东西,总是感觉精力不足。这次趁着买了一本书,就零零散散地在VPS上搭建、测试、看实现代码。感觉也蛮有意思的一个数据库。虽然感觉它非常简单,尤其是看代码的时候更是感觉如此。但这不也是另一个KISS的典范么,还是简单但是实用的东西最能流行。
既然都看了其实现,也不能不产出点什么。正好多年没更新博文,就简单分析一下mongodb的安全性,凑个数先。

默认配置的安全情况


在默认情况下,mongod是监听在0.0.0.0之上的。而任何客户端都可以直接连接27017,且没有认证。好处是,开发人员或dba可以即时上手,不用担心被一堆配置弄的心烦意乱。坏处是,显而易见,如果你直接在公网服务器上如此搭建mongodb,那么所有人都可以直接访问并修改你的数据库数据了。
默认情况下,mongod也是没有管理员账户的。因此除非你在admin数据库中使用db.addUser()命令添加了管理员帐号,且使用--auth参数启动mongod,否则在数据库中任何人都可以无需认证执行所有命令。包括delete和shutdown。
此外,mongod还会默认监听28017端口,同样是绑定所有ip。这是 一个mongod自带的web监控界面。从中可以获取到数据库当前连接、log、状态、运行系统等信息。如果你开启了--rest参数,甚至可以直接通过web界面查询数据,执行mongod命令。
我试着花了一个晚上扫描了国内一个B段,国外一个B段。结果是国外开了78个mongodb,而国内有60台。其中我随意挑选了10台尝试连接,而只有一台机器加了管理员账户做了认证,其他则全都是不设防的城市。可见其问题还是比较严重的。
其实Mongodb本身有非常 详细的安全配置准则,显然他也是想到了,然而他是将安全的任务推给用户去解决,这本身的策略就是偏向易用性的,对于安全性,则得靠边站了。

用户信息保存及认证过程


类似MySQL将系统用户信息保存在mysql.user表。mongodb也将系统用户的username、pwd保存在admin.system.users集合中。其中 pwd = md5(username + ":mongo:" + real_password)。这本身并没有什么问题。username和:mongo:相当于对原密码加了一个salt值,即使攻击者获取了数据库中保存的md5 hash,也没法简单的从彩虹表中查出原始密码。
我们再来看看mongodb对客户端的认证交互是如何实现的。mongo client和server交互都是基于明文的,因此很容易被网络嗅探等方式抓取。这里我们使用数据库自带的 mongosniff,可以直接dump出客户端和服务端的所有交互数据包:

你可能感兴趣的:(Mongodb安全性初探)