当咱们在应用 Apache APISIX 时,可能想要在利用里增加简单的受权逻辑。在此篇文章中,咱们将应用 Apache APISIX 的内置 Casbin 插件(authz-casbin)来实现基于角色的访问控制(RBAC)模型。
介绍
Apache APISIX
Apache APISIX 是一个动静、实时、高性能的 API 网关,提供负载平衡、动静上游、灰度公布、精细化路由、限流限速、服务降级、服务熔断、身份认证、可观测性等数百项性能。你能够应用 Apache APISIX 来解决传统的南北向流量,以及服务间的东西向流量,也能够当做 k8s ingress controller 来应用。
Casbin
Casbin 是一个弱小的、高效的开源访问控制框架,其权限管理机制反对多种访问控制模型。
authz-casbin 插件介绍
在 Apache APISIX 的应用中,路由匹配和申请受权之间有个隐含的矛盾点:为了更高细粒度的权限管制,须要配置更高细粒度的路由,来精准辨认申请并对申请进行受权。在简单的受权模型场景下,这将导致路由数量成倍增加,加剧了运维复杂度。authz-casbin 是一个基于 lua-casbin 的 Apache APISIX 插件,反对基于各种拜访模型的弱小受权。Casbin 是一个弱小的、高效的开源访问控制框架,反对 ACL、RBAC、ABAC 等访问控制模型,lua-casbin 是 Casbin 访问控制框架的 Lua 版本实现。authz-casbin 插件能够把路由匹配和申请受权这两个性能很好地进行解耦,你能够将各种受权拜访模型加载到 Apache APISIX 中,借助 lua-casbin 实现高效简单的受权模式。
留神:如果你想要实现身份验证(authentication),你须要应用其余插件或者本人来配置实现验证用户身份,比方 jwt-auth 插件。
authz-casbin 使用指南
创立一个模型
authz-casbin 插件应用三个参数来进行受权:subject、object 和 action。subject 是用户名,代指申请中的用户;object 是将要被拜访的 URL 链接也就是将被拜访的资源;action 是申请受权的行为,比方读操作(read)或者是写操作(write)。如果,咱们想要创立一个模型来拜访三个资源:/,/res1,/res2,咱们想要一个相似于这样的模型:
在这个模型中,所有的用户,例如 Jack,能够拜访主页面(/)。而像 Alice 和 Bob 具备管理员权限的用户则能够拜访所有的页面和资源(/res1,/res2,/)。这样,咱们就须要来限度没有管理员权限的用户只能应用 GET 申请办法拜访特定的资源。所须要的模型如下:
[request_definition]
r = sub, obj, act
[policy_definition]
p = sub, obj, act
[role_definition]
g = _, _
[policy_effect]
e = some(where (p.eft == allow))
[matchers]
m = (g(r.sub, p.sub) || keyMatch(r.sub, p.sub)) && keyMatch(r.obj, p.obj) && keyMatch(r.act, p.act)
创立一条策略
从上述的例子来看,策略应该像是这样的:
p, *, /, GET
p, admin, *, *
g, alice, admin
g, bob,admin
模型里的 matcher 表明:
(g(r.sub, p.sub) || keyMatch(r.sub, p.sub))
:申请里的 subject 和策略里的 subject 有着雷同的角色或者申请里的 subject 和策略里的 subject 能够通过内置的办法keyMatch
匹配。keyMatch
作为 Lua Casbin 的内置函数,相干的形容以及更多的函数可跳转 lua-casbin (https://github.com/casbin/lua…)。keyMatch(r.obj, p.obj)
:申请里的 object 和策略里的 object 可互相匹配(代指 URL 链接)。keyMatch(r.act, p.act)
:申请里的 action 和策略里的 action 可互相匹配(代指 HTTP 申请办法)。
在路由上应用插件
一旦你创立了模型和策略,你能够应用 APISIX Admin API 在路由上应用。若想应用,你能够模型和策略的文件门路:
curl http://127.0.0.1:9080/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '{"plugins": {"authz-casbin": {"model_path":"/path/to/model.conf","policy_path":"/path/to/policy.csv","username":"user"}
},
"upstream": {
"nodes": {"127.0.0.1:1980": 1},
"type": "roundrobin"
},
"uri": "/*"
}'
在这里,username 是传递到 subject 里的用户名。例如,你能够设置 "username":"user"
来把你定义的 "user":"alice"
传递到 username,让 username 成为 Alice。同样,你能够将模型和策略间接放到外面:
curl http://127.0.0.1:9080/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '{"plugins": {"authz-casbin": {"model":"[request_definition]
r = sub, obj, act
[policy_definition]
p = sub, obj, act
[role_definition]
g = _, _
[policy_effect]
e = some(where (p.eft == allow))
[matchers]
m = (g(r.sub, p.sub) || keyMatch(r.sub, p.sub)) && keyMatch(r.obj, p.obj) && keyMatch(r.act, p.act)","policy":"p, *, /, GET
p, admin, *, *
g, alice, admin","username":"user"
}
},
"upstream": {
"nodes": {"127.0.0.1:1980": 1},
"type": "roundrobin"
},
"uri": "/*"
}'
利用全局模型 / 策略应用插件
在一些情景中,你可能想要在多个路由中应用雷同的模型和策略,你能够首先发送一个 PUT 申请将模型和策略的配置发送到插件的元数据:
curl <http://127.0.0.1:9080/apisix/admin/plugin_metadata/authz-casbin> -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -i -X PUT -d '{"model":"[request_definition]
r = sub, obj, act
[policy_definition]
p = sub, obj, act
[role_definition]
g = _, _
[policy_effect]
e = some(where (p.eft == allow))
[matchers]
m = (g(r.sub, p.sub) || keyMatch(r.sub, p.sub)) && keyMatch(r.obj, p.obj) && keyMatch(r.act, p.act)","policy":"p, *, /, GET
p, admin, *, *
g, alice, admin
g, bob, admin"}'
而后,你须要应用 Admin API 来发送申请使得多个路由应用雷同的模型 / 策略配置;
curl http://127.0.0.1:9080/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '{"plugins": {"authz-casbin": {"username":"user"}
},
"upstream": {
"nodes": {"127.0.0.1:1980": 1},
"type": "roundrobin"
},
"uri": "/*"
}'
这将会将插件的配置动静地增加到路由中。通过向插件的配置数据中发送更新模型和策略的申请,你能够轻松地更新插件的配置。
最初
感激 Casbin 和 Apache APISIX 社区的开发者们,从 Casbin 社区的开发者 rushitote 提出 issue,提交 PR,到 Apache APISIX 社区的开发者们踊跃地 review PR,这个跨社区的单干敌对而有序地向前推动,响应 open source makes world better。
authz-casbin 插件:https://github.com/apache/api…
对于 Apache APISIX
Apache APISIX 是一个动静、实时、高性能的开源 API 网关,提供负载平衡、动静上游、灰度公布、服务熔断、身份认证、可观测性等丰盛的流量治理性能。Apache APISIX 能够帮忙企业疾速、平安的解决 API 和微服务流量,包含网关、Kubernetes Ingress 和服务网格等。
寰球已有数百家企业应用 Apache APISIX 解决要害业务流量,涵盖金融、互联网、制作、批发、运营商等等,比方美国航空航天局(NASA)、欧盟的数字工厂、中国航信、中国移动、腾讯、华为、微博、网易、贝壳找房、360、泰康、奈雪的茶等。
200 余位贡献者,一起缔造了 Apache APISIX 这个世界上最沉闷的开源网关我的项目。聪慧的开发者们!快来退出这个沉闷而多样化的社区,一起来给这个世界带来更多美妙的货色吧!
- Apache APISIX GitHub:https://github.com/apache/apisix
- Apache APISIX 官网:https://apisix.apache.org/
- Apache APISIX 文档:https://apisix.apache.org/zh/…