MongoDb用户权限控制

本文涉及的产品
云数据库 MongoDB,通用型 2核4GB
简介:

有朋友在评论里问到关于mongodbauth的问题,我找资料研究了一下,把操作过程记录了下来。

Mongodboracle一样,有着严格的用户、角色权限控制。具体可以参照官网文档:https://docs.mongodb.com/manual/reference/method/db.createUser/

Mongodb创建用户的语法在不用的版本之间还是不一样的。我这里使用的版本3.0.6。版本3.0之前使用的是db.addUser(),但3.0之后使用的是db.createUser()。3.0后版本中再使用db.addUser()会报如下错误:

1
2
> db.addUser( 'dba' , 'dba' )
2017-11-17T13:17:08.001+0800 E QUERY    TypeError: Property  'addUser'  of object admin is not a  function


如果数据库中还没有添加任何用户,要想新创建一个用户,要先把auth认证停掉,在进入数据库,也就是让auth=false。

1
2
3
4
5
6
7
8
9
10
11
[root@MidApp mongodb] # cat mongodb.conf#配置文件
dbpath= /data/db
logpath= /usr/local/mongodb/logs/mongodb .log
logappend= true
port=27000
fork= true
auth= false
nohttpinterface= false
bind_ip=192.168.221.161
journal= false
quiet= true


登入数据库,只能看到一个库,看不到admin库:

1
2
3
4
5
[root@MidApp mongodb] # mongo 192.168.221.161:27000 
MongoDB shell version: 3.0.6
connecting to: 192.168.221.161:27000 /test
> show dbs
local   0.078GB


现在需要创建一个帐号,该账号需要有grant权限,即:账号管理的授权权限。注意一点mongodb帐号是跟着库走的,所以在指定库里授权,必须也在指定库里验证(auth)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
> use admin
switched to db admin
> db.createUser({user: "dba" , pwd : "dba" ,roles:[{role: "userAdminAnyDatabase" ,db: "admin" }]})
Successfully added user: {
"user"  "dba" ,
"roles"  : [
{
"role"  "userAdminAnyDatabase" ,
"db"  "admin"
}
]
}
> db.system. users . find ()
"_id"  "admin.dba" "user"  "dba" "db"  "admin" "credentials"  : {  "SCRAM-SHA-1"  : {  "iterationCount"  : 10000,  "salt"  "MXvU7oJanxW7gPw+NwI7rw==" "storedKey"  "lTPmK31qbk1YKmx5stmYiphsQZE=" "serverKey"  "gVovcstiwC0nuU6LTXZAiWkucfA="  } },  "roles"  : [ {  "role"  "userAdminAnyDatabase" "db"  "admin"  } ] }
> db.system. users . find ().pretty()
{
"_id"  "admin.dba" ,
"user"  "dba" ,
"db"  "admin" ,
"credentials"  : {
"SCRAM-SHA-1"  : {
"iterationCount"  : 10000,
"salt"  "MXvU7oJanxW7gPw+NwI7rw==" ,
"storedKey"  "lTPmK31qbk1YKmx5stmYiphsQZE=" ,
"serverKey"  "gVovcstiwC0nuU6LTXZAiWkucfA="
}
},
"roles"  : [
{
"role"  "userAdminAnyDatabase" ,
"db"  "admin"
}
]
}


可以看到创建了一个用户dba,密码dba,拥有admin库的userAdminAnyDatabase角色。下面看一下mongodb中的内置角色:

   

1
2
3
4
5
6
7
8
     1. 数据库用户角色: read 、readWrite;
     2. 数据库管理角色:dbAdmin、dbOwner、userAdmin;
     3. 集群管理角色:clusterAdmin、clusterManager、clusterMonitor、hostManager;
     4. 备份恢复角色:backup、restore;
     5. 所有数据库角色:readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase
     6. 超级用户角色:root  
     //  这里还有几个角色间接或直接提供了系统超级用户的访问(dbOwner 、userAdmin、userAdminAnyDatabase)
     7. 内部角色:__system


看一下具体的角色定义:

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


