Docker是目前主流的一种容器技术。为了解决多用户同时访问Docker时产生的安全问题,Docker设计了访问控制插件(Authorization Plugin,见官方文档)这一机制,通过对Docker请求进行过滤,来实现对Docker的权限管理。
这里需要注意,Docker并没有自己设计一套权限管理机制,而是设计了一套权限管理插件的机制,允许第三方的开发者自行设计权限管理的架构、模型、策略格式,然后通过统一的插件接口接入Docker,为Docker提供权限管理的服务,非常的灵活。这个插件机制的设计思想其实很简单,就是每当Docker daemon接收到一个访问请求时,就会把这个请求的context信息(访问者、资源、动作
三元组)发送给Authorization Plugin,Authorization Plugin自己判断一下是否允许这个请求,然后向Docker daemon返回结果,allow or deny,即是否允许这个请求的访问。具体的插件接口格式,大家可以参考上面的文档,这里不再赘述。
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上已经2400+ stars,已成为Go语言Access Control领域排名第一的项目
。下面则是Casbin及其作者的相关信息:
源码:https://github.com/casbin/casbin
官网:http://casbin.org/
在线策略编辑器:http://casbin.org/editor/
官方QQ群:546057381
下面列举了Casbin项目主要的一些特点:
目前,Casbin已在150个开源项目获得应用,知名的有:
更详细的应用情况,大家可以在这里看到: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
p
代表授权策略,后面就是允许执行的URL和HTTP method,整个策略文件的含义就是:允许任何人访问/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权限管理的好处:
learn once, use everywhere
语法高亮、自动完成、实时语法检查,在线模拟执行
等多个功能,基本达到了IDE的级别,对开发者非常友好。相比传统的安全策略复杂的配置过程,通过该GUI界面进行策略设计、编辑,可以显著降低学习Casbin难度。下面是Casbin Online Editor界面的截图:最后,欢迎大家加入Casbin讨论QQ群:546057381(或扫下方二维码),有疑问的话,在群里可以获得及时解答。谢谢!