管理自管理部署的用户和角色
本教程提供了在 MongoDB 授权模型下进行自管理部署的用户和角色管理的示例。要创建新用户,请参阅在自托管部署上创建用户。
先决条件
如果已为部署启用访问控制,则必须以具有每节中指定的所需权限的用户身份进行身份验证。要执行本教程中列出的操作,用户管理员需要具有特定数据库中的 userAdminAnyDatabase
角色或userAdmin
角色。有关添加用户管理员作为第一个用户的详细信息,请参阅对自托管部署启用访问控制
创建用户定义的角色
注意
要在 MongoDB Atlas 中创建用户定义的角色,请参阅 MongoDB Atlas 文档中的添加自定义角色。
角色授予用户访问 MongoDB 资源的权限。MongoDB 提供了许多内置角色,管理员可以用这些角色来控制对 MongoDB 系统的访问权限。但是,如果这些角色无法描述所需的特权集,您可以在特定数据库中创建新角色。
除在 admin
数据库中创建的角色之外,角色只能包含会应用于其数据库的特权,且只能从其数据库中的其他角色来继承。
在 admin
数据库中创建的角色可包含会应用于 admin
数据库、其他数据库或集群资源的特权,且可从其他数据库和 admin
数据库中的角色来继承。
要创建新角色,请使用 db.createRole()
方法,在 privileges
数组中指定权限,在 roles
数组中指定继承的角色。
MongoDB 使用数据库名称和角色名称的组合来唯一定义角色。每个角色的范围都限于您创建该角色的数据库,但 MongoDB 将所有角色信息存储在 admin
数据库的 admin.system.roles
集合中。
先决条件
要在数据库中创建角色,必须:
对该数据库资源执行
createRole
操作。
通过内置角色 userAdmin
和 userAdminAnyDatabase
,可在各自的资源上执行 createRole
和 grantRole
操作。
要在指定 authenticationRestrictions
时创建角色,必须针对创建该角色的数据库资源执行 setAuthenticationRestriction
操作。
要使用 mongosh
添加自定义用户定义角色,请参阅以下示例:
创建用于管理当前操作的角色
以下示例创建了一个名为manageOpRole
的角色,该角色仅提供同时运行db.currentOp()
和db.killOp()
的权限。 [ 1 ]
注意
用户无需任何特定特权即可查看或终止自己在mongod
实例上的操作。请参阅db.currentOp()
和db.killOp()
以了解详细信息。
使用适当的权限连接到 MongoDB。
使用mongod
mongos
先决条件 部分中指定的权限连接到 或 。
以下过程将使用在对自管理部署启用访问控制中创建的myUserAdmin
。
mongosh --port 27017 -u myUserAdmin -p 'abc123' --authenticationDatabase 'admin'
myUserAdmin
拥有在 admin
和其他数据库中创建角色的权限。
创建用于管理当前操作的新角色。
manageOpRole
具有可作用于多个数据库以及集群资源的特权。因此,您必须在admin
数据库中创建角色。
use admin db.createRole( { role: "manageOpRole", privileges: [ { resource: { cluster: true }, actions: [ "killop", "inprog" ] }, { resource: { db: "", collection: "" }, actions: [ "killCursors" ] } ], roles: [] } )
新角色会授予终止任何操作的权限。
警告
终止正在运行的操作时要格外小心。仅使用db.killOp()
方法或killOp
命令终止客户端发起的操作,而不能终止内部数据库操作。
[1] | 内置角色 clusterMonitor 还提供运行 db.currentOp() 的权限以及其他权限,内置角色 hostManager 提供运行 db.killOp() 的权限以及其他权限。 |
创建要运行的角色 mongostat
以下示例创建了一个名为mongostatRole
的角色,该角色仅提供运行mongostat
的特权。 [ 2 ]
使用适当的权限连接到 MongoDB。
使用mongod
mongos
先决条件 部分中指定的权限连接到 或 。
以下过程将使用在对自管理部署启用访问控制中创建的myUserAdmin
。
mongosh --port 27017 -u myUserAdmin -p 'abc123' --authenticationDatabase 'admin'
myUserAdmin
拥有在 admin
和其他数据库中创建角色的权限。
创建用于管理当前操作的新角色。
mongostatRole
具有作用于集群资源的特权。因此,您必须在admin
数据库中创建角色。
use admin db.createRole( { role: "mongostatRole", privileges: [ { resource: { cluster: true }, actions: [ "serverStatus" ] } ], roles: [] } )
[2] | 内置角色clusterMonitor 还提供运行mongostat 的特权以及其他特权。 |
创建角色以跨数据库删除system.views
集合
以下示例创建了一个名为dropSystemViewsAnyDatabase
system.views
的角色,该角色提供删除任何数据库中的collection的权限。
使用适当的权限连接到 MongoDB。
使用mongod
mongos
先决条件 部分中指定的权限连接到 或 。
以下过程将使用在对自管理部署启用访问控制中创建的myUserAdmin
。
mongosh --port 27017 -u myUserAdmin -p 'abc123' --authenticationDatabase 'admin'
myUserAdmin
拥有在 admin
和其他数据库中创建角色的权限。
创建新角色以删除任意数据库中的system.views
集合。
为角色指定权限,其中包含以下内容:
包含
dropCollection
操作的actions
数组,以及一个资源文档,其中为数据库指定一个空字符串 (
""
),并为集合指定字符串"system.views"
。有关更多信息,请参见将跨数据库的集合指定为资源。
use admin db.createRole( { role: "dropSystemViewsAnyDatabase", privileges: [ { actions: [ "dropCollection" ], resource: { db: "", collection: "system.views" } } ], roles: [] } )
修改现有用户的访问权限
注意
要修改 MongoDB Atlas 中现有数据库用户的角色,请参阅 MongoDB Atlas 文档中的修改数据库用户。
先决条件
步骤
使用适当的权限连接到 MongoDB。
以具有前提条件部分指定权限的用户身份连接到 mongod
或 mongos
。
以下过程将使用在对自管理部署启用访问控制中创建的myUserAdmin
。
mongosh --port 27017 -u myUserAdmin -p 'abc123' --authenticationDatabase 'admin'
识别用户的角色和权限。
要显示要修改的用户的角色和权限,请使用db.getUser()
和db.getRole()
方法。
例如,要查看在其他示例中为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
个实例,用户缓存可能需要等待 10 分钟才能刷新。请参阅 userCacheInvalidationIntervalSecs
。
修改现有用户的密码
注意
要修改现有 MongoDB Atlas 用户的密码,请参阅 MongoDB Atlas 文档中的修改数据库用户。
先决条件
要修改数据库其他用户的密码,必须对该数据库执行 changePassword
操作。
步骤
使用适当的权限连接到 MongoDB。
使用 先决条件部分中指定的权限连接到 mongod
或 mongos
。
以下过程将使用在对自管理部署启用访问控制中创建的myUserAdmin
。
mongosh --port 27017 -u myUserAdmin -p 'abc123' --authenticationDatabase 'admin'
更改密码。
将用户的用户名和新密码传递给 db.changeUserPassword()
方法。
以下操作将reporting
用户的密码更改为SOh3TbYhxuLiW8ypJPxmt1oOfL
:
db.changeUserPassword("reporting", "SOh3TbYhxuLiW8ypJPxmt1oOfL")
查看用户角色
注意
要查看用户在 MongoDB Atlas 中的角色,请参阅 MongoDB Atlas 文档中的查看数据库用户和证书。
先决条件
要查看其他用户的信息,必须对其他用户的数据库执行 viewUser
操作。
用户可查看自己的信息。
步骤
使用适当的权限连接到 MongoDB。
以具有前提条件部分指定权限的用户身份连接到 mongod
或 mongos
。
以下过程将使用在对自管理部署启用访问控制中创建的myUserAdmin
。
mongosh --port 27017 -u myUserAdmin -p 'abc123' --authenticationDatabase 'admin'
确定用户的角色。
使用 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" } ]
查看角色特权
注意
要在 MongoDB Atlas 中查看角色的权限,请参阅 MongoDB Atlas 文档中的查看自定义角色。
先决条件
步骤
使用适当的权限连接到 MongoDB。
以具有前提条件部分指定权限的用户身份连接到 mongod
或 mongos
。
以下过程将使用在对自管理部署启用访问控制中创建的myUserAdmin
。
mongosh --port 27017 -u myUserAdmin -p 'abc123' --authenticationDatabase 'admin'
确定角色授予的权限。
对于给定角色,请使用db.getRole()
方法或带有showPrivileges
选项的rolesInfo
命令:
例如,若要查看 read
角色在 products
数据库上获得的权限,请使用以下操作,发出:
use products db.getRole( "read", { showPrivileges: true } )
在返回的文档中,privileges
和 inheritedPrivileges
数组。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" ] } ]