一、MongoDB中内置角色

角色

介绍

read

提供读取所有非系统的集合(数据库)

readWrite

提供读写所有非系统的集合(数据库)和读取所有角色的所有权限

dbAdmin

提供执行管理任务的功能,例如与架构相关的任务,索引编制,收集统计信息。此角色不授予用户和角色管理权限。

dbOwner

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

userAdmin

提供在当前数据库上创建和修改角色和用户的功能。由于userAdmin角色允许用户向任何用户(包括他们自己)授予任何权限,因此该角色还间接提供对数据库的超级用户访问权限,或者,如果作用于管理数据库,则提供对群集的访问权限。

clusterAdmin

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

readAnyDatabase

仅在admin 数据库中使用,提供所有数据库的读权限。

readWriteAnyDatabase

尽在admin 数据库中使用,提供所有数据库的读写权限

userAdminAnyDatabase

尽在admin 数据库中使用,提供与userAdmin相同的用户管理操作访问权限,允许用户向任何用户(包括他们自己)授予任何权限,因此该角色还间接提供超级用户访问权限。

dbAdminAnyDatabase

仅在admin 数据库中使用,提供与dbAdmin相同的数据库管理操作访问权限,该角色还在整个群集上提供listDatabases操作。

root

尽在admin 数据库中使用,提供超级权限

二、创建管理员用户

超级管理员
  • 为了更安全的访问mongodb,需要访问者提供用户名和密码,于是需要在mongodb中创建用户
  • 采用了角色-用户-数据库的安全管理方式
  • 常用系统角色如下:
  • root:只在admin数据库中可用,超级账号,超级权限
  • Read:允许用户读取指定数据库
  • readWrite:允许用户读写指定数据库
  • 创建超级管理用户
use admin
db.createUser({
    user:'admin',
    pwd:'123',
    roles:[{role:'root',db:'admin'}]
})

三、启用安全认证

修改配置文件 mongodb.conf

vim /etc/mongod.conf

启用身份验证

注意:keys and values之间一定要加空格, 否则解析会报错

security:
  authorization: enabled

重启服务

  • 启动MongDB:systemctl start mongod.service
  • 停止MongDB:systemctl stop mongod.service
  • 重启mongodb:systemctl restart mongod.service

终端连接

mongo -u 'admin' -p '123' --authenticationDatabase 'admin'

查看创建的管理员账号

use admin
db.getUser("admin")

登录后进行验证

连接mongodb

mongo

进行验证

rs0:PRIMARY> use admin
switched to db admin
rs0:PRIMARY> db.auth("admin", "123" )
1

返回 '1’表示验证成功

注意:修改完配置文件一定要输入代码重启MongoDB数据库

安全验证问题参见此文:给你的mongodb设置密码吧!

四、创建普通用户

创建一个普通用户

  • 用户名:myTester
  • 密码:xyz123
  • 权限:读写数据库 test, 只读数据库 reporting。
use test
db.createUser(
  {
    user: "myTester",
    pwd: "xyz123",
    roles: [ { role: "readWrite", db: "test" },
             { role: "read", db: "reporting" } ]
  }
)

普通用户连接MongoDB实例

mongo --host 10.10.18.11 -u "myTester" --authenticationDatabase "test" -p'xyz123'

结果:

1 MongoDB shell version v4.0.10
2 connecting to: mongodb://10.10.18.11:27017/?authSource=test&gssapiServiceName=mongodb
3 Implicit session: session { "id" : UUID("3e9011ee-729f-4112-acd1-f5d1515490ac") }
4 MongoDB server version: 4.0.10

验证权限

在test集合中插入、查询数据

//插入数据
rs0:PRIMARY> db.test.insertOne({name:"sue",age:19,status:'p'})
{
        "acknowledged" : true,
        "insertedId" : ObjectId("5d00b364a75d40ae9b83c64c")
}
//查询数据
rs0:PRIMARY> db.test.find({name:"sue"})
{ "_id" : ObjectId("5d00b364a75d40ae9b83c64c"), "name" : "sue", "age" : 19, "status" : "p" }

五、普通用户管理

  • 使用超级管理员登录,然后进入用户管理操作
  • 查看当前数据库的用户
use test1
show users

创建普通用户

db.createUser({
    user:'t1',
    pwd:'123',
    roles:[{role:'readWrite',db:'test1'}]
})

终端连接

mongo -u t1 -p 123 --authenticationDatabase test1

切换数据库,执行命令查看效果

修改用户:可以修改pwd、roles属性

db.updateUser('t1',{pwd:'456'})

参考文章:

  • MongoDB用户和密码登录
  • mongodb的管理员和安全认证