MongoDB用户与角色管理

 

(一)用户管理
(1)建立用户
1.要添加用户,MongoDB提供了db.createUser()方法。添加用户时,能够为用户分配角色,授予权限。
2.在数据库中建立的第一个用户应该具备管理其余用户的权限。
3.添加用户时,能够在特定的数据库中建立该用户,该数据库是用户的身份验证数据库。用户能够在不一样的数据库之间拥有特权,也就是说,用户的权限不限于其身份验证数据库,经过分配其余数据库中的角色,在一个数据库中建立的用户能够对其它数据库执行操做。
4.用户名和身份验证数据库用做该用户的惟一标识,也就是说,若是两个用户具备相同的名称,可是在不一样的数据库中建立,则他们是2个不一样的用户,若是打算让一个用户对多个数据库拥有操做权限,请在适当的数据库中建立一个具备角色的单个用户,而不是在不一样的数据库中屡次建立该用户。数据库

例子1:在lijiamandb数据库中,建立用户lijiaman,对该库具备读写权限。服务器

use lijiamandb

db.createUser(
{
user:"lijiaman",
pwd:passwordPrompt(),
roles:[{role:"readWrite",db:"lijiamandb"}]
}
)

 

例子2:在reportdb数据库中,建立用户report,对reportdb数据库具备读写权限,对lijiamandb具备读的权限。app

use reportdb

db.createUser(
{
user:"report",
pwd:passwordPrompt(),
roles:[
{role:"readWrite",db:"reportdb"},
{role:"read",db:"lijiamandb"}
]
}
)

 

(2)删除用户ide

db.dropUser("user_name")

 

(3)修改用户密码
例如,把lijiamandb数据库中的user1用户的密码改成123456。工具

use lijiamandb
db.changeUserPassword("user1", "123456")

 

(二)认证机制
从MongoDB4.0版本开始,MongoDB删除了MONGODB-CR认证方式,MongoDB支持以下认证方式:
--SCRAM(默认方式)
--x.509spa

 

(三)基于角色的访问控制
1.MongoDB使用基于角色访问控制(Role-Based Access Control,RBAC)来管理对MongoDB系统的访问,授予用户一个或者多个角色,来决定用户对数据库资源的访问以及操做权限。
MongoDB默认不启用访问控制,管理员能够再启动中使用--auth或者配置文件中使用security.authorization参数来启用访问控制。
2.角色被授予权限,从而对资源执行指定的操做。
权限由指定的资源和对该资源容许的操做组成,一个资源能够是一个数据库、集合、或者是集群。若是资源师集群,则相关操做会影响系统状态。rest

 

(四)数据库内置角色
MongoDB在每个数据库上提供内置的Database User Roles和Database Administration Roles,仅仅对admin数据库提供全部内置角色。
(4.1)Database User Roles
(4.1.1)read
读取全部非系统集合和system.js的功能。code

该角色包含如下操做:
changeStream
collStats
dbHash
dbStats
find
killCursors
listIndexes
listCollectionsblog


(4.1.2)readWrite
在read角色的基础上,增长了对全部非系统集合和system.js集合的修改功能索引

该角色包含如下操做:
collStats
convertToCapped
createCollection
dbHash
dbStats
dropCollection
createIndex
dropIndex
find
insert
killCursors
listIndexes
listCollections
remove
renameCollectionSameDB
update

 

(4.2)Database Administration Roles
(4.2.1)dbAdmin
提供执行管理任务的能力,例如与schema相关的任务,索引和统计信息收集。该角色没有用户和角色管理的权限。


(4.2.2)dbOwner
数据库全部者能够对数据库执行任何操做,该角色由readWrite,dbAdmin,userAdmin角色组合受权。


(4.2.3)userAdmin
提供在当前数据库上建立和修改角色和用户的功能,因为该角色容许用户向任何用户(包括本身)授予任何特权,该角色间接提供了超级用户的权限(后面理解不了,附原文)。
原文:Provides the ability to create and modify roles and users on the current database. Since the userAdmin role allows users to grant any privilege to any user, including themselves, the role also indirectly provides superuser access to either the database or, if scoped to the admin database, the cluster.


(4.3)Cluster Administration Roles
仅仅能够对建立在admin数据库中的用户授予集群管理角色。

(4.3.1)clusterAdmin
最大的集群管理权限,该角色包含clusterManager、clusterMonitor、hostManager角色,此外,还提供了dropDatabase操做权限。

 

(4.3.2)clusterManager
提供对集群的管理和监视操做,具备此角色的用户能够访问config和local数据库,分别用于分片和复制。

 

(4.3.3)clusterMonitor
提供对集群监视的只读访问。

 

