MongoDB黑客事件浅析

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wl812peter/article/details/56841989

MongoDB黑客事件浅析

前几个月发生了一件大事,真是惊为天人啊,多个公司的mongoDB被黑了,黑客删除了数据库中的数据并在数据库中留下勒索信息索要比特币,说是给了钱才肯恢复数据,据说所有被删的数据居然超过了100TB,数据库的安全问题不容忽视啊。


个人感觉如果这件事如果发生了,不要盲目地直接去打钱给黑客,他说给钱就还原就真还原啊!!!别再次被坑了,先尝试使用其他手段尝试进行数据恢复,如备份等手段。

防范措施

mongodb其实没有那么不安全,主要是使用者的安全意识薄弱,没有去详细了解mongodb的官方的安全文档

措施1:

现在大部分mongodb都处于裸奔状态,很多mongodb都没有开启用户认证功能,部分项目的mongo配置都是auth=false的状态,也就是说完全不用用户名和密码就可以进入数据库。应该先设置root权限用户,再把重新配置mongodb的配置文件把auth=true附上,重启mongo,再设置其他用户。mongodb其实有一套详细的角色权限控制系统。在Mongodb中其实有两个结合,分别是User(用户信息)、Role(权限)两个集合,在mongo shell中通过对这两个集合操作可以实现十分精细的权限操作:

db.createUser({
    "user": "用户名",
    "pwd": "密码",
    "roles": [
        {"role": "角色", "db": "所能操作的数据库名"}
    ]
});

Built-In Roles(内置角色):

角色分类 角色名
数据库用户角色 read、readWrite
数据库管理角色 dbAdmin、dbOwner、userAdmin
集群管理角色 clusterAdmin、clusterManager、clusterMonitor、hostManager
备份恢复角色 backup、restore
所有数据库角色 readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase
超级用户角色 root
内部角色 __system

Role(详细角色):

角色名 详细解释
Read 允许用户读取指定数据库
readWrite 允许用户读写指定数据库
dbAdmin 允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile
userAdmin 允许用户向system.users集合写入,可以找指定数据库里创建、删除和管理用户
clusterAdmin 只在admin数据库中可用,赋予用户所有分片和复制集相关函数的管理权限。
readAnyDatabase 只在admin数据库中可用,赋予用户所有数据库的读权限
readWriteAnyDatabase 只在admin数据库中可用,赋予用户所有数据库的读写权限
userAdminAnyDatabase 只在admin数据库中可用,赋予用户所有数据库的userAdmin权限
dbAdminAnyDatabase 只在admin数据库中可用,赋予用户所有数据库的dbAdmin权限。
root 只在admin数据库中可用。超级账号,超级权限

Demo:

// 管理员
db.createUser({
    "user": "root",
    "pwd": "123123",
    "roles": [
        {"role": "root", "db": "admin"}
    ]
});

// food数据库的只读用户
db.createUser({
    "user": "aabc",
    "pwd": "123123",
    "roles": [
        {"role": "read", "db": "food"}
    ]
});

也可以去通过操作Role集合去自定义一些新的角色,来达到更灵活的控制:

db.createRole({
    role: "角色名",
    privileges: [
        { resource: { cluster: "是否为集群true/false" }, actions:["集群操作,如addShard", ... ] },
        { resource: { db:"数据库名", collection:"集合名(表名)"}, actions:["表的操作,如find", ... ] },
        ...
    ],
    roles: [
        { role: "内置角色名或其他自定义角色", db: "所能操作的数据库名" },
        ...
    ]
});

措施2:

部分mongodb没有限制访问IP,并且直接暴露在公网上,而且也没修改mongodb的启动端口,默认端口是27017,导致更容易被发现和攻击,部分黑客都是通过一些特殊的搜索引擎(如大名鼎鼎的Shodan)来发现这些未做鉴权并且暴露在公网上的mongodb。其实可以通过配置文件使用bind_ip来限制访问来源,以及port来改变端口来降低风险。
同时mongodb默认具有http相关接口,可以通过http的方式查看mongodb相关的信息,并且可以通过一些Rest API进行相关操作,所以通过在配置中修改jsonp、rest、httpinterface为false已达到关闭http接口的目的,来保证安全。

措施3:

Mongodb的版本也是个问题,3.0版本以下的使用的是MongoDB-CR的鉴权协议,该机制简单且安全性不高。强烈建议升级到3.0以上,3.0版本以上使用的是SCRAM-SHA-1鉴权机制,该机制能同时验证客户端及服务端的身份,安全性较高,能大大提高mongodb的安全性。

措施4:

对数据要做好容灾,定期性对数据做备份,并且对部分敏感重要数据做一定的加密。这样即使受到了攻击,也能做到数据即时恢复。

世界和平,耶!!!

展开阅读全文

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