(目录)
内建角色
MongoDB通过角色绑定的方式授予用户权限,在MongoDB中,提供了一些默认的内建角色,用于给用户授权
内建角色的特点
内建角色具有以下特点:
- 在授予用户角色权限时,默认授予于当前的数据库
- 角色授权可以授予集合级别的粒度
- 角色授权分为系统集合以及非系统集合的访问权限
- 每个数据库中的角色都可以分为一般角色和管理角色
- 管理数据库(admin)可以使用所有的内建角色
内建角色的种类
数据库用户角色
- read
用于读取所有的非系统集合,以及以下三个系统集合的数据:
system.indexes
,system.js
,system.namesp
- readWrite
拥有read角色的所有权限,并且可以修改所有非系统集合以及
system.js
集合上的数据
数据库管理角色
- dbAdmin 提供管理相关的功能,如:查询数据库统计信息,索引管理等
- userAdmin 提供管理数据库角色和用户的权限。具有这个角色的用户可以为当前数据库的任何用户(包括自己)分配任何角色权限
- dbOwner
提供数据库所有者的权限,可以对数据库执行任何管理操作。这个角色等同于
readWrite
+dbAdmin
+userAdmin
集群管理角色
这类角色提供管理整个MongoDB的权限,只能在admin
数据库中进行授权
- clusterManager 提供对集群进行管理和监控的权限
- clustermonitor
提供对监控工具(
MongoDB Cloud Manager
和Ops Manager
监控代理)只读的访问权限 - hostManager 提供监控和管理服务器的权限
- clusterAdmin
提供最高的集群管理访问权限,等同于
clusterManager
+clusterMonitor
+hostManager
+dropDatabase
备份和恢复角色
这类角色只能在admin
数据库中进行授权
- backup
提供备份数据的权限,这个角色可以进行以下操作:使用
MongoDB Cloud Manager
备份代理,使用mongodump
备份整个mongod实例 - restore
提供还原数据库所需的权限,使用户可以使用
mongorestore
恢复数据
全数据库角色
全数据库角色用于管理所有数据库,这类角色只能授权与admin
数据库中的用户,并且不适用于local
和config
数据库
- readAnyDatabase 提供所有数据库的只读权限
- readWriteAnyDatabase 提供所有数据库的readWrite权限
- userAdminAnyDatabase 提供所有数据库的userAdmin权限。由于角色可以授权自己所有权限,这个角色实际上是一个MongoDB的超级用户
- dbAdminAnyDatabase 提供所有数据库的dbAdmin权限
超级用户角色
只能在admin
数据库中进行授权,此权限可以对所有数据库进行任何操作,也可以定义任何用户的权限。
- root
MongoDB的超级用户,具有所有权限
此外,由于
userAdmin
权限可以进行授权,所以拥有/间接拥有admin数据库中此角色的userAdmin
,dbOwner
,userAdminAnyDatabase
的用户,权限也可以视为拥有超级用户权限
内部角色
- system 主要用于MongoDB系统内部的操作,不建议将此角色授权给任何用户,防止用户随意对内部系统进行操作。
自定义角色
自定义角色可以让管理者自行定义角色的权限,以及可以使用的数据库。 自定义角色具有以下特点:
- 在一般数据库上创建的角色,只适用于当前数据库
- 在admin数据库上创建的角色,适用于所有数据库
- 创建角色时,角色名称不能重复
创建自定义角色
db.createRole(
{
role: "<name>",
privileges: [
{ resource: { <resource> }, actions: [ "<action>", ... ] },
...
],
roles: [
{ role: "<role>", db: "<database>" } | "<role>",
...
],
authenticationRestrictions: [
{
clientSource: ["<IP>" | "<CIDR range>", ...],
serverAddress: ["<IP>" | "<CIDR range>", ...]
},
...
]
})
参数说明
- role: 要创建的角色名称
- privileges: 授予角色的权限
- resource: 指定数据库或集合。若数据库设置为空,则默认为当前数据库;若集合设置为空,则默认为全部集合。
- actions: 指定权限(如remove,update等)
- roles: 继承已有角色的权限
示例
在admin数据库中,创建一个名称为myRole01
的角色,这个角色具有find
,insert
,remove
,update
权限,同时该角色继承Product
库的roleWrite
权限,Carts
库的read
权限以及admin
库的read
权限,并且该角色只能从客户端10.0.0.101
进行连接,连接的MongoDB服务端地址为10.0.0.101
和10.0.0.102
use admin
db.createRole({
role:"myRole01",
privileges:[{
resource:{
db:"",collection:""
},
actions:["find","insert","remove","update"]
}],
roles:[
{role:"readWrite",db:"Product"},
{role:"read",db:"Carts"},
{role:"read",db:"admin"}
],
authenticationRestrictions:[{
clientSource:["10.0.0.101"],
serverAddress:["10.0.0.101","10.0.0.102"]
}]
})
修改自定义角色
db.updateRole()
使用该方法会覆盖掉原本角色的所有权限。如果只想修改其中的几个权限或角色,可以使用以下方法
db.grantRolesToRole()
db.grantPrivilegesToRole()
db.revokeRolesFromRole()
db.revokePrivilegesFromRole()
语法
db.updateRole(
"<rolename>",
{
privileges:
[
{ resource: { <resource> }, actions: [ "<action>", ... ] },
...
],
roles:
[
{ role: "<role>", db: "<database>" } | "<role>",
...
],
authenticationRestrictions:
[
{
clientSource: ["<IP>" | "<CIDR range>", ...],
serverAddress: ["<IP>", | "<CIDR range>", ...]
},
...
]
},
{ <writeConcern> }
)
为自定义角色授权
-
db.grantRolesToRole()
将角色授予个自定义角色 语法db.grantRolesToRole( "<rolename>", [ <roles> ], { <writeConcern> } )
示例 将Product库的readWrite角色授予给myRole01db.grantRolesToRole("myRole01",[{role:"readWrite",db:"Product"}])
-
db.grantPrivilegesToRole()
将权限授予给自定义角色 语法
db.grantPrivilegesToRole(
"< rolename >",
[
{ resource: { <resource> }, actions: [ "<action>", ... ] },
...
],
{ < writeConcern > }
)
示例
db.grantPrivilegesToRole(
"myRole01",
[{
resource:{db:"",collection:""},
actions:["createUser","createRole"]
}]
)
取消自定义角色的权限
-
db.revokeRolesFromRole()
语法db.revokeRolesFromRole( "<rolename>", [ <roles> ], { <writeConcern> } )
示例db.revokeRolesFromRole("myRole01",[{role:"readWrite",db:"Product"}])
db.revokePrivilegesFromRole(
"<rolename>",
[
{ resource: { <resource> }, actions: [ "<action>", ... ] },
...
],
{ <writeConcern> }
)
示例
db.revokePrivilegesFromRole(
"myRole01",
[{
resource:{db:"",collection:""},
actions:["createUser","createRole"]
}]
)
删除自定义角色
删除自定义角色可以使用以下两种方法
db.dropRole()
删除指定的自定义角色
use products
db.dropRole( "readPrices" )
db.dropAllRoles()
删除所有的自定义角色
use products
db.dropAllRoles()
查询自定义角色
查询自定义角色可以使用以下两种方法
- db.getRole() 查询指定的自定义角色
- db.getRoles() 查询所有的自定义角色
详细说明如下:
- db.getRole() 查询指定的自定义角色
语法
db.getRole(rolename, args)
参数说明 args为可选参数,有以下两种值可以设定:- showPrivileges: 是否显示自定义角色的全部权限,默认为false
- showAuthenticationRestrictions: 是否显示角色的IP地址管控限制,默认为false
示例
db.getRole("myRole01",{showPrivileges:true,showAuthenticationRestrictions:true})
{
"role" : "myRole01",
"db" : "admin",
"isBuiltin" : false,
"roles" : [
{
"role" : "read",
"db" : "Carts"
}
],
"inheritedRoles" : [
{
"role" : "read",
"db" : "Carts"
}
],
"privileges" : [
{
"resource" : {
"db" : "",
"collection" : ""
},
"actions" : [
"find",
"insert",
"remove",
"update"
]
}
],
"authenticationRestrictions" : [
[
{
"clientSource" : [
"10.0.0.101/32"
],
"serverAddress" : [
"10.0.0.101/32",
"10.0.0.102/32"
]
}
]
],
"inheritedPrivileges" : [
{
"resource" : {
"db" : "",
"collection" : ""
},
"actions" : [
"find",
"insert",
"remove",
"update"
]
},
{
"resource" : {
"db" : "Carts",
"collection" : ""
},
"actions" : [
"changeStream",
"collStats",
"dbHash",
"dbStats",
"find",
"killCursors",
"listCollections",
"listIndexes",
"planCacheRead"
]
},
{
"resource" : {
"db" : "Carts",
"collection" : "system.js"
},
"actions" : [
"changeStream",
"collStats",
"dbHash",
"dbStats",
"find",
"killCursors",
"listCollections",
"listIndexes",
"planCacheRead"
]
}
],
"inheritedAuthenticationRestrictions" : [
[
{
"clientSource" : [
"10.0.0.101/32"
],
"serverAddress" : [
"10.0.0.101/32",
"10.0.0.102/32"
]
}
]
]
}
查询所有的自定义角色
db.getRoles(
{
showPrivileges:true,
showBuiltinRoles: true
}
)