目录
前言
本篇文章主要介绍关于MongoDB的用户管理及各种内置角色。
一、用户管理
大知识:
- 用户和密码不要使用以下字符:: / ? # [ ] @,这些都是保留字。
- 用户的姓名和身份验证数据库是该用户的唯一标识符。
- MongoDB将所有用户信息(包括name、password和用户的authentication database)存储在admin数据库中的system.users集合中。
- 在分片集群中,MongoDB将用户配置数据存储在config servers的admin数据库中。
- 默认情况下,MongoDB不启用访问控制。可以使用命令行参数--auth或在配置文件中指定security.authorization来启用用户认证。
用户管理和身份验证方法
方法 | 作用 |
db.auth() | 对数据库进行用户身份验证。 |
db.changeUserPassword() | 更改现有用户的密码。 |
db.createUser() | 创建一个新用户。 |
db.dropUser() | 删除单个用户。 |
db.dropAllUsers() | 删除与数据库关联的所有用户。 |
db.getUser() | 返回有关指定用户的信息。 |
db.getUsers() | 返回与数据库关联的所有用户的信息。 |
db.grantRolesToUser() | 将角色及其特权授予用户。 |
db.removeUser() | 不建议使用。从数据库中删除用户。 |
db.revokeRolesFromUser() | 从用户中删除角色。 |
db.updateUser() | 更新用户数据。 |
passwordPrompt() | 提示密码,作为直接在各种mongosh用户身份验证/管理方法中指定密码的替代方案。 |
列出用户
列出所有用户
use admin
db.system.users.find().pretty()
查看用户信息
use accounts
db.getUser("appClient")
返回数据库中所有的用户信息
db.getUsers()
创建用户
# 示例1
use products
db.createUser( { user: "accountAdmin01",
pwd: passwordPrompt(), // 或使用明文密码
customData: { employeeId: 12345 },
roles: [ { role: "clusterAdmin", db: "admin" },
{ role: "readAnyDatabase", db: "admin" },
"readWrite"] },
)
# 示例2
use admin
db.createUser(
{
user: "reportsUser",
pwd: passwordPrompt(), // 或使用明文密码
roles: [ ]
}
)
# 示例3
use admin
db.createUser(
{
user: "restricted",
pwd: passwordPrompt(), // 或使用明文密码
roles: [ { role: "readWrite", db: "reporting" } ],
authenticationRestrictions: [ {
clientSource: ["192.0.2.0"],
serverAddress: ["198.51.100.0"]
} ]
}
)
删除用户
use products
db.dropUser("reportUser1")
修改用户密码
# 提示密码输入
use products
db.changeUserPassword("accountUser", passwordPrompt())
# 明文密码
use products
db.changeUserPassword("accountUser", "123")
给用户授予角色
use products
db.grantRolesToUser(
"accountUser01",
[ "readWrite" , { role: "read", db: "stock" } ]
)
回收用户角色
use products
db.revokeRolesFromUser( "accountUser01",
[ { role: "read", db: "stock" }, "readWrite" ]
)
二、形形色色的内置角色
MongoDB使用基于角色的访问控制(RBAC)来管理对MongoDB系统的访问。用户被授予一个或多个角色,这些角色决定了用户对数据库资源和操作的访问。
客户端角色
角色 | 角色说明 | 可进行的操作 |
read | 提供读取所有非系统集合和system.js集合上的数据的功能 | changeStream;collStats;dbHash;dbStats;find;killCursors;listIndexes;listCollections |
readWrite | 提供read角色的所有特权,以及修改所有非系统集合和system.js集合上的数据的能力 | collStats; convertToCapped;createCollection;dbHash;dbStats;dropCollection;createIndex;dropIndex;find;insert;killCursors;listIndexes;listCollection;remove;renameCollectionSameDB;update |
数据库管理角色
角色 | 权限 |
dbAdmin | 提供执行管理任务的能力,例如与架构相关的任务,索引编制和收集统计信息。该角色不授予用户和角色管理特权 |
dbOwner | 数据库所有者可以对数据库执行任何管理操作。这个角色组合由授予的权限readWrite, dbAdmin和userAdmin角色 |
userAdmin | 提供在当前数据库上创建和修改角色和用户的功能。由于该userAdmin角色允许用户向任何用户(包括他们自己)授予任何特权,因此该角色还间接提供了 对数据库或 集群(如果作用域为数据库)的超级用户访问权限admin。 |
集群管理角色
admin数据库包含以下角色,用于管理整个系统,而不仅仅是管理单个数据库。这些角色包括但不限于复制集和分片集群管理功能。
角色 | 权限 |
clusterAdmin | 提供最大的集群管理访问。这个角色组合了clusterManager、clusterMonitor和hostManager角色授予的特权。此外,该角色还提供了dropDatabase操作。。 |
clusterManager | 提供对集群的管理和监视操作。具有此角色的用户可以访问config和local 数据库,分别用于分片和复制。 |
clusterMonitor | 提供对监视工具的只读访问。例如:例如MongoDB Cloud Manager 和Ops Manager监视代理 |
hostManager | 提供监视和管理服务器的功能 |
备份和还原角色
admin数据库包括以下角色,用于备份和还原数据
角色 | 权限 |
backup | 提供备份数据所需的最小特权。该角色提供了足够的特权,可以使用MongoDB Cloud Manager备份代理, Ops Manager备份代理,或用于备份 mongodump整个mongod实例。 |
restore | 从备份还原数据 |
所有数据库角色
角色 | 权限 |
readAnyDatabase | 除local 和config数据库外的所有数据库上提供与read相同的只读特权。该角色还在整个集群上提供listDatabases操作。 |
readWriteAnyDatabase | 除local 和config数据库外的所有数据库上提供与读写相同的特权。该角色还在整个集群上提供listDatabases操作 |
userAdminAnyDatabase | 提供与userAdmin一样的用户管理操作权限,对所有数据库(除了local和config)进行访问 |
dbAdminAnyDatabase | 除local 和config数据库外的所有数据库上提供与dbAdmin相同的特权。该角色还在整个集群上提供listDatabases操作 |
超级用户角色
角色 | 权限 |
root | 提供对所有资源的完整特权 |
内部角色
角色 | 权限 |
__system | MongoDB将此角色分配给代表集群成员的用户对象,例如副本集成员和mongos实例。该角色授权其持有者对数据库中的任何对象采取任何措施 |
基本MongoDB内置的各种角色已经能够覆盖我们的大部分日常权限需求了,如果还需要自己定制我们自己的角色,可以使用db.createRole()方法来创建。