天天看點

基于Casbin的Docker權限管理通路控制插件

Docker是目前主流的一種容器技術。為了解決多使用者同時通路Docker時産生的安全問題,Docker設計了通路控制插件(Authorization Plugin,見官方文檔)這一機制,通過對Docker請求進行過濾,來實作對Docker的權限管理。

這裡需要注意,Docker并沒有自己設計一套權限管理機制,而是設計了一套權限管理插件的機制,允許第三方的開發者自行設計權限管理的架構、模型、政策格式,然後通過統一的插件接口接入Docker,為Docker提供權限管理的服務,非常的靈活。這個插件機制的設計思想其實很簡單,就是每當Docker daemon接收到一個通路請求時,就會把這個請求的context資訊(通路者、資源、動作三元組)發送給Authorization Plugin,Authorization Plugin自己判斷一下是否允許這個請求,然後向Docker daemon傳回結果,allow or deny,即是否允許這個請求的通路。具體的插件接口格式,大家可以參考上面的文檔,這裡不再贅述。

基于Casbin的Docker權限管理通路控制插件

Casbin(https://github.com/casbin/casbin)作為目前Golang語言中最主流的通路控制、權限管理開源庫,也實作了一個Docker的Authorization Plugin,叫做:Casbin-authz-plugin。

這裡首先介紹一下Casbin項目。Casbin是一個國産開源項目,專注于解決Go語言中的權限管理問題。Casbin由北京大學羅楊博士在2017年4月發起,羅楊博士的研究方向為雲計算通路控制,目前已發表數十篇相關學術論文,曾經在ICWS、IEEE CLOUD、ICICS等多個頂級學術會議進行論文宣講。Casbin項目則是其研究成果的落地。目前經過一年多的發展,Casbin在GitHub上已經2500+ stars,已成為Go語言Access Control領域排名第一的項目。下面則是Casbin相關連結:

源碼:https://github.com/casbin/casbin

官網:http://casbin.org/

線上政策編輯器:http://casbin.org/editor/

下面列舉了Casbin項目主要的一些特點:

支援多語言:Go + Java,Java版本的叫做jCasbin,保持與Casbin一緻的接口;

獲美國身份管理與認證創業公司 Auth0 ([2018年5月17日,該公司獲得D輪5500萬美元融資];(http://www.yidianzixun.com/article/0J5VMI4t))的贊助,并且有進一步合作意向;

支援多種通路控制模型:ACL、RBAC、ABAC、RESTful;

支援16種政策存儲插件(Storage Adapter);

支援2種分布式插件(Watcher);

支援4種角色管理插件(Role Manager)。

目前,Casbin已在190+個開源項目獲得應用,知名的有:

Intel的RMD項目:Intel公司的資源管理服務,用來管理Intel CPU相關的硬體資源;

VMware的Dispatch項目:部署Serverless服務的應用架構平台;

法國電信公司Orange的Gobis項目:輕量級API網關項目。

更詳細的應用情況,大家可以在這裡看到:https://github.com/casbin/casbin#our-adopters。另外,在閉源、商業項目上的使用,因為無法統計,并沒有計入。但是據作者了解,Casbin已經在Cisco(思科)、Verizon(美國電信)等公司得到大規模實際應用。

以上是對Casbin項目的介紹,本文下面部分主要介紹Casbin的Docker插件的用法。

舉個例子:當你執行docker images這條指令時,其實你是執行了一條CLI指令,以images為參數執行了docker這個client。這個client會向Docker daemon發送一個類HTTP請求:

/v1.27/images/json, GET           

複制

其中/v1.27/images/json就是通路的URL路徑,GET就是HTTP method。Casbin插件通過查詢安全政策可以幫助你決定是否允許某使用者以GET動作通路/v1.27/images/json路徑。實際上,Casbin插件的本質就是做這樣一個簡單的事情。那麼,該如何判斷是否允許某個請求呢,這個具體邏輯就要涉及到Casbin的原理了,在Casbin插件的例子中,提供了一個政策檔案:basic_policy.csv,這個文本檔案隻含有一行内容:

p, /v1.27/images/json, GET           

複制

下面是一個禁止通路的例子:

$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
hello-world         latest              48b5124b2768        3 months ago        1.84 kB

$ docker info
Error response from daemon: authorization denied by plugin casbin-authz-plugin: Access denied by casbin plugin           

複制

我們可以看到,當執行docker info指令的時候,提示了禁止通路錯誤。這就說明,我們的Casbin插件産生了效果。

Casbin其實遠比上面的例子複雜,首先,可配置的内容就有兩大塊:模型檔案和政策檔案。在Casbin插件中,模型檔案的内容是:

[request_definition]
r = obj, act

[policy_definition]
p = obj, act

[policy_effect]
e = some(where (p.eft == allow))

[matchers]
m = r.obj == p.obj && r.act == p.act           

複制

政策檔案的内容是:

p, /_ping, GET
p, /v1.27/images/json, GET           

複制

模型檔案,可以了解為一套Casbin自己的腳本語言,被Casbin解釋執行,作為權限判斷的邏輯。政策檔案則提供具體的安全政策的文本。你可以把Casbin了解為一個程式,那麼模型檔案就是這個程式的代碼段,政策檔案就是這個程式的資料段。代碼在執行過程中,接受輸入,并對資料進行讀寫,最終産生輸出,其實本質上Casbin的通路控制就是這樣一個過程。

Casbin插件的安裝步驟因為比較瑣碎,這裡就不在介紹了,大家可以去GitHub源碼中檢視README文檔即可:https://github.com/casbin/casbin-authz-plugin

最後,列舉一下使用Casbin插件進行Docker權限管理的好處:

Casbin權限管理靈活度高,可定制性強,幾乎能滿足任何苛刻、複雜的權限管理需求,這樣就省的開發者自己編寫一套權限管理的邏輯了,友善開發者把精力集中在其他業務邏輯的部分。

Casbin有完善的測試用例,産生的結果正确性有保證。自己手寫權限控制的邏輯,則難免會有出錯。

Casbin應用廣泛,基本支援了所有的Golang Web架構,如Beego、Gin、Revel、Echo等等。同時Casbin還包含Java版本:jCasbin和PHP版本:PHP-Casbin。幫助開發者實作:learn once, use everywhere

Casbin支援圖形化的Web政策編輯:Casbin Online Editor (http://casbin.org/editor/)。其支援對Casbin模型和政策的編輯,并且支援文法高亮、自動完成、實時文法檢查,線上模拟執行等多個功能,基本達到了IDE的級别,對開發者非常友好。相比傳統的安全政策複雜的配置過程,通過該GUI界面進行政策設計、編輯,可以顯著降低學習Casbin難度。下面是Casbin Online Editor界面的截圖:

基于Casbin的Docker權限管理通路控制插件

最後,歡迎大家留言讨論,謝謝!

*本文作者:hsluoyz,轉載請注明來自FreeBuf.COM