Docker是目前主流的一種容器技術。為了解決多使用者同時通路Docker時産生的安全問題,Docker設計了通路控制插件(Authorization Plugin,見官方文檔)這一機制,通過對Docker請求進行過濾,來實作對Docker的權限管理。
這裡需要注意,Docker并沒有自己設計一套權限管理機制,而是設計了一套權限管理插件的機制,允許第三方的開發者自行設計權限管理的架構、模型、政策格式,然後通過統一的插件接口接入Docker,為Docker提供權限管理的服務,非常的靈活。這個插件機制的設計思想其實很簡單,就是每當Docker daemon接收到一個通路請求時,就會把這個請求的context資訊(通路者、資源、動作三元組)發送給Authorization Plugin,Authorization Plugin自己判斷一下是否允許這個請求,然後向Docker daemon傳回結果,allow or deny,即是否允許這個請求的通路。具體的插件接口格式,大家可以參考上面的文檔,這裡不再贅述。
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAjM2EzLcd3LcJzLcJzdllmVldWYtl2PnVGcq5CakB3MyInM1NWevwVO0QDO2ITMtUGall3LcVmdhNXLwRHdo9CXt92YucWbpRWdvx2Yx5yazF2Lc9CX6MHc0RHaiojIsJye.jpeg)
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界面的截圖:
最後,歡迎大家留言讨論,謝謝!
*本文作者:hsluoyz,轉載請注明來自FreeBuf.COM