believe0slwx 2020-04-20
写这篇博客的起因是在阿里云上用Docker部署了一个MongoDB数据库,用来存毕设网站用到的数据库。因为数据量比较小,并且没有隐私数据,所以并没有设置密码。没想到被黑了,有人把所有的数据Copy走后把所有库都删除了,并且留下了一封勒索0.0015BTC的文档。
为了防止此类事件再次发生,我们要对MongoDB进行加锁,换端口等一系列措施。这里记录了我是怎么做的。
采用最新的MongoDB:latest镜像。
不把MongoDB服务映射到默认的27017端口上,因为这样很容易被黑客扫描的时候检测出来。直接在部署Docker的时候把容器内部27017映射到其他关口上。
最后在防火墙平台上开放这条映射规则,关闭原来的27017端口映射规则。
建立Docker时用如下命令:
sudo docker run -it mongoDB:latest --name="MongoDB" mongod --auth
最后加--auth这个参数。这样登录时需要用户名和密码。
在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数据库中可用。超级账号,超级权限