Management 用户和角色

在本页面

Overview

本教程提供了 MongoDB 授权模型下的用户和角色 Management 示例。 Add Users介绍了如何向 MongoDB 添加新用户。

Prerequisites

Important

如果您有启用访问控制进行部署,则必须使用每个部分中指定的必需特权以用户身份进行身份验证。在特定数据库中具有userAdminAnyDatabase角色或userAdmin角色的用户 Management 员提供执行本教程中列出的操作所需的特权。有关将用户 Management 员添加为第一个用户的详细信息,请参见Enable Auth

创建用户定义的角色

角色授予用户访问 MongoDB 资源的权限。 MongoDB 提供了许多built-in roles,Management 员可以使用它们来控制对 MongoDB 系统的访问。但是,如果这些角色无法描述所需的特权集,则可以在特定数据库中创建新角色。

除在admin数据库中创建的角色外,角色只能包含适用于其数据库的特权,并且只能从其数据库中的其他角色继承。

admin数据库中创建的角色可以包括应用于admin数据库,其他数据库或cluster资源的特权,并且可以从其他数据库以及admin数据库中的角色继承。

若要创建新角色,请使用db.createRole()方法,在privileges数组中指定特权,并在roles数组中指定继承的角色。

MongoDB 使用数据库名称和角色名称的组合来唯一定义角色。每个角色的作用域仅限于您在其中创建角色的数据库,但是 MongoDB 将所有角色信息存储在admin数据库的admin.system.roles集合中。

Prerequisites

要在数据库中创建角色,您必须具有:

内置角色userAdminuserAdminAnyDatabase在其各自的resources上提供createRolegrantRole动作。

要创建指定了authenticationRestrictions的角色,必须在创建该角色的database resource上具有setAuthenticationRestriction action

创建一个角色来 Management 当前操作

以下示例创建一个名为manageOpRole的角色,该角色仅提供同时运行db.currentOp()db.killOp()的特权。 [1]

Note

在版本 3.2.9 中进行了更改:在mongod实例上,用户不需要任何特定特权即可查看或取消自己的操作。有关详情,请参见db.currentOp()db.killOp()

以适当的权限连接到 MongoDB。

使用Prerequisites部分中指定的权限连接到mongodmongos

以下过程使用在Enable Auth中创建的myUserAdmin

mongo --port 27017 -u myUserAdmin -p 'abc123' --authenticationDatabase 'admin'

myUserAdmin有权在admin以及其他数据库中创建角色。

创建一个新角色来 Management 当前操作。

manageOpRolecluster resource一样,都具有对多个数据库起作用的特权。因此,您必须在admin数据库中创建角色。

use admin
db.createRole(
   {
     role: "manageOpRole",
     privileges: [
       { resource: { cluster: true }, actions: [ "killop", "inprog" ] },
       { resource: { db: "", collection: "" }, actions: [ "killCursors" ] }
     ],
     roles: []
   }
)

新角色授予杀死任何操作的权限。

Warning

极其谨慎地终止正在运行的操作。仅使用db.killOp()方法或killOp命令来终止由 Client 端启动的操作,并且请勿终止内部数据库操作。

[1]内置角色clusterMonitor还提供了与其他特权一起运行db.currentOp()的特权,内置角色hostManager提供了与其他特权一起运行db.killOp()的特权。

创建要运行 mongostat 的角色

以下示例创建一个名为mongostatRole的角色,该角色仅提供运行mongostat的特权。 [2]

以适当的权限连接到 MongoDB。

使用Prerequisites部分中指定的权限连接到mongodmongos

以下过程使用在Enable Auth中创建的myUserAdmin

mongo --port 27017 -u myUserAdmin -p 'abc123' --authenticationDatabase 'admin'

myUserAdmin有权在admin以及其他数据库中创建角色。

创建一个新角色来 Management 当前操作。

mongostatRole具有对cluster resource起作用的特权。因此,您必须在admin数据库中创建角色。

use admin
db.createRole(
   {
     role: "mongostatRole",
     privileges: [
       { resource: { cluster: true }, actions: [ "serverStatus" ] }
     ],
     roles: []
   }
)
[2]内置角色clusterMonitor还提供了运行mongostat的特权以及其他特权。

创建一个角色以删除跨数据库的 system.views 集合

下面的示例创建一个名为dropSystemViewsAnyDatabase的角色,该角色提供将system.views集合删除到任何数据库中的特权。

以适当的权限连接到 MongoDB。

使用Prerequisites部分中指定的权限连接到mongodmongos

以下过程使用在Enable Auth中创建的myUserAdmin

mongo --port 27017 -u myUserAdmin -p 'abc123' --authenticationDatabase 'admin'

myUserAdmin有权在admin以及其他数据库中创建角色。

创建一个新角色,以将 system.views 集合拖放到任何数据库中。

对于角色,请指定一个包含以下内容的privilege

use admin
db.createRole(
   {
     role: "dropSystemViewsAnyDatabase",
     privileges: [
       {
         actions: [ "dropCollection" ],
         resource: { db: "", collection: "system.views" }
       }
     ],
     roles: []
   }
)

修改现有用户的访问权限

Prerequisites

  • 您必须在数据库上拥有grantRole action才能在该数据库上授予角色。

  • 您必须在数据库上拥有revokeRole action才能撤消该数据库上的角色。

  • 要查看角色的信息,必须为您明确授予该角色或在角色的数据库上具有viewRole action

