掘金 后端 ( ) • 2024-06-26 17:58

为独立运行的 MongoDB 实例启用访问控制,并使用基于角色的访问控制(RBAC)对 MongoDB 账号进行权限管理,以提高数据库安全。

系统环境:

1》Rocky Linux release 8.9 (kernel 4.18.0)

2》MongoDB Version 7.0.11

具体操作流程如下

启用身份验证

MongoDB 默认身份验证机制 SCRAM 根据用户名密码身份验证数据库来验证提供的用户凭据

1、配置文件,启用访问控制

# cat /etc/mongod.conf
security:
  authorization: enabled

2、使用 mongsh 连接 mongodb 实例,创建超级用户 root

use admin
db.createUser({
  user: "root",
  pwd: "root",
  roles: [{ role: "root", db: "admin" }]    // 赋予数据库 admin 上的 root 角色给用户 root
})

3、创建用户 jiawen,并授予角色 dbAdminAnyDatabase 、userAdminAnyDatabase 对应的权限

use admin
db.createUser(
  {
    user: "jiawen",
    pwd: passwordPrompt(), // 该方法会提示您输入密码,也可以直接将密码指定为字符串
    roles: [
      // 授予任意数据库管理权限
      { role: "dbAdminAnyDatabase", db: "admin" },
      // 授予任意数据库用户及角色管理权限
      { role: "userAdminAnyDatabase", db: "admin" }
    ]
  }
)

3、登录验证

mongosh --port 27017 -u "jiawen" -p -authenticationDatabase "admin"

内置角色 授权案列

基于 MongoDB 默认内置角色,创建具有不同权限的数据库账号

对指定数据库授权

在数据库 demo 上创建用户 user1,并对当前数据库 demo 进行授权

// 授予只读权限
use demo
demo> db.createUser({
        user: "user1",
        pwd: "pass",
        roles: [{ role: "read", db: "demo" }]  // 授予数据库 demo 上的 read 角色
    })

// 更新用户密码及授予读写权限
demo> db.updateUser("user1", {
        pwd: "password",
        roles: [{ role: "readWrite", db: "demo" }]
    })

demo> db.getUsers()         // 查看当前数据库上有哪些用户
demo> db.dropUser('user1')  // 删除指定用户

对多个数据库授权

在数据库 admin 上创建用户 user2,并赋予 user2 对数据库 demo01 、demo02 有读写权限,对 demo03 仅有只读权限

use admin
admin> db.createUser({
    user: "user2",
    pwd: "pass",
    roles: [
        { role: "readWrite", db: "demo01" },
        { role: "readWrite", db: "demo02" },
        { role: "read", db: "demo03" }
    ]
})

对任意数据库授权

在数据库 admin 上创建用户 user3,基于任意数据库赋予不同权限

use admin
admin> db.createUser({
      user: "user3",
      pwd: "pass",
      roles: [
      //   { role: "readAnyDatabase", db: "admin" }   // 对任意数据库授予读权限
      { role: "readWriteAnyDatabase", db: "admin" } // 对任意数据库授予读写权限
      ]
})

自定义角色 授权案列

1、在数据库 admin 上定义角色 crudManager ,该角色具有对任意数据库的增删改查权限,以及查看集合权限

use admin
admin> db.createRole(
   {
     role: "crudManager",
     privileges: [{
       resource: { db: "", collection: "" },
       actions: [ "insert", "remove", "update", "find", "listCollections" ]
     }],
     roles: []
   }
)

2、查看自定义角色及其权限

admin> db.getRoles({rolesInfo: 1, showPrivileges: true})

3、创建用户 user4 并赋予自定义角色 crudManager

admin> db.createUser(
  {
    user: "user4",
    pwd: "pass",
    roles: [
      { role: "crudManager", db: "admin" }   // 授予数据库 admin 上的角色 crudManager
    ]
  }
)