记一次MongoDB数据库数据泄漏及解决办法
问题出现
在默认情况下,mongodb是不需要验证就可以直接通过ip及端口连接到数据库,我在github的练手项目没有把我的服务器公网ip删掉,使得服务器的数据泄漏成为可能。
在下午我登陆我的服务器用mongo shell打开数据库时发现多了Warn的数据库,而我之前的测试数据数据库已经被删除。
然后我用可视化工具登陆我的mongo数据库发现Warn数据库插入了一条数据:
显而易见 是他备份了我的数据库然后 向我勒索比特币 ????
但是 这些数据一点都不值钱。
MongoDB服务安全加固
笔记摘录自阿里云 MongoDB服务安全加固
-
使用—bind_ip选项
该选项可以限制监听接口IP。当在启动MongoDB的时候,使用–bind_ip 192.168.0.1表示启动IP地址绑定,数据库实例将只监听192.168.0.1的请求。 -
启动基于角色的登录认证功能
在admin数据库中创建用户,如用户名supper,密码supWDxsf67%H(此处为举例说明,请勿使用此账号密码)。在未开启认证的环境下,登录到数据库。
[[email protected] bin]$ ./mongo 127.0.0.1:27028 (此处修改了默认端口) MongoDB shell version: 2.0.1 connecting to: 127.0.0.1:27028/test
切换到admin数据库。
> use admin switched to db admin >
创建管理员账号。
>db.addUser("supper", "supWDxsf67%H")或 >db.createUser({user:"supper",pwd:"supWDxsf67%H",roles:["root"]})
{ "n" : 0, "connectionId" : 4, "err" : null, "ok" : 1 } { "user" : "supper", "readOnly" : false, "pwd" : "51a481f72b8b8218df9fee50b3737c44", "_id" : ObjectId("4f2bc0d357a309043c6947a4") }
管理员账号将在system.users中。
> db.getCollectionNames() [ "system.indexes", "system.users", "system.version" ]
说明
MongoDB从V3版本开始取消使用addUser方法,采用db.createUser方法创建用 户。
账号不要设置为常见账号,密码需要满足一定的复杂度,长度至少八位以上,并 包括大小写字母、数字、特殊字符混合体,不要使用生日、姓名、身份证编号等常 见密码。
验证用户是否创建成功。> db.auth("supper","supWDxsf67%H") > exit bye
结束进程,重启MongoDB服务。
./mongod --dbpath=/path/mongodb --bind_ip=192.168.0.1 --port=27028 -- fork=true logpath=/path/mongod.log &
说明
admin.system.users中将会保存比在其它数据库中设置的用户权限更大的用户信息,拥有超级权限,也就是说在admin中创建的用户可以对mongodb中的其他数据库数据进行操作。
MongoDB系统中,数据库是由超级用户来创建的,一个数据库可以包含多个用户,一个用户只能在一个数据库下,不同数据库中的用户可以同名。
特定数据库(比如DB1)的用户User1,不能够访问其他数据库DB2,但是可以访问本数据库下其他用户创建的数据。
不同数据库中同名的用户不能够登录其他数据库,比如DB1、DB2都有user1,以user1登录DB1后,不能够登录到DB2进行数据库操作。
在admin数据库创建的用户具有超级权限,可以对mongodb系统内的任何数据库的数据对象进行操作。
使用db.auth()可以对数据库中的用户进行验证,如果验证成功则返回1,否则返回0。 db.auth()只能针对登录用户所属的数据库的用户信息进行验证,不能验证其他数据库的用户信息。
-
禁用HTTP和REST端口
MongoDB自身带有一个HTTP服务和并支持REST接口(在V2.6以后这些接口默认 是关闭的)。MongoDB默认使用默认端口监听Web服务,一般不需要通过Web方式进行远程管理,建议禁用。
修改配置文件或在启动的时候选择–nohttpinterface参数即可。nohttpinterface = false
- 开启日志审计功能。
审计功能可以用来记录用户对数据库的所有相关操作。这些记录可以让系统管理员在需要的时候分析数据库在什么时段发生了什么事情。