MongoDB 用户&权限&角色

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.createUser(
    {
        user:'user',
        pwd :'123',
        customData:{"desc":"This user is for administrators"},
        roles:[
                {
                    role:'userAdminAnyDatabase',db:'admin'
                }
        ]
    }
)

user :用户名 --必须项
pwd :密码 --必须项
customData :用于描述账户信息 --非必须项
roles:指定用户的角色,可以用一个空数组给新用户设定空角色;在roles字段,可以指定内置角色和用户定义的角色。–必须项(可以为空集合)

role里的角色可以选以下(具体说明见下面):
1、Built-In Roles(内置角色):
a)数据库用户角色:read、readWrite;
b)数据库管理角色:dbAdmin、dbOwner、userAdmin;
c)集群管理角色:clusterAdmin、clusterManager、clusterMonitor、hostManager;
d)备份恢复角色:backup、restore;
e)所有数据库角色:readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase
f)超级用户角色:root
–这里还有几个角色间接或直接提供了系统超级用户的访问(dbOwner、userAdmin、userAdminAnyDatabase)
h)内部角色:__system

2、具体角色:
a)Read :允许用户读取指定数据库
b)readWrite:允许用户读写指定数据库
c)backup,retore :在进行备份、恢复时可以单独指定的角色,在db.createUser()方法中roles里面的db必须写成是admin库,要不然会报错
d)dbAdmin:允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile
e)userAdmin:允许用户向system.users集合写入,可以找指定数据库里创建、删除和管理用户
f)clusterAdmin:只在admin数据库中可用,赋予用户所有分片和复制集相关函数的管理权限。
m)readAnyDatabase :只在admin数据库中可用,赋予用户所有数据库的读权限
n)readWriteAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读写权限
o)userAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的userAdmin权限,
q)dbAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的dbAdmin权限。
k)root:只在admin数据库中可用。超级账号,超级权限

列出用户
列出所有用户

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实例。该角色授权其持有者对数据库中的任何对象采取任何措施

参考原文1:Mongodb创建用户角色
参考原文2:MongoDB用户及角色管理