Procedure

以适当的权限连接到 MongoDB。

使用先决条件部分中指定的特权,以用户身份连接到mongodmongos

以下过程使用在Enable Auth中创建的myUserAdmin

mongo --port 27017 -u myUserAdmin -p 'abc123' --authenticationDatabase 'admin'

标识用户的角色和特权。

要显示要修改的用户的角色和特权,请使用db.getUser()db.getRole()方法。

例如,要查看在Examples中创建的reportsUser的角色,请发出:

use reporting
db.getUser("reportsUser")

要显示"accounts"数据库上readWrite角色授予用户的特权,请发出:

use accounts
db.getRole( "readWrite", { showPrivileges: true } )

标识授予或撤消的特权。

如果用户需要其他特权,请向用户授予一个或多个角色,并带有所需的特权集。如果不存在这样的角色,则创建一个新角色具有适当的特权集。

要撤消现有角色提供的特权的子集,请执行以下操作:撤消原始角色,并授予仅包含所需特权的角色。如果角色不存在,则可能需要创建一个新角色

修改用户的访问权限。

撤销角色

使用db.revokeRolesFromUser()方法撤消角色。以下示例操作从reportsUser删除accounts数据库上的readWrite角色:

use reporting
db.revokeRolesFromUser(
    "reportsUser",
    [
      { role: "readWrite", db: "accounts" }
    ]
)
授予角色

使用db.grantRolesToUser()方法授予角色。例如,以下操作向reportsUser用户授予accounts数据库上的read角色:

use reporting
db.grantRolesToUser(
    "reportsUser",
    [
      { role: "read", db: "accounts" }
    ]
)

对于分片群集,在运行命令的mongos上即时更改用户。但是,对于群集中的其他mongos实例,用户缓存可能要 await10 分钟才能刷新。参见userCacheInvalidationIntervalSecs

修改现有用户的密码

Prerequisites

要修改数据库中另一个用户的密码,您必须在该数据库上具有changeAnyPassword action

Procedure

以适当的权限连接到 MongoDB。

使用Prerequisites部分中指定的权限连接到mongodmongos

以下过程使用在Enable Auth中创建的myUserAdmin

mongo --port 27017 -u myUserAdmin -p 'abc123' --authenticationDatabase 'admin'

更改密码。

将用户的用户名和新密码传递给db.changeUserPassword()方法。

以下操作将reporting用户的密码更改为SOh3TbYhxuLiW8ypJPxmt1oOfL

db.changeUserPassword("reporting", "SOh3TbYhxuLiW8ypJPxmt1oOfL")

查看用户的角色

Prerequisites

要查看另一个用户的信息,您必须在另一个用户的数据库上拥有viewUser action

用户可以查看自己的信息。

Procedure

以适当的权限连接到 MongoDB。

使用先决条件部分中指定的特权,以用户身份连接到mongodmongos

以下过程使用在Enable Auth中创建的myUserAdmin

mongo --port 27017 -u myUserAdmin -p 'abc123' --authenticationDatabase 'admin'

标识用户的角色。

使用usersInfo命令或db.getUser()方法显示用户信息。

例如,要查看在Examples中创建的reportsUser的角色,请发出:

use reporting
db.getUser("reportsUser")

在返回的文档中,roles字段显示reportsUser的所有角色:

...
"roles" : [
   { "role" : "readWrite", "db" : "accounts" },
   { "role" : "read", "db" : "reporting" },
   { "role" : "read", "db" : "products" },
   { "role" : "read", "db" : "sales" }
]

查看角色的特权

Prerequisites

要查看角色的信息,必须为您明确授予该角色或在角色的数据库上具有viewRole action

Procedure

以适当的权限连接到 MongoDB。

使用先决条件部分中指定的特权,以用户身份连接到mongodmongos

以下过程使用在Enable Auth中创建的myUserAdmin

mongo --port 27017 -u myUserAdmin -p 'abc123' --authenticationDatabase 'admin'

标识角色授予的特权。

对于给定的角色,将db.getRole()方法或rolesInfo命令与showPrivileges选项一起使用:

例如,要查看read角色在products数据库上授予的特权,请使用以下操作,发出:

use products
db.getRole( "read", { showPrivileges: true } )

在返回的文档中,privilegesinheritedPrivileges数组。 privileges列出了角色直接指定的特权,并排除了从其他角色继承的那些特权。 inheritedPrivileges列出了此角色授予的所有特权,包括直接指定和继承的特权。如果角色不继承其他角色,则两个字段相同。

...
"privileges" : [
  {
    "resource": { "db" : "products", "collection" : "" },
    "actions": [ "collStats","dbHash","dbStats","find","killCursors","planCacheRead" ]
  },
  {
    "resource" : { "db" : "products", "collection" : "system.js" },
    "actions": [ "collStats","dbHash","dbStats","find","killCursors","planCacheRead" ]
  }
],
"inheritedPrivileges" : [
  {
    "resource": { "db" : "products", "collection" : "" },
    "actions": [ "collStats","dbHash","dbStats","find","killCursors","planCacheRead" ]
  },
  {
    "resource" : { "db" : "products", "collection" : "system.js" },
    "actions": [ "collStats","dbHash","dbStats","find","killCursors","planCacheRead" ]
  }
]