Mongodb安全配置
1、Mongodb简介
MongoDB是一种文件导向数据库管理系统,由C++撰写而成,以此来解决应用程序开发社区中的大量现实问题。2007年10月,MongoDB由10gen团队所发展。2009年2月首度推出。 Mongo DB ,是目前在IT行业非常流行的一种非关系型数据库(NoSql),其灵活的数据存储方式,备受当前IT从业人员的青睐。Mongo DB很好的实现了面向对象的思想(OO思想),在Mongo DB中 每一条记录都是一个Document对象。Mongo DB最大的优势在于所有的数据持久操作都无需开发人员手动编写SQL语句,直接调用方法就可以轻松的实现CRUD操作。 NoSQL数据库与传统的关系型数据库相比,它具有操作简单、完全免费、源码公开、随时下载等特点,并可以用于各种商业目的。这使NoSQL产品广泛应用于各种大型门户网站和专业网站,大大降低了运营成本。
2、Mongodb服务器架设
Mongodb安装:
Mongodb的安装、启动请参看:Install MongoDB
添加用户:
use admin #进入admin数据库 db.createUser( { user: "root", pwd: "test", roles: [ { role: "userAdminAnyDatabase", db: "admin" } ] } ) #添加用户名root,密码test的用户,若数据库未创建则会自动创建
3、错误配置及利用
MongoDB安装时不添加任何参数,默认是不开启权限验证的,登录的用户可以对数据库任意操作而且可以远程访问数据库。
在刚安装完毕的时候MongoDB都默认有一个admin数据库,此时admin数据库是空的,没有记录权限相关的信息。当admin.system.users一个用户都没有时,即使开启了权限验证,如果没有在admin数据库中添加用户,此时不进行任何认证还是可以做任何操作,直到在admin.system.users中添加了一个用户。
没有权限验证的MongoDB可被Mongodb管理工具(如:MongoVUE)远程匿名连接及进行数据库操作。
MongoDB的web界面存在漏洞,导致开启了web界面的MongoDB容易受到攻击,详见Attacking MongoDB
4、实际案例
5、修复方案
添加用户认证
MongoDB 3.0以上的版本较以往版本做了一些调整,如:
- 在安装完成后show dbs时只可以看到一个local数据库,而admin是不存在的,需要我们自己创建;
- db.addUser(…)方法不再使用,添加用户需要使用db.createUser(…)方法等。
在3.0以上版本:
use admin #进入admin数据库 db.createUser( { user: "root", pwd: "test", roles: [ { role: "userAdminAnyDatabase", db: "admin" } ] } ) #添加用户名root,密码test的用户,若数据库未创建则会自动创建
注意:roles 中的 db 参数是必须的,不然会报错:
Error: couldn’t add user: Missing expected field “db”。
这时我们就可以通过show users
或db.system.users.find()
命令看到刚才创建的用户了;
然后添加–auth
参数(开启用户权限)重启MongoDB;
use admin #进入admin数据库 db.auth("root","test") #认证,成功返回1
注意:这里的root帐号只有用户管理权限!
因为帐号、密码是跟着数据库走的,所以我们需要为数据库设置账号密码,例如下面是给test数据库添加了一个有读写权限的账号为:
use test #进入test数据库 db.createUser( { user: "test", pwd: "123456", roles: [ { role: "readWrite", db: "test" } ] } ) #添加用户名test,密码123456的帐号,若数据库未创建则会自动创建
限制连接IP
在启动时可以通过添加–bind_ip参数来绑定IP,如进行下面的绑定后则只能够从本机访问:
./mongod --bind_ip 127.0.0.1
6、漏洞扫描与发现
半手动扫描
使用nmap扫描Mongodb默认的服务端口(27017)或者默认的web端口(28017):
nmap -n --open -p 27017 X.X.X.X/24
找到开放27017端口的主机后使用Mongodb管理工具(如:MongoVUE)进行连接。