V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
hsluoyz
V2EX  ›  Docker

Casbin-authz-plugin:基于 Casbin 的 Docker 权限管理、访问控制插件

  •  
  •   hsluoyz · 2018-07-01 14:37:11 +08:00 · 2727 次点击
    这是一个创建于 2337 天前的主题,其中的信息可能已经有所发展或是发生改变。

    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 项目主要的一些特点:

    1. 支持多语言:Go + Java,Java 版本的叫做jCasbin,保持与 Casbin 一致的接口;
    2. 获美国身份管理与认证创业公司 Auth0 ([2018 年 5 月 17 日,该公司获得 D 轮 5500 万美元融资];( http://www.yidianzixun.com/article/0J5VMI4t))的赞助,并且有进一步合作意向;
    3. 支持多种访问控制模型:ACL、RBAC、ABAC、RESTful ;
    4. 支持 16 种策略存储插件( Storage Adapter );
    5. 支持 2 种分布式插件( Watcher );
    6. 支持 4 种角色管理插件( Role Manager )。

    目前,Casbin 已在 150 个开源项目获得应用,知名的有:

    1. Intel 的 RMD 项目:Intel 公司的资源管理服务,用来管理 Intel CPU 相关的硬件资源;
    2. VMware 的 Dispatch 项目:部署 Serverless 服务的应用框架平台;
    3. 法国电信公司 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
    

    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 权限管理的好处:

    1. Casbin 权限管理灵活度高,可定制性强,几乎能满足任何苛刻、复杂的权限管理需求,这样就省的开发者自己编写一套权限管理的逻辑了,方便开发者把精力集中在其他业务逻辑的部分。
    2. Casbin 有完善的测试用例,产生的结果正确性有保证。自己手写权限控制的逻辑,则难免会有出错。
    3. Casbin 应用广泛,基本支持了所有的 Golang Web 框架,如 Beego、Gin、Revel、Echo 等等。同时 Casbin 还包含 Java 版本:jCasbin 和 PHP 版本:PHP-Casbin。帮助开发者实现:learn once, use everywhere
    4. Casbin 支持图形化的 Web 策略编辑:Casbin Online Editor ( http://casbin.org/editor/)。其支持对 Casbin 模型和策略的编辑,并且支持语法高亮、自动完成、实时语法检查,在线模拟执行等多个功能,基本达到了 IDE 的级别,对开发者非常友好。相比传统的安全策略复杂的配置过程,通过该 GUI 界面进行策略设计、编辑,可以显著降低学习 Casbin 难度。下面是 Casbin Online Editor 界面的截图:

    这里写图片描述

    最后,欢迎大家加入 Casbin 讨论 QQ 群:546057381 (或扫下方二维码),有疑问的话,在群里可以获得及时解答。谢谢!

    这里写图片描述

    5 条回复    2018-07-19 21:52:11 +08:00
    mritd
        1
    mritd  
       2018-07-02 09:31:25 +08:00 via iPhone
    说实话,可能是我英语渣,这个库文档我看了两天也没看懂,翻了翻 issue 发现也有人喷,如果楼主是作者,烦请更新下文档,我到至今也没找到那些表达式语法在哪
    heww
        2
    heww  
       2018-07-10 19:18:42 +08:00
    @mritd #1 感觉就是在单机上控制 docker api 权限的东西
    hsluoyz
        3
    hsluoyz  
    OP
       2018-07-19 17:03:38 +08:00
    @mritd 这里是文档哦,不过是英文的: https://github.com/casbin/casbin/wiki

    如果需要中文资料的,可以加入 QQ 群:546057381,里面有中文资料分享~
    hsluoyz
        4
    hsluoyz  
    OP
       2018-07-19 17:05:03 +08:00
    @heww 确实差不多,但是 Docker 对于 Authorization Plugin 的定位就是这样的,Casbin 只是让这个功能更简化而已。如果 Docker 有其他地方也可以做权限管理,欢迎指出哈,Casbin 也可以做。
    heww
        5
    heww  
       2018-07-19 21:52:11 +08:00
    @hsluoyz #4 😄我们这边用 casbin 做 API 的权限管理,真实超级简单好用。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1045 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 23:20 · PVG 07:20 · LAX 15:20 · JFK 18:20
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.