Docker部署的MongoDB的用户鉴权问题
写这篇博客的起因是在阿里云上用Docker部署了一个MongoDB数据库,用来存毕设网站用到的数据库。因为数据量比较小,并且没有隐私数据,所以并没有设置密码。没想到被黑了,有人把所有的数据Copy走后把所有库都删除了,并且留下了一封勒索0.0015BTC的文档。
为了防止此类事件再次发生,我们要对MongoDB进行加锁,换端口等一系列措施。这里记录了我是怎么做的。
MongoDB镜像
采用最新的MongoDB:latest镜像。
换端口
不把MongoDB服务映射到默认的27017端口上,因为这样很容易被黑客扫描的时候检测出来。直接在部署Docker的时候把容器内部27017映射到其他关口上。
最后在防火墙平台上开放这条映射规则,关闭原来的27017端口映射规则。
启动Docker
建立Docker时用如下命令:
sudo docker run -it mongoDB:latest --name="MongoDB" mongod --auth
最后加--auth这个参数。这样登录时需要用户名和密码。
设置admin库
在docker中运行mongo,接入数据库,然后use admin,进入admin库,为admin库增加一个admin用户:
db.createUser({user: 'admin', pwd: 'password', roles: ['userAdminAnyDatabase']})
然后可以使用数据库的图形界面,用admin账号登录数据库,然后创建角色并赋予权限。
角色与权限
可以为每一个数据库都设置角色和权限。
-
Read:允许用户读取指定数据库(不可进行任何更改,只能查看)
-
readWrite:允许用户读写指定数据库(任何操作,包括删有权限db中的col权限)
-
dbAdmin:允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile
-
userAdmin:允许用户向system.users集合写入,可以找指定数据库里创建、删除和管理用户
-
clusterAdmin:只在admin数据库中可用,赋予用户所有分片和复制集相关函数的管理权限。
-
readAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读权限
-
readWriteAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读写权限
-
userAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的userAdmin权限
-
dbAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的dbAdmin权限。
-
root:只在admin数据库中可用。超级账号,超级权限