我们打开auth参数,来验证一下。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[root@MidApp mongodb] # mongo 192.168.221.161:27000 
MongoDB shell version: 3.0.6
connecting to: 192.168.221.161:27000 /test
> show dbs #没有验证,不会有权限
2017-11-17T13:04:35.357-0800 E QUERY    Error: listDatabases failed:{
"ok"  : 0,
"errmsg"  "not authorized on admin to execute command { listDatabases: 1.0 }" ,
"code"  : 13
}
     at Error (<anonymous>)
     at Mongo.getDBs (src /mongo/shell/mongo .js:47:15)
     at shellHelper.show (src /mongo/shell/utils .js:630:33)
     at shellHelper (src /mongo/shell/utils .js:524:36)
     at (shellhelp2):1:1 at src /mongo/shell/mongo .js:47
> use admin #在admin库下面添加的账号,所以要切到admin下面认证
switched to db admin
> db.auth( 'dba' , 'dba' )
1
> show dbs
admin  0.078GB
local   0.078GB


可以看到,创建的dba用户已经验证成功。接下来我在创建两个用户,验证一下其他角色权限。创建一个只读用户,一个读写用户。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
> use  test ;
switched to db  test
> db.createUser({user: "zduser" , pwd : "zduser" ,roles:[{role: "read" ,db: "test" }]})
Successfully added user: {
"user"  "zduser" ,
"roles"  : [
{
"role"  "read" ,
"db"  "test"
}
]
}
> db.createUser({user: "dxuser" , pwd : "dxuser" ,roles:[{role: "readWrite" ,db: "test" }]})
Successfully added user: {
"user"  "dxuser" ,
"roles"  : [
{
"role"  "readWrite" ,
"db"  "test"
}
]
}
> show  users ;
{
"_id"  "test.zduser" ,
"user"  "zduser" ,
"db"  "test" ,
"roles"  : [
{
"role"  "read" ,
"db"  "test"
}
]
}
{
"_id"  "test.dxuser" ,
"user"  "dxuser" ,
"db"  "test" ,
"roles"  : [
{
"role"  "readWrite" ,
"db"  "test"
}
]
}
>


test库中创建一个集合,验证一下这两个用户权限:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
> show tables; #userAdminAnyDatabase权限只针对用户管理,没有其他的权限
2017-11-17T13:47:39.845-0800 E QUERY    Error: listCollections failed: {
"ok"  : 0,
"errmsg"  "not authorized on test to execute command { listCollections: 1.0 }" ,
"code"  : 13
}
     at Error (<anonymous>)
     at DB._getCollectionInfosCommand (src /mongo/shell/db .js:646:15)
     at DB.getCollectionInfos (src /mongo/shell/db .js:658:20)
     at DB.getCollectionNames (src /mongo/shell/db .js:669:17)
     at shellHelper.show (src /mongo/shell/utils .js:625:12)
     at shellHelper (src /mongo/shell/utils .js:524:36)
     at (shellhelp2):1:1 at src /mongo/shell/db .js:646
exit
bye
[root@MidApp mongodb] # mongo 192.168.221.161:27000 #重新登录一下
MongoDB shell version: 3.0.6
connecting to: 192.168.221.161:27000 /test
> use  test
switched to db  test
> db.tb1.insert({ "a" :1, "b" :2}) #先试着插入数据看看
WriteResult({
"writeError"  : {
"code"  : 13,
"errmsg"  "not authorized on test to execute command { insert: \"tb1\", documents: [ { _id: ObjectId('5a0f595b3b6523dcb81d4f76'), a: 1.0, b: 2.0 } ], ordered: true }"
}
})
> db.auth( 'dxuser' , 'dxuser' ) #用可读写的用户认证
1
> db.tb1.insert({ "a" :1, "b" :2}) #可以插入数据
WriteResult({  "nInserted"  : 1 })
> db.tb1.insert({ "a" :11, "b" :22})
WriteResult({  "nInserted"  : 1 })
> db.tb1.insert({ "a" :111, "b" :222})
WriteResult({  "nInserted"  : 1 })
> db.tb1. find ()
"_id"  : ObjectId( "5a0f597f3b6523dcb81d4f77" ),  "a"  : 1,  "b"  : 2 }
"_id"  : ObjectId( "5a0f59933b6523dcb81d4f78" ),  "a"  : 11,  "b"  : 22 }
"_id"  : ObjectId( "5a0f59983b6523dcb81d4f79" ),  "a"  : 111,  "b"  : 222 }
> db.auth( 'zduser' , 'zduser' ) #切换只读用户
1
> db.tb1.insert({ "a" :1111, "b" :2222}) #没有权限插入数据
WriteResult({
"writeError"  : {
"code"  : 13,
"errmsg"  "not authorized on test to execute command { insert: \"tb1\", documents: [ { _id: ObjectId('5a0f59c63b6523dcb81d4f7a'), a: 1111.0, b: 2222.0 } ], ordered: true }"
}
})
> db.tb1. find () #可以查看数据
"_id"  : ObjectId( "5a0f597f3b6523dcb81d4f77" ),  "a"  : 1,  "b"  : 2 }
"_id"  : ObjectId( "5a0f59933b6523dcb81d4f78" ),  "a"  : 11,  "b"  : 22 }
"_id"  : ObjectId( "5a0f59983b6523dcb81d4f79" ),  "a"  : 111,  "b"  : 222 }
>


