文章目录

  • RBAC(基于角色控制)
  • 设置权限
  • 忘掉密码怎么办


RBAC(基于角色控制)

MongoDB中的权限是基于角色控制的(Role-Based Access Control)

角色类型

类型说明

角色名称

说明

数据库一般角色(Database User Roles)

每个数据库都包含的一般角色

read

提供读取所有非系统集合和部分系统集合的数据的能力,系统集合包括:system.indexes,system.js和system.namespaces集合

readWrite

提供read角色的所有权限以及修改所有非系统集合和system.js集合上的数据的能力

数据库管理角色(Database Administration Roles)

每个数据库都包含的数据库管理角色

dbAdmin

提供执行管理任务的能力,如与模式相关的任务,索引,收集统计信息。 此角色不授予用户和角色管理的权限

userAdmin

提供在当前数据库上创建和修改角色和用户的能力

dbOwner

提供对数据库执行任何管理操作的能力。 此角色结合了readWrite,dbAdmin和userAdmin角色授予的权限

集群管理角色(Cluster Administration Roles)

用于管理整个数据库集群系统而不是特定数据库的角色。 这些角色包括但不限于副本集和分片群集管理功能

clusterManager

在集群上提供管理和监视操作。 具有此角色的用户可以分别访问在分片和复制中使用的config和local数据库

clusterMonitor

为监控工具(如MongoDB Cloud Manager和Ops Manager监控代理)提供只读访问权限

hostManager

提供监视和管理服务器的能力

clusterAdmin

提供权限最高的群集管理访问。 此角色结合了由clusterManager,clusterMonitor和hostManager角色授予的权限。 此外,该角色还提供了dropDatabase操作

备份和恢复角色(Backup and Restoration Roles)

用于专门的备份和恢复的角色

backup

提供备份数据所需的权限。 此角色提供足够的权限来使用MongoDB Cloud Manager备份代理,Ops Manager备份代理或使用mongodump

restore

提供使用mongorestore恢复数据所需的权限

全数据库角色(All-Database Roles)

适用于除mongod实例中的local和config之外的所有数据库

readAnyDatabase

提供与读取相同的只读权限,除了适用于群集中除本地和配置数据库以外的所有权限。 该角色还提供了整个集群上的listDatabases操作

readWriteAnyDatabase

提供与readWrite相同的读取和写入权限,除了它适用于群集中除本地和配置数据库以外的所有数据。 该角色还提供了整个集群上的listDatabases操作

userAdminAnyDatabase

提供与userAdmin相同的用户管理操作访问权限,除了适用于群集中除本地数据库和配置数据库外的所有数据

dbAdminAnyDatabase

提供与dbAdmin相同的数据库管理操作访问权限,除了它适用于除集群中的本地数据库和配置数据库以外的所有数据库管理操作。 该角色还提供了整个集群上的listDatabases操作

超级角色(Superuser Roles)

所有资源的完整权限

root

提供对readWriteAnyDatabase,dbAdminAnyDatabase,userAdminAnyDatabase,clusterAdmin,还原和备份相结合的操作和所有资源的访问

设置权限

  1. 关闭mongodb,指定安全模式启动
/usr/bin/mongod -f /etc/mongod.conf --auth

说明:

  • 数据库增加安全模式后,虽然允许连接到客户端,但其他操作都是没有权限执行的
  • 如果是yum方式安装的,可以直接修改/etc/mongodb.conf中的配置项auth=true,然后重启systemctl restart mongod
  1. 数据库增加安全模式后,初始化一个"userAdminAnyDatabase"极其重要,通过客户端连接,切换到admin数据库,创建权限用户admin:
mongo 127.0.0.1:27017

use admin

db.createUser({'user':'admin', 'pwd':'123456', 'roles':[{'role':'userAdminAnyDatabase', 'db':'admin'}]})
  1. 使用admin用户登录,切换到目标库,然后使用admin为这个库创建可读写的用户maohw
db.auth("admin","123456")

use maohw

db.createUser({'user':'maohw','pwd':'123456','roles':[{'role':'readWrite','db':'maohw'}]})
  1. 使用maohw用户登录,测试读写操作
db.auth("maohw","123456")

忘掉密码怎么办

  1. 强制关闭mongodb,然后使用非安全模式启动
/usr/bin/mongod -f /etc/mongod.conf

说明:

如果是yum方式安装的,可以直接修改/etc/mongodb.conf中的配置项auth=false,然后重启mongo:systemctl restart mongod

  1. 切换到admin库,然后会发现所创建的用户是在 system.users集合里的,查看该集合看看有哪些用户
use admin

db.system.users.find().pretty()
  1. 修改某用户的密码
db.changeUserPassword('user','password')

修改完毕后再以安全模式重启mongodb

除此之外,还有一种比较极端的修改用户密码方式,这里并不推荐,方法如下:

以非安全模式启动mongo,然后切换到admin库,将system.users集合里的用户全部删除,然后重新创建新用户,创建完毕后再以安全模式启动(注意:这种方式必须删除全部用户,如果只删除某一个用户然后再创建该用户,亲测是不可以的!!!)

use admin

db.system.users.remove({})     # 删除所有帐户