(目录)

内建角色

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 ManagerOps Manager监控代理)只读的访问权限
  • hostManager 提供监控和管理服务器的权限
  • clusterAdmin 提供最高的集群管理访问权限,等同于clusterManager+clusterMonitor+hostManager+dropDatabase

备份和恢复角色

这类角色只能在admin数据库中进行授权

  • backup 提供备份数据的权限,这个角色可以进行以下操作:使用MongoDB Cloud Manager备份代理,使用mongodump备份整个mongod实例
  • restore 提供还原数据库所需的权限,使用户可以使用mongorestore恢复数据

全数据库角色

全数据库角色用于管理所有数据库,这类角色只能授权与admin数据库中的用户,并且不适用于localconfig数据库

  • readAnyDatabase 提供所有数据库的只读权限
  • readWriteAnyDatabase 提供所有数据库的readWrite权限
  • userAdminAnyDatabase 提供所有数据库的userAdmin权限。由于角色可以授权自己所有权限,这个角色实际上是一个MongoDB的超级用户
  • dbAdminAnyDatabase 提供所有数据库的dbAdmin权限

超级用户角色

只能在admin数据库中进行授权,此权限可以对所有数据库进行任何操作,也可以定义任何用户的权限。

  • root MongoDB的超级用户,具有所有权限 此外,由于userAdmin权限可以进行授权,所以拥有/间接拥有admin数据库中此角色的userAdmin,dbOwner,userAdminAnyDatabase的用户,权限也可以视为拥有超级用户权限

内部角色

  • system 主要用于MongoDB系统内部的操作,不建议将此角色授权给任何用户,防止用户随意对内部系统进行操作。

自定义角色

自定义角色可以让管理者自行定义角色的权限,以及可以使用的数据库。 自定义角色具有以下特点:

  • 在一般数据库上创建的角色,只适用于当前数据库
  • 在admin数据库上创建的角色,适用于所有数据库
  • 创建角色时,角色名称不能重复

创建自定义角色

db.createRole() 语法

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.10110.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.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角色授予给myRole01 db.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.revokePrivilegesFromRole(
    "<rolename>",
    [
        { resource: { <resource> }, actions: [ "<action>", ... ] },
        ...
    ],
    { <writeConcern> }
)

示例

db.revokePrivilegesFromRole(
	"myRole01",
	[{
		resource:{db:"",collection:""},
		actions:["createUser","createRole"]
	}]
)

删除自定义角色

删除自定义角色可以使用以下两种方法

use products
db.dropRole( "readPrices" )
use products
db.dropAllRoles()

查询自定义角色

查询自定义角色可以使用以下两种方法

详细说明如下:

  • 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
    }
)