mongodb账户授权管理
最近mongodb出现了较多的权限事故,远的有国外的信用卡信息泄露,近的有国内用户人脸识别数据库被脱裤,原因都是使用了未加权限管理的mongodb数据库,导致在公网可以直接通过ip加端口的方式访问。最近我们新开的一个项目也是用了mongodb,为了避免自己成为背锅侠,我也不得已实践一遍mongodb的用户权限管理。要想对db授权, 首先要搞清楚mongodb的角色种类:Read:允许用户读取指定数据库readWrite:允许用户读写指定数据库dbAdmin:允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profileuserAdmin:允许用户向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;financialAssetFlowproductDetailproductList> 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”} ...