Mongodb如何开启用户访问控制详解
前言
Mongodb数据库默认情况下是没有访问控制的,整个数据库对外是开发的,只要能连上数据库,则可以进行任何操作,这会对数据带来很大的风险。当然,我们可以启用mongodb的访问控制,只让通过认证的用户才能对数据库进行角色范围内的操作。
启用访问控制可以通过在启动mongodb时指定--auth参数来设置,另外还涉及到创建用户db.createUser操作以及一些角色的定义,我们先来看这部分内容。
db.createUser()用法
db.createUser({
user:"$USERNAME",
pwd:"$PASSWROD",
roles:[
{role:"$ROLE_NAME",db:"$DBNAME"}
]
})
参数说明:
- user是用户名
- pwd是密码
- role来指定用户的角色
- db来指定所属的数据库
- roles是用户所有角色的集合
Mongodb预定义角色
Mongodb中预定义了一些角色,把这些角色赋予给适当的用户上,用户就只能进行角色范围内的操作。
1、数据库用户角色(所有数据库都有)
- read用户可以读取当前数据库的数据
- readWrite用户可以读写当前数据库的数据
2、数据库管理角色(所有数据库都有)
- dbAdmin管理员用户但不能对用户和角色管理授权
- dbOwner数据库所有者可进行任何管理任务
- userAdmin可以管理当前数据的用户和角色
3、集群管理角色(admin数据库可用)
- clusterAdmin集群所有管理权限,是clusterManager,clusterMonitor,hostManager合集
- clusterManager集群管理和监控
- clusterMonitor集群监控,只读的
- hostManager监控和管理服务器
4、备份和恢复角色(admin数据库可用)
- backup
- restore
5、所有数据库角色(admin数据库可用)
- readAnyDatabase读取所有数据库
- readWriteAnyDatabase读写所有数据库
- userAdminAnyDatabase所有数据库的userAdmin权限
- dbAdminAnyDatabase所有数据库的dbAdmin权限
6、超级角色(admin数据库可用)
- root超级用户
7、内部角色
- __system所有操作权限
更多预定于角色的信息请参看:https://docs.mongodb.com/manual/core/security-built-in-roles/
启用访问控制的步骤
1,启动mongodb实例,关闭访问控制
不带--auth
./mongod
2,连接上mongodb实例
./mongo
3,创建用户管理员
在admin数据库中添加一个具有userAdminAnyDatabase角色的用户作为用户管理用户。下面的例子中创建了admin为用户管理员。
>useadmin
switchedtodbadmin
>db.createUser({
...user:"admin",
...pwd:"admin",
...roles:[
...{role:"userAdminAnyDatabase",db:"admin"}
...]
...})
Successfullyaddeduser:{
"user":"admin",
"roles":[
{
"role":"userAdminAnyDatabase",
"db":"admin"
}
]
}
>
退出连接
4,重启数据库启用访问控制
命令行启动,只需要添加--auth参数
./mongo--auth
5,使用管理用户连接,有两种方法
- 使用命令行./mongo-u"$USERNAME"-p"$PASSWROD"--authenticationDatabase"admin"
- 使用db.auth()
我们使用第二种
>
>useadmin
switchedtodbadmin
>db.auth("admin","admin")
1
>
1表示认证成功
6,为某个数据库创建独立用户
以下为test数据库创建具有读写权限的用户test
admin用户由于只有userAdminAnyDatabase权限,所以没有test数据的读写权限,所以,为了读写test数据库,我们需要创建一个用户。先看一下直接用admin会报什么错误
>usetest
>showcollections
2017-01-13T13:49:17.691+0800EQUERY[thread1]Error:listCollectionsfailed:{
"ok":0,
"errmsg":"notauthorizedontesttoexecutecommand{listCollections:1.0,filter:{}}",
"code":13
}:
_getErrorWithCode@src/mongo/shell/utils.js:25:13
DB.prototype._getCollectionInfosCommand@src/mongo/shell/db.js:773:1
DB.prototype.getCollectionInfos@src/mongo/shell/db.js:785:19
DB.prototype.getCollectionNames@src/mongo/shell/db.js:796:16
shellHelper.show@src/mongo/shell/utils.js:754:9
shellHelper@src/mongo/shell/utils.js:651:15
@(shellhelp2):1:1
我们直接使用showcollections,则报错:notauthorizedontesttoexecutecommand,意思是没有权限。
>usetest
switchedtodbtest
>db.createUser({
...user:"test",
...pwd:"test",
...roles:[
...{role:"readWrite",db:"test"}
...]
...})
Successfullyaddeduser:{
"user":"test",
"roles":[
{
"role":"readWrite",
"db":"test"
}
]
}
>
然后我们使用db.auth(“test”,“test”),再执行命令则没有报错
>db.auth("test","test")
1
>
>showcollections
试着写入一条数据,也是正常的。
>db.t.insert({name:"buzheng"});
WriteResult({"nInserted":1})
>db.t.find();
{"_id":ObjectId("58786c84bf5dd606ddfe1144"),"name":"buzheng"}
>
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。