为独立运行的 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
]
}
)