天天看點

MongoDB權限管理代碼分析

本文主要介紹mongodb rbac(role based access control)權限管理機制,其核心是給每個使用者賦予一定的權限,使用者連接配接mongodb前需先驗證,驗證通過後即擁有使用者的權限,權限決定了使用者在某一組資源(如某個db、某個特定集合)上可以執行哪些操作(比如增删改查、建索引)。

db/auth/action_types.txt檔案裡包含mongo所有的action

actiontype代表一種操作,每個actiontype有一個唯一的id,role支援的所有操作通過actionset來描述,actionset實際是一個位圖,支援某種操作時,其id對應的bit置1.

actiontype相關的代碼是由一個python腳本動态生成的

resourcepattern代表資源(某個資料庫、某個集合等)比對方式,由資源名稱(db.collection格式,如果為空代表比對任意資源)及比對方式組成

權限(privilege)由resourcepattern及支援的actionset構成,代表可以在比對resourcepattern的資源上可以執行actionset裡的所有操作。

權限集合代表是一組權限的并集

往privilegevector裡添加previlege時,先檢查resourcepattern是否已經存在,如果已經存在,直接添加對應的actionset;如果不存在,則構造一個新的previlege添加到vector裡。

role代表『對某些資源(resource)可以執行哪些操作(action)』,每個role包含一個privilegevector,指定其擁有的權限。

為友善管理,mongodb已經内置了一組預先定義好的role,比如read、readwrite等,auth子產品裡已經實作好了構造對應權限的接口

每個role跟一個db(多個db)關聯,代表這個role能操作的資源(resource),由rolename唯一辨別。

每個user跟一個db關聯,由username唯一辨別,多個db下可能具有相同名字的user。每個user包含一組p

資料庫指令createuser用于建立新使用者,使用者建立時需指定使用者名、密碼及配置設定的權限資訊(actionset@resourcepattern),使用者的資訊會存儲在admin.system.users集合裡。

mongodb使用者也可直接通過insert、update、remove等直接操作admin.system.users集合,但強烈不建議這麼做,所有的使用者操作建議都通過createuser、updateuser、dropuser等資料庫指令來完成。

auth指令負責對連接配接進行認證,以确定該連接配接可以針對哪些資源執行什麼操作,同一個db可以被auth多次,以最終auth的使用者權限為準。

每個連接配接對應一個authorizationsession,存儲着連接配接上已認證驗證的使用者資訊

};

當mongod接受到使用者請求時,會根據請求對應的操作需要的權限,在_authenticatedusers進行比對,如果包含所需權限,則該操作可以繼續執行。

使用者建立連接配接後,就可以開始發送請求,針對集合的增删改查請求,主要包括op_insert、op_update、op_delete等,這些請求在authorizationsession對應檢查權限的方法。

還有一類請求是資料庫指令,比如createuser、listcollections、listdatabases等,這些都是資料庫指令,mongodb裡每個指令都繼承自command類,需實作run、checkauthforcommand等方法,其中checkauthforcommand用于檢查指令是否有權限執行;實際上就是檢查指令操作的db(或集合)及對應的操作類型是否在使用者的privilegevector裡。command的權限檢查通過後就會執行run函數,完成指令的主體執行邏輯。