管理用户和角色img

概述img

本教程提供了 MongoDB 授权模型下的用户和角色管理示例。 Create a User 描述了如何将新用户添加到 MongoDB。

先决条件img

[IMPORTANT]

如果您已为部署enabled access control ,则必须以具有每个部分中指定的所需权限的用户身份进行身份验证。userAdminAnyDatabase具有特定数据库中的角色或角色的用户管理员 userAdmin提供执行本教程中列出的操作所需的权限。有关将用户管理员添加为第一个用户的详细信息,请参阅 enabled access control

创建用户定义的角色img

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

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

在数据库中创建的角色admin可以包括适用于admin数据库、其他数据库或 集群资源的特权,并且可以从其他数据库和数据库中的角色继承admin

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

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

先决条件img

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

内置角色userAdmin和 对各自资源userAdminAnyDatabase的提供createRolegrantRole操作。

要创建authenticationRestrictions指定的角色,您必须对创建该角色的 数据库资源具有setAuthenticationRestriction操作权限。

创建一个角色来管理当前操作img

以下示例创建一个名为 manageOpRole 的角色,它只提供运行db.currentOp()db.killOp() 的权限。 [1]

[NOTE]

从 MongoDB 3.2.9 开始,用户不需要任何特定权限即可查看或终止他们自己对mongod 实例的操作。有关详细信息,请参阅db.currentOp()db.killOp()

  1. 使用适当的权限连接到 MongoDB。img

    连接到mongodmongos使用指定的权限先决条件部分。

    以下过程使用myUserAdminEnable Access Control中创建。

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

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

  2. 创建一个新角色来管理当前操作。img

    manageOpRole具有作用于多个数据库以及集群资源的特权。因此,您必须在admin数据库中创建角色。

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

    新角色授予终止任何操作的权限。

    [WARNING]

    终止正在运行的操作时要格外小心。仅使用db.killOp()方法或killOp命令终止客户端发起的操作,不要终止内部数据库操作。

    [1] 内置角色 clusterMonitor 还提供运行 db.currentOp() 的权限以及其他权限,内置角色 hostManager 提供运行 db.killOp() 的权限以及其他权限。

创建要运行的角色mongostatimg

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

  1. 使用适当的权限连接到 MongoDBimg

    连接到mongodmongos使用指定的权限先决条件部分。

    以下过程使用myUserAdmin启用访问控制中创建的。

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

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

  2. 创建一个新角色来管理当前操作

    mongostatRole具有作用于集群资源的特权。因此,您必须在admin数据库中创建角色。

    use admin
    db.createRole(
       {
         role: "mongostatRole", 
         privileges: [
           { resource: { cluster: true }, actions: [ "serverStatus" ] }
         ],
         roles: []
       }
    )
    

    [2] 内置角色 clusterMonitor还提供运行 mongostat 的权限以及其他权限。

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

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

  1. 使用适当的权限连接到 MongoDB。img

    连接到mongodmongos使用指定的权限先决条件部分。

    以下过程使用myUserAdminEnable Access Control中创建。

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

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

  2. 创建一个新角色以删除任何数据库中的 system.views 集合。

    对于角色,指定一个特权,包括:

  • 为数据库指定空字符串 ("") 并为集合指定字符串“system.views”的资源文档。 有关详细信息,请参阅 Specify Collections Across Databases as Resource

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

修改现有用户的访问权限img

先决条件img

  • 您必须对数据库执行操作才能授予对该数据库的角色。grantRole
  • 您必须对数据库执行操作才能撤销对该数据库的角色。revokeRole
  • 要查看角色的信息,您必须被明确授予该角色,或者必须对该角色的数据库执行操作viewRole

程序img

1个

使用适当的权限连接到 MongoDB。img

连接到mongodmongos作为具有先决条件部分中指定权限的用户。

以下过程使用myUserAdmin启用访问控制中创建的。

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

2个

确定用户的角色和权限。img

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

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

use reporting
db.getUser("reportsUser")

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

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

3个

确定授予或撤销的权限。img

如果用户需要额外的权限,则向用户授予一个或多个具有所需权限集的角色。如果不存在这样的角色,创建一个新角色 具有适当的权限集。

要撤销现有角色提供的部分特权:撤销原始角色并授予仅包含所需特权的角色。你可能需要创建一个新角色如果角色不存在。

4个

修改用户的访问权限。img

撤销角色img

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

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

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

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

对于分片集群,对用户的更改 mongos在命令运行时即时发生。但是,对于 mongos集群中的其他实例,用户缓存最多可能需要等待 10 分钟才能刷新。看 userCacheInvalidationIntervalSecs

修改现有用户的密码img

先决条件img

要修改数据库上另一个用户的密码,您必须对该数据库执行 操作changePassword

程序img

1个

使用适当的权限连接到 MongoDB。img

连接到mongodmongos使用指定的权限先决条件部分。

以下过程使用myUserAdmin启用访问控制中创建的。

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

2个

更改密码。img

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

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

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

提示

也可以看看:

更改您的密码和自定义数据

查看用户的角色img

先决条件img

要查看另一个用户的信息,您必须 对另一个用户的数据库执行操作viewUser

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

程序img

1个

使用适当的权限连接到 MongoDB。img

连接到mongodmongos作为具有先决条件部分中指定权限的用户。

以下过程使用myUserAdmin启用访问控制中创建的。

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

2个

确定用户的角色。img

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

例如,要查看在附加示例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" }
]

查看角色的权限img

先决条件img

要查看角色的信息,您必须被明确授予该角色,或者必须对该角色的数据库执行操作viewRole

程序img

1个

使用适当的权限连接到 MongoDB。img

连接到mongodmongos作为具有先决条件部分中指定权限的用户。

以下过程使用myUserAdmin启用访问控制中创建的。

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

2个

确定角色授予的特权。img

对于给定的角色,使用带有以下选项的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" ]
  }
]

参见

原文 - Manage Users and Roles

Copyright © 上海锦木信息技术有限公司 all right reserved,powered by Gitbook文件修订时间: 2023-02-17 14:11:51

results matching ""

    No results matching ""