1. 程式人生 > >MongoDB 許可權控制系統簡介

MongoDB 許可權控制系統簡介

MongoDB 許可權控制系統簡介

許可權概念

要想理解清楚MongoDB的許可權必須先了解如下一些關鍵字

user

即使用者,用於提供客戶端連線MongoDB的認證賬戶

role

即角色,資料許可權的集合,建立使用者的時候必須要指定對應的角色,否則使用者無法操作資料庫

resource

即資源,包括database或collection也可以是database和collection的組合

例如:

{ db: <database>, collection: <collection> }

當然你也可能看到一種特殊的資源:

 {"cluster" : true}

它其實表示的是全域性資源

actions

即許可權操作,"actions" 定義了"user"能夠對 "resource document"執行的操作

例如,增刪改查包括如下操作:

find、insert、remove、update

privilege

即許可權,"privilege" 是一組"resource" 和 "actions" 的組合

authenticationDatabase

認證庫,即建立角色或使用者時所在的庫

例如,在 admin 下建立了 MongoDB 使用者那麼登陸的時候需要指定認證庫

mongo -u mongo -p xxx --host xxx --port xxx --authenticationDatabase=admin 

 

角色

MongoDB 裡角色分為 ”內建角色“ 和 ”使用者自定義“ 角色兩種,內建角色是 MongoDB 為了方便使用者管理和內部操作進行的預定義的一些角色具體見文末連線:MongoDB內建角色介紹

多數時候為了精細化許可權控制 MongoDB 的內建角色無法滿足我們的需求,因此需要 DBA 自定義角色來進行更加詳細的許可權控制。

 

建立角色

use admin ; // 進入名為admin的資料庫下,下同

db.createRole(

       { role:"testrole", //角色名稱

       privileges: [ // 許可權集

                  {

                     resource: //資源 {

                             db:"lidan",     // 建立的testrole角色具有對lidan庫的操作許可權,具體許可權建actions

                             collection:""   // lidan庫下對應的集合名 如果為"" 表示所有集合

                },

                     actions: [ "find", "insert", "remove","update" ]   //角色可進行的操作,注意這裡是一個數組

                   }

                  ],

         roles: [ ] // 是否繼承其他的角色,如果指定了其他角色那麼新建立的角色自動繼承對應其他角色的所有許可權,該引數必須顯示指定

       }

)

上述語句在 admin 庫裡建立了一個名為 testrole的角色,該角色具有對資料庫lidan下的所有集合進行 find、insert、remove、update的操作的許可權。

 

角色建立完畢後 MongoDB 會在系統庫 admin 下建立一個系統collection名叫system.roles  裡面儲存的即是角色相關的資訊。

可以使用如下語句進行檢視:

db.system.roles.find();

另外, MongoDB 所有許可權操作列表詳見文末連線:MongoDB 許可權操作列表

 

檢視角色

use admin; // 資料庫必須是建立所要檢視角色時的資料庫,下同

db.getRole( 

            "testrole", //要檢視角色的名字

            { 

               showPrivileges: true   //指定檢視角色資訊的時候是否顯示它所擁有的許可權資訊,也可不指定

            } 

          )

 

 

角色繼承

use admin;

//角色繼承

db.grantRolesToRole(  

                     "testrole",

                     [ "otherrole1","otherrole2" ] // 將 otherrole1、otherrole2 兩個角色(假設之前已經建立好)的許可權授予testrole角色

                    )

//角色許可權回收

db.revokeRolesFromRole(

                         "testrole" ,

                         [ "otherrole2" ] // 撤銷testrole角色從otherrole2角色所繼承的所有許可權

                      )

 

 

角色授權

use admin;

db.grantPrivilegesToRole(

    "testrole",

        [

        {

            resource: //許可權可操作的資源

               {

                    db:"lidan_1",  // 授予testrole角色具有操作lidan_1庫的許可權

                    collection:"" // lidan_1庫下的集合 如果為"" 表示所有集合

                },                                                 

            actions:  // 許可權允許的操作

            [ "createCollection", "dropCollection","convertToCapped"] //許可權可進行的操作

        } 

        ]

)

