MongoDB version: v3.4.4
MongoDB默认是不开启权限认证的,而我也是一直这么做的。自从上次MongoDB爆发了赎金门事件,必须重视下MongoDB的权限认证了。
开启认证也很简单,在配置文件(默认是/etc/mongodb.conf)里面加入auth = true这样一行就行了。
这时你重启MongoDB服务进入mongo shell都是没问题的。但是如果你想插入一条数据,那么问题来了:
use foo;
db.bar.insert({'faf': 'faf'})
WriteResult({
"writeError" : {
"code" : 13,
"errmsg" : "not authorized on foo to execute command { insert: \"bar\", documents: [ { _id: ObjectId('5938e7f63be90aa05e12aecc'), faf: \"faf\" } ], ordered: true }"
}
})
说明权限认证生效了,一个没有认证通过的用户再也不能使用数据库了(即使能进mongo shell)。
那么问题又来了,我现在没有用户咋办?这是一个鸡和蛋的问题。怎么在没有用户的情况下新建用户?
MongoDB的开发者早已经想到了这一步。MongoDB自带一个数据库叫admin,这个数据库用来管理所有数据库的,类似于MySQL的mysql数据库。如果这个数据库的管理员账户还没有建立,那么任何人都可以在admin数据库里面新建管理员账户。
use admin;
db.createUser({user: 'admin', pwd: 'adminer', roles: [{role: 'userAdminAnyDatabase', db: 'admin'}]})
先进入admin数据库,然后运行db.createUser方法新建用户。createUser方法必须传入一个有user(用户名)、pwd(密码),roles(角色)三个属性的JSON对象。user、pwd都可以理解,那这个角色又是啥?当我们尝试去管理一个数据库的时候发现,有很多权限需要处理,比如:数据库读、数据库写、数据库用户管理等等权限,我想建一个用户的话,给一个用户赋权限就十分复杂了。现在一种流行的方式是:我先定义一个角色,这个角色对应一组权限,那么我管理用户时就只要赋予一个角色就行了。真是方便了不少。那么这个userAdminAnyDatabase角色就是这样一个超级角色,有这个角色的用户可以给任意数据库新建用户,并且赋予任何角色,真是个狠角色。那么我们应该知道了,基本上所有的第一个建立的用户的角色都应该是userAdminAnyDatabase,好处就是以后可以用这个用户来管理其他用户了。
那么MongoDB内置了哪些角色呢?按照类别来分主要有:
Database User Roles
Database Administration Roles
Cluster Administration Roles
Backup and Restoration Roles
All-Database Roles
Superuser Roles
Internal Role
十分复杂,为了简单起见,就讲其中两个:read、readWrite也就是常用的读数据库和读写数据库。
建立了admin用户之后,还必须登录才行(必须在admin数据库才能登录),db.auth(‘admin’, ‘adminer’),我再切换到foo数据库就可以给foo数据库创建用户啦(这里有一个不大不小的坑,就是你要给其他数据库创建用户,都必须先到admin数据库,认证刚才新建的那个admin用户,然后再切换到其他数据库才能建立用户)!
use foo;
db.createUser({user: 'foo', pwd: 'bar', roles: [{role: 'readWrite', db: 'foo'}]})
db.auth('foo', 'bar')
就可以往数据库里面写入啦!!!
原文链接:生信人