(4.3.4)hostManager
提供监视和管理服务器的功能。


(4.4)Backup and Restoration Roles
仅仅能够对建立在admin数据库中的用户授予备份与恢复角色。

(4.4.1)backup
提供了最小的使用MongoDB Cloud Manager,Ops Manager,mongodump工具有份数据库的权限。

 

(4.4.2)restore
提供了使用mongorestore恢复数据的权限。


(4.5)All-Database Roles
仅仅能够对建立在admin数据库中的用户授予对所有数据库操做的角色。

(4.5.1)readAnyDatabase

除了local和config数据库,提供了对其它全部数据库只读(read)的权限。

 

(4.5.2)readWriteDatabase
除了local和config数据库,提供了对其它全部数据库读写(readWrite)的权限。

 

(4.5.3)userAdminAnyDatabase
除了local和config数据库,提供了对其它全部数据库userAdmin角色的权限。

 

(4.5.4)dbAdminAnyDatabase
除了local和config数据库,提供了对其它全部数据库dbAdmin角色的权限。


(4.6)Superuser Roles
如下角色具备授予任意数据库中任意用户任意权限的能力,这意味着具备如下角色的用户能够授予本身任何权限。
-- 在admin数据库中,具备dbOwner角色的用户
-- 在admin数据库中,具备userAdmin角色的用户
-- 具备userAdminAnyDatabase角色的用户

(4.6.1)root
root角色包含了如下角色:
readWriteAnyDatabase
dbAdminAnyDatabase
userAdminAnyDatabase
clusterAdmin
restore
backup

 

(4.7)Internal Role
(4.7.1)__system
MongoDB将该角色分配给集群成员,例如副本集成员和mongos实例。授予该角色的用户可以对任意数据库进行任意操做,不要将此角色授予给应用程序用户。


(五)角色查看、授予、撤销
(5.1)前提条件
若是要受权角色给其它用户,必需要有grantRole权限;
若是要回收角色,必需要有revokeRole权限;
若是查看角色信息,必需要有viewRole权限。


(5.2)查看用户
(5.2.1)可使用db.getUsers()查看某个数据库中的全部用户

use lijiamandb

rstest:PRIMARY> db.getUsers()
[
{
"_id" : "lijiamandb.lijiaman",
"userId" : UUID("3372dc4f-6c83-43fd-8693-a0845e43c16a"),
"user" : "lijiaman",
"db" : "lijiamandb",
"roles" : [
{
"role" : "readWrite",
"db" : "lijiamandb"
}
],
"mechanisms" : [
"SCRAM-SHA-1",
"SCRAM-SHA-256"
]
},
{
"_id" : "lijiamandb.user1",
"userId" : UUID("95fd5c9a-82d5-48dc-8cdc-0fea31e77d13"),
"user" : "user1",
"db" : "lijiamandb",
"roles" : [
{
"role" : "readWrite",
"db" : "lijiamandb"
}
],
"mechanisms" : [
"SCRAM-SHA-1",
"SCRAM-SHA-256"
]
},
{
"_id" : "lijiamandb.user2",
"userId" : UUID("f2a1cbf1-9e4d-46ab-b7c5-3a4bd6806465"),
"user" : "user2",
"db" : "lijiamandb",
"roles" : [
{
"role" : "readWrite",
"db" : "lijiamandb"
}
],
"mechanisms" : [
"SCRAM-SHA-1",
"SCRAM-SHA-256"
]
}
]

 

(5.2.2)可使用db.getUser("user1")查看数据库中特定用户

use lijiamandb

rstest:PRIMARY> db.getUser("user1")
{
"_id" : "lijiamandb.user1",
"userId" : UUID("95fd5c9a-82d5-48dc-8cdc-0fea31e77d13"),
"user" : "user1",
"db" : "lijiamandb",
"roles" : [
{
"role" : "readWrite",
"db" : "lijiamandb"
}
],
"mechanisms" : [
"SCRAM-SHA-1",
"SCRAM-SHA-256"
]
}
rstest:PRIMARY>

 

(5.3)查看角色
经过查看角色,能够看到角色的权限(action)。

use lijiamandb
rstest:PRIMARY> db.getRole( "readWrite", { showPrivileges: true } )

 

(5.4)角色授予

use lijiamandb
db.grantRolesToUser(
"lijiaman",
[
{ role: "read", db: "lijiaman" }
]
)

 

(5.5)角色回收

use lijiamandb
db.revokeRolesFromUser(
"lijiaman",
[
{ role: "readWrite", db: "lijiamandb" }
]
)

 

 

【完】

相关文章
相关标签/搜索