mongodb账户授权管理

36次阅读

共计 2024 个字符,预计需要花费 6 分钟才能阅读完成。

最近 mongodb 出现了较多的权限事故,远的有国外的信用卡信息泄露,近的有国内用户人脸识别数据库被脱裤,原因都是使用了未加权限管理的 mongodb 数据库,导致在公网可以直接通过 ip 加端口的方式访问。最近我们新开的一个项目也是用了 mongodb,为了避免自己成为背锅侠,我也不得已实践一遍 mongodb 的用户权限管理。
要想对 db 授权,首先要搞清楚 mongodb 的角色种类:
Read:允许用户读取指定数据库
readWrite:允许用户读写指定数据库
dbAdmin:允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问 system.profile
userAdmin:允许用户向 system.users 集合写入,可以找指定数据库里创建、删除和管理用户
clusterAdmin:只在 admin 数据库中可用,赋予用户所有分片和复制集相关函数的管理权限。
readAnyDatabase:只在 admin 数据库中可用,赋予用户所有数据库的读权限
readWriteAnyDatabase:只在 admin 数据库中可用,赋予用户所有数据库的读写权限
userAdminAnyDatabase:只在 admin 数据库中可用,赋予用户所有数据库的 userAdmin 权限
dbAdminAnyDatabase:只在 admin 数据库中可用,赋予用户所有数据库的 dbAdmin 权限。
root:只在 admin 数据库中可用。超级账号,超级权限
mongodb 给用户授权有两种方式 1. 在添加用户的时候授权
use order;
db.createUser(
{
user: “devweb-test3”,
pwd: “mmt-devweb”,
roles: [{ role: “dbAdmin”, db: “order”},{role: “readWrite”, db: “order”} ]
}
);
2. 创建用户后给用户添加权限
use order;
db.grantRolesToUser(“devweb-test3” , [ { role: “dbOwner”, db: “order”} ])
删除用户
use order;
db.dropUser(‘devweb-test3’);
回收用户权限
use order;
db.revokeRolesFromUser(“devweb-test3” , [ { role: “readWrite”, db: “order”} ])
以上是我实践中成功的案例,下面是实践中踩到的一些坑
授权必须在被授权的 db 中进行,否则授权无效 (我的 mongo 版本是 4.0.7)
use admin;
switched to db admin
> db.createUser(
… {
… user: “devweb-test3”,
… pwd: “mmt-devweb”,
… roles: [{ role: “dbAdmin”, db: “order”},{role: “readWrite”, db: “order”} ]
… }
… );
Successfully added user: {
“user” : “devweb-test3”,
“roles” : [
{
“role” : “dbAdmin”,
“db” : “order”
},
{
“role” : “readWrite”,
“db” : “order”
}
]
}
然后在另外一个终端登录进行认证
db.logout();
{“ok” : 1}
> db.auth(‘devweb-test3′,’mmt-devweb’);
Error: Authentication failed.
2. 仅仅给用户添加 adAdmin 角色仍然无法访问 db, 还需要 readWrite 角色
db.createUser(
… {
… user: “devweb-test”,
… pwd: “mmt-devweb”,
… roles: [{ role: “dbAdmin”, db: “order”} ]
… }
… );
Successfully added user: {
“user” : “devweb-test”,
“roles” : [
{
“role” : “dbAdmin”,
“db” : “order”
}
]
}
在另外一个终端进行登录授权
db.auth(‘devweb-test’,’mmt-devweb’);
1
> show collections;
financialAssetFlow
productDetail
productList
> db.financialAssetFlow.find().pretty();
Error: error: {
“ok” : 0,
“errmsg” : “not authorized on order to execute command {find: \”financialAssetFlow\”, filter: {}, lsid: {id: UUID(\”676a5042-0c80-4b79-9e8a-d91b63e80199\”) }, $db: \”order\” }”,
“code” : 13,
“codeName” : “Unauthorized”
}

正文完
 0