MongoDB 8.0:管理自管理部署中的用户与角色
以下示例介绍MongoDB 8.0自管理部署授权模型中的用户与角色管理。创建用户的方法见在自管理部署中创建用户。
前提条件
如果部署已启用访问控制,必须以具有各节所要求权限的用户进行身份验证。执行本教程中的操作,用户管理员需要userAdminAnyDatabase角色,或相应数据库上的userAdmin角色。将用户管理员添加为首个用户的步骤见在自管理部署中启用访问控制。
创建用户自定义角色
MongoDB为常见访问模式提供内置角色。若内置角色不能涵盖所需权限,可创建用户自定义角色。
除在admin数据库中创建的角色外,一个角色只能包含适用于自身数据库的权限,也只能继承该数据库中的其他角色。admin数据库中的角色可包含适用于admin、其他数据库或集群资源的权限,也可继承admin及其他数据库中的角色。
使用db.createRole()创建角色,在privileges数组中指定权限,在roles数组中指定继承的角色。
MongoDB用数据库名称与角色名称的组合唯一标识角色。各角色的作用域是其创建所在的数据库,但所有角色信息都存储在admin数据库的admin.system.roles集合中。
前提条件
在数据库中创建角色,需要对该数据库资源具有createRole 操作权限;还需要该数据库上的grantRole操作权限,以指定新角色的权限及其继承的角色。内置userAdmin与userAdminAnyDatabase角色在各自资源上提供createRole和grantRole操作权限。
创建带有authenticationRestrictions的角色,还需要在角色所在数据库资源上拥有setAuthenticationRestriction操作权限。
以下三个示例演示通过mongosh添加自定义角色:管理当前操作、运行mongostat,以及跨数据库删除system.views集合。
创建管理当前操作的角色
下面创建名为manageOpRole的角色,授予运行db.currentOp()和db.killOp()所需的权限。
1. 以适当权限连接MongoDB
以具备以上前提条件所列权限的用户连接mongod或mongos。以下步骤使用启用访问控制教程创建的myUserAdmin。
mongosh --port 27017 -u myUserAdmin -p 'abc123' --authenticationDatabase 'admin'
myUserAdmin可以在admin及其他数据库创建角色。
2. 创建管理当前操作的新角色
manageOpRole的权限涉及多个数据库和集群资源,因此必须在admin数据库创建:
use admin
db.createRole(
{
role: "manageOpRole",
privileges: [
{ resource: { cluster: true }, actions: [ "killop", "inprog" ] },
{ resource: { db: "", collection: "" }, actions: [ "killCursors" ] }
],
roles: []
}
)
新角色授予终止任意操作的权限。
注1:内置clusterMonitor角色也包含运行db.currentOp()的权限及其他权限;hostManager角色包含运行db.killOp()的权限及其他权限。
创建运行mongostat的角色
下面创建名为mongostatRole的角色,只提供运行mongostat所需的权限。
1. 以适当权限连接MongoDB
以具备以上前提条件所列权限的用户连接mongod或mongos。以下步骤使用启用访问控制教程创建的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集合的角色
下面创建dropSystemViewsAnyDatabase,授予删除任意数据库中system.views集合的权限。
1. 以适当权限连接MongoDB
以具备以上前提条件所列权限的用户连接mongod或mongos。以下步骤使用启用访问控制教程创建的myUserAdmin。
mongosh --port 27017 -u myUserAdmin -p 'abc123' --authenticationDatabase 'admin'
myUserAdmin可在admin及其他数据库中创建角色。
2. 创建可删除任意数据库中system.views集合的新角色
为角色指定权限,其中actions数组包含dropCollection操作,资源文档的数据库字段为空字符串"",集合字段为"system.views"。更多信息见指定跨数据库集合资源。
use admin
db.createRole(
{
role: "dropSystemViewsAnyDatabase",
privileges: [
{
actions: [ "dropCollection" ],
resource: { db: "", collection: "system.views" }
}
],
roles: []
}
)
修改现有用户的访问权限
前提条件
- 授予某数据库上的角色,需要该数据库上的grantRole操作权限。
- 撤销某数据库上的角色,需要该数据库上的revokeRole操作权限。
- 查看角色信息,需要已被显式授予该角色,或在其数据库上具有viewRole操作权限。
操作步骤
1. 以适当权限连接MongoDB
以具备以上前提条件所列权限的用户连接mongod或mongos。以下步骤使用启用访问控制教程创建的myUserAdmin。
mongosh --port 27017 -u myUserAdmin -p 'abc123' --authenticationDatabase 'admin'
2. 确定用户的角色与权限
使用db.getUser()和db.getRole()显示待修改用户的角色与权限。例如,查看其他示例中创建的reportsUser:
use reporting
db.getUser("reportsUser")
查看accounts数据库的readWrite角色授予的权限:
use accounts
db.getRole( "readWrite", { showPrivileges: true } )
3. 确定要授予或撤销的权限
若用户需要更多权限,授予包含相应权限集合的一个或多个角色。没有合适角色时,创建新角色。
要撤销某现有角色提供的部分权限,应先撤销原角色,再授予只包含所需权限的角色;必要时创建新角色。
4. 修改用户的访问权限
撤销角色:使用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。
修改现有用户的密码
前提条件
修改数据库中其他用户的密码,需要在该数据库上拥有changePassword操作权限。
操作步骤
1. 以适当权限连接MongoDB
以具备以上前提条件所列权限的用户连接mongod或mongos。以下步骤使用启用访问控制教程创建的myUserAdmin。
mongosh --port 27017 -u myUserAdmin -p 'abc123' --authenticationDatabase 'admin'
2. 修改密码
将用户名和新密码传给db.changeUserPassword()。下面将reporting用户的密码改为原文示例值SOh3TbYhxuLiW8ypJPxmt1oOfL:
db.changeUserPassword("reporting", "SOh3TbYhxuLiW8ypJPxmt1oOfL")
提示:另见修改自己的密码与自定义数据。
查看用户的角色
前提条件
查看其他用户的信息,需要在该用户所在数据库上具有viewUser操作权限。用户可以查看自己的信息。
操作步骤
1. 以适当权限连接MongoDB
以具备以上前提条件所列权限的用户连接mongod或mongos。以下步骤使用启用访问控制教程创建的myUserAdmin。
mongosh --port 27017 -u myUserAdmin -p 'abc123' --authenticationDatabase 'admin'
2. 确定用户的角色
通过usersInfo命令或db.getUser()方法显示用户信息。例如,查看其他示例中创建的reportsUser:
use reporting
db.getUser("reportsUser")
返回文档中的roles字段显示该用户的所有角色:
...
"roles" : [
{ "role" : "readWrite", "db" : "accounts" },
{ "role" : "read", "db" : "reporting" },
{ "role" : "read", "db" : "products" },
{ "role" : "read", "db" : "sales" }
]
查看角色的权限
前提条件
查看角色信息,需要已被显式授予该角色,或在其数据库上具有viewRole操作权限。
操作步骤
1. 以适当权限连接MongoDB
以具备以上前提条件所列权限的用户连接mongod或mongos。以下步骤使用启用访问控制教程创建的myUserAdmin。
mongosh --port 27017 -u myUserAdmin -p 'abc123' --authenticationDatabase 'admin'
2. 确定角色授予的权限
对指定角色调用db.getRole()方法,或使用rolesInfo命令,并设置showPrivileges选项。例如,查看products数据库的read角色授予的权限:
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" ]
}
]











暂无评论内容