最近mongodb出现了较多的权限事故,远的有国外的信用卡信息泄露,近的有国内用户人脸识别数据库被脱裤,缘由都是使用了未加权限管理的mongodb数据库,致使在公网能够直接经过ip加端口的方式访问。最近咱们新开的一个项目也是用了mongodb,为了不本身成为背锅侠,我也不得已实践一遍mongodb的用户权限管理。web
要想对db受权, 首先要搞清楚mongodb的角色种类: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" } ])
删除用户code
use order; db.dropUser('devweb-test3');
回收用户权限索引
use order; db.revokeRolesFromUser( "devweb-test3" , [ { role: "readWrite", db: "order" } ])
以上是我实践中成功的案例,下面是实践中踩到的一些坑ip
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" } ] }
而后在另一个终端登陆进行认证ci
db.logout(); { "ok" : 1 } > db.auth('devweb-test3','mmt-devweb'); Error: Authentication failed.
2.仅仅给用户添加adAdmin角色仍然没法访问db,还须要readWrite角色it
db.createUser( ... { ... user: "devweb-test", ... pwd: "mmt-devweb", ... roles: [ { role: "dbAdmin", db: "order" } ] ... } ... ); Successfully added user: { "user" : "devweb-test", "roles" : [ { "role" : "dbAdmin", "db" : "order" } ] }
在另一个终端进行登陆受权io
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" }