執行完操作後testrole角色便可以對庫lidan_1下的所有集合進行 "createCollection", "dropCollection","convertToCapped" 操作。

 

角色許可權回收

use admin;

db.revokePrivilegesFromRole(

      "testrole",

      [

          {

              resource: //許可權可操作的資源

              {

                  db:"lidan_1",  // 回收角色對庫lidan_1的actions 操作許可權

                  collection:"" //  lidan_1庫下所有的集合 如果為"" 表示所有集合

              },                                                 

              actions:  // 許可權允許的操作

                  [ "createCollection", "dropCollection","convertToCapped"] //需要回收的許可權

              } 

      ]

)

執行完操作後testrole角色對庫lidan_1下的所有集合無法進行 "createCollection", "dropCollection","convertToCapped" 操作。

 

刪除角色

use admin;

db.dropRole("testrole") // 刪除角色比較簡單直接指定要刪除角色的名稱即可

其他關於角色的對應操作請參考文末連線:MongoDB角色管理方法

 

使用者

建立使用者

MongoDB 建立使用者時可以指定內建角色也可以使用使用者自定義角色,DBA 可以根據需求自行決定(注意:使用者不允許在local庫下建立使用者)

user admin;

// 指定內建角色來建立使用者

db.createUser(

    {

        user:'mongo', // 使用者名稱

        pwd:'123',    // 密碼

        roles:[ 

                  {

                      role:'root',// 通過指定內建角色root 來建立使用者

                      db:'admin'  // 指定角色對應的認證資料庫,內建角色通常認證庫為admin

                  }

              ]

    }

) ;

 

// 指定自定義角色來建立使用者,這裡是在admin下建立的使用者故認證庫也是admin

db.createUser(

    {  

        user:"mongo",// 使用者名稱

        pwd:"123",   // 密碼

        roles:["testrole"] //通過指定使用者自定義角色來建立使用者,注意這裡是陣列

    }

使用者建立成功後可以使用如下語句登陸:

mongo   -u mongo -p 123 --host 127.0.0.1 --port 9999 --authenticationDatabase=admin 

 

檢視使用者

use admin;

db.getUser("mongo") // 檢視使用者比較簡單隻需要指定使用者名稱即可

 

為使用者 新增/回收 角色

use admin;

//為使用者新增角色

db.grantRolesToUser(

    "mongo", // 使用者名稱

        [ 

            { role: "testrole", // 需要新增的角色名 

                db: "admin" // 角色對應的認證庫,即角色建立時所在的資料庫

            } 

        ]

)

//對使用者的角色進行回收,如果將使用者所有的角色都回收完畢,那麼使用者只有對所屬庫的連線許可權

db.revokeRolesFromUser(

    "mongo", // 使用者名稱

        [ 

            { role: "testrole", // 需要回收的角色名 

                db: "admin" // 角色對應的認證庫,即角色建立時所在的資料庫

            } 

        ]

)

 

刪除使用者

use admin;

db.dropUser("mongo"); // 刪除使用者比較簡單直接指定使用者名稱即可

另外,除上述對使用者的操作方法外還有其他對使用者的管理方法。這裡就不一一列舉可詳見文末連線:MongoDB 使用者管理方法

 

注意事項

 

在 MongoDB 中刪除庫和集合並不會級聯刪除對應的角色和使用者。因此如果想徹底刪除對應的業務庫因該先刪除庫及其對應的角色和使用者。

 

 

如果既想實現精細化許可權控制又想簡化使用者管理,原則上建議只給開發建立一個賬戶,並且使用 admin 做認證庫,這樣可避免清理過期業務庫而導致無法登陸的問題。

 

 

相關連線  :

MongoDB 內建角色介紹:

https://docs.mongodb.org/manual/reference/built-in-roles/

MongoDB  許可權操作列表:

https://docs.mongodb.org/manual/reference/privilege-actions/#security-user-actions

MongoDB 角色管理方法:

https://docs.mongodb.org/manual/reference/method/js-role-management/

MongoDB  使用者管理方法:

https://docs.mongodb.org/manual/reference/method/js-user-management/