最近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" }