mongodb賬戶授權管理

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

以上是我實踐中成功的案例,下面是實踐中踩到的一些坑

  1. 授權必須在被授權的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"
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章