注意:Mongodb用户是跟着数据库密切相关的,在哪个库授权的用户就需要去哪个库下面进行认证

 


本文转自 青苗飞扬 51CTO博客,原文链接:http://blog.51cto.com/qingmiao/1982794


相关实践学习
MongoDB数据库入门
MongoDB数据库入门实验。
快速掌握 MongoDB 数据库
本课程主要讲解MongoDB数据库的基本知识,包括MongoDB数据库的安装、配置、服务的启动、数据的CRUD操作函数使用、MongoDB索引的使用(唯一索引、地理索引、过期索引、全文索引等)、MapReduce操作实现、用户管理、Java对MongoDB的操作支持(基于2.x驱动与3.x驱动的完全讲解)。 通过学习此课程,读者将具备MongoDB数据库的开发能力,并且能够使用MongoDB进行项目开发。 &nbsp; 相关的阿里云产品:云数据库 MongoDB版 云数据库MongoDB版支持ReplicaSet和Sharding两种部署架构,具备安全审计,时间点备份等多项企业能力。在互联网、物联网、游戏、金融等领域被广泛采用。 云数据库MongoDB版(ApsaraDB for MongoDB)完全兼容MongoDB协议,基于飞天分布式系统和高可靠存储引擎,提供多节点高可用架构、弹性扩容、容灾、备份回滚、性能优化等解决方案。 产品详情: https://www.aliyun.com/product/mongodb
相关文章
|
10月前
|
NoSQL MongoDB 数据库
mongodb用户权限管理
用户权限管理简要说明
631 0
|
NoSQL 安全 MongoDB
高可用mongodb集群(分片+副本):用户权限配置
高可用mongodb集群(分片+副本):用户权限配置
374 0
|
NoSQL 数据库 索引
Mongodb数据库创建数据库并赋予不同的用户权限
mongo admin -u root -p 登录数据库               use testdb  #如过数据库不存在则创建        db.createUser({ user: "11", pwd: "11", roles: [{ role: "dbOwner", db: "testdb" }] })        rote:dbOwner 代表数据库所有者角色,拥有最高该数据库最高权限。
1494 0
|
NoSQL 测试技术 Shell
|
NoSQL Shell 数据库
mongodb 3.2 用户权限管理配置
使用mongodb 有段时间了,由于是在内网使用,便没有设置权限,一直是裸奔。 最近有时间,研究了下mongodb 3.2 的用户权限配置,网上有许多用户权限配置的文章,不过大多是之前版本,有些出入,特记录备查。
910 0
|
1月前
|
存储 NoSQL MongoDB
MongoDB如何创建数据库
MongoDB如何创建数据库
|
2天前
|
存储 NoSQL 关系型数据库
【MongoDB 专栏】MongoDB 与传统关系型数据库的比较
【5月更文挑战第10天】本文对比了MongoDB与传统关系型数据库在数据模型、存储结构、扩展性、性能、事务支持、数据一致性和适用场景等方面的差异。MongoDB以其灵活的文档模型、优秀的扩展性和高性能在处理非结构化数据和高并发场景中脱颖而出,而关系型数据库则在事务处理和强一致性上更具优势。两者各有适用场景,选择应根据实际需求来定。随着技术发展,两者正相互融合,共同构建更丰富的数据库生态。
【MongoDB 专栏】MongoDB 与传统关系型数据库的比较