MongoDB 用户与权限管理
MongoDB 用户与权限管理
MongoDB 权限管理
MongoDB 提供了各种特性,比如身份验证、访问控制、加密,以确保 MongoDB 的部署安全。
只要涉及安全一般考虑如下两个方面:
权限管理 = 认证( Authentication ) + 授权( Authorization )
-
认证:就是身份验证,验证输入的账号和密码对不对,核查系统注册过这个用户没
-
授权:通过认证的用户在系统中的是什么角色(如业务管理员、账务管理员、日志管理员、普通用户、VIP 用户等),
该角色在系统中有哪些权限
授权方式:Mongodb 是使用角色的方式进行授权
MongoDB 内置角色
MongoDB 提供了很多内置角色,不同的角色拥有不同的访问数据库权限
-
系统内置用户角色
大部分内置的角色对所有数据库共用,少部分仅对admin生效
-
数据库用户类角色
- read :非系统集合有查询权限
- readWrite :非系统集合有查询和修改权限
-
数据库管理类
-
dbAdmin :数据库管理相关,比如索引管理,schema管理,统计收集等,不包括用户和角色管理
-
dbOwner :提供数据库管理,读写权限,用户和角色管理相关功能
-
userAdmin :提供数据库用户和角色管理相关功能
-
-
集群管理类
- clusterAdmin :提供最大集群管理权限
- clusterManager :提供集群管理和监控权限
- clusterMonitor :提供对监控工具只读权限
- hostManager :提供监控和管理severs权限
-
备份和恢复类
- backup :提供数据库备份权限
- restore :提供数据恢复权限
-
All-Database类
- readAnyDatabase :提供读取所有数据库的权限除了local和config数据库之外
- readWriteAnyDatabase :和readAnyDatabase一样,除了增加了写权限
- userAdminAnyDatabase :管理用户所有数据库权限,单个数据库权限和userAdmin角色一样
-
dbAdminAnyDatabase :提供所有用户管理权限,除了local,config
-
超级用户类
- root :数据库所有权限
-
内部角色
- __system :提供数据库所有对象任何操作的权限,不能分配给用户,非常危险
创建超级用户
只有超级用户才有权限创建普通用户,所以需要先创建超级用户
- 关闭访问权限模式启动 MongoDB 服务器
[root@node-01 mongodb-4.2.7]# vi config/mongodb.conf
#关闭权限验证
auth=false
[root@node-01 mongodb-4.2.7]# bin/mongod -f config/mongodb.conf
- 启动 MongoDB shell 客户端并创建超级用户
# 切换到 admin 数据库
> use admin
switched to db admin
# 查看当前数据库
> db
admin
# 创建数据库 admin 超级用户角色
> db.createUser({user: "root",pwd: "root",roles: [ { role: "userAdminAnyDatabase", db: "admin" }, "readWriteAnyDatabase" ]})
- user:用户名(root)
- pwd:密码(root)
- roles:用户角色组
- 角色1:userAdminAnyDatabase(管理用户所有数据库权限)
- 角色2:readWriteAnyDatabase(所有数据库读写权限)
- 开启访问权限模式启动 MongoDB 服务器
# 关闭 MongoDB 服务器
[root@node-01 mongodb-4.2.7]# bin/mongod --shutdown --dbpath data/db/
[root@node-01 mongodb-4.2.7]# vi config/mongodb.conf
#开启权限验证
auth=true
[root@node-01 mongodb-4.2.7]# bin/mongod -f config/mongodb.conf
- 用户管理员权限验证
> db
test
> db.users.insert({name:null})
WriteCommandError({
"ok" : 0,
"errmsg" : "command insert requires authentication",
"code" : 13,
"codeName" : "Unauthorized" #提示该没有写权限
})
>
> use admin
switched to db admin
# 验证用户管理员权限
> db.auth("root","root")
1 # 返回 1:代表成功, 0:代表失败
> use test
switched to db test
> db.users.insert({name:null}) # 超级用户root有读写数据库权限
WriteResult({ "nInserted" : 1 })
创建普通用户
一旦通过超级用户 root 身份验证,就可以使用 db.createUser() 创建普通用户。可以将任何内置角色或用户定义的角色分配给用户
> db.createUser({user: "binge",pwd: "123",roles: [ { role: "dbOwner", db: "test" }]})
普通用户登录 MongoDB shell 客户端
[root@node-01 mongodb-4.2.7]# bin/mongo --host node-01 --port 27017 -u "binge" -p "123" --authenticationDatabase "test"
>
- --host : 指定连接的 MongoDB 服务器 IP 地址
- --port:指定连接的 MongoDB 服务器端口
- -u:数据库用户名
- -p:数据库密码
- --authenticationDatabase:登录认证的数据库名(创建用户的数据库)
查看当前数据库所有用户
> show users
删除用户
# 删除当前数据库指定用户
> db.dropUser('test')
true
更新用户
> db.updateUser("binge",{
pwd:"12345",
customData:{
"title":"mongodb test"
}
})
更新用户密码
> db.changeUserPassword("binge","123")
查看用户信息
> db.getUser("test")
{
"_id" : "test.test",
"userId" : UUID("a941b4e9-a2af-4c1b-a5c4-03e924676555"),
"user" : "binge",
"db" : "test",
"roles" : [
{
"role" : "dbOwner",
"db" : "test"
}
],
"customData" : {
"title" : "mongodb test"
},
"mechanisms" : [
"SCRAM-SHA-1",
"SCRAM-SHA-256"
]
}
添加用户角色
> db.grantRolesToUser("binge",[ { role: "read", db: "test" }])
> show users
{
"_id" : "test.test",
"userId" : UUID("a941b4e9-a2af-4c1b-a5c4-03e924676555"),
"user" : "test",
"db" : "test",
"roles" : [
{
"role" : "read",
"db" : "test"
},
{
"role" : "dbOwner",
"db" : "test"
}
],
"customData" : {
"title" : "mongodb test"
},
"mechanisms" : [
"SCRAM-SHA-1",
"SCRAM-SHA-256"
]
}
删除用户角色
> db.revokeRolesFromUser("binge",[{ role: "read", db: "test" }])
自定义角色
> use admin
switched to db admin
> db
admin
> db.createRole(
{
role: "manageOpRole",
privileges: [
{ resource: { cluster: true }, actions: [ "killop", "inprog" ] },
{ resource: { db: "", collection: "" }, actions: [ "killCursors" ] }
],
roles: []
}
)
查看角色
> db.getRole("manageOpRole",{showPrivileges:true})