基于Casbin的ABAC授权模型设计与开发踩坑实录
本文分享自天翼云开发者社区《基于Casbin的ABAC授权模型设计与开发踩坑实录》,作者:upclose
最近因项⽬需求,需要寻求⼀个好⽤强⼤的权限管理⽅案。天翼云安全实验室经过仔细调研,最终选择了ABAC(Attribute Based Access Control,基于标签的访问控制)作为授权模型的基础,在具体实现上则青睐于后起之秀Casbin。
ABAC被称为“下一代”授权模型,具有更细粒度的权限设定、更灵活的权限管理等优势。
Casbin是一个开源的权限管理框架,其主要优势有:
支持多种权限模型如ACL、RBAC、ABAC等;
支持多种语言,以Golang为主,同时支持java、PHP等;
活跃的社区和持续更新,这对于开源软件来说是很可贵的品质;
功能强大,上手也不复杂。
下面是一篇基于Casbin实现ABAC授权模型的避坑指南,负重前行只为你的岁月安好。
一、授权模型
虽然开篇就明确了使用ABAC,不过在此还是要多言两句,对历来经典授权模型进行一些介绍,也好说明为什么最终选择了使用ABAC。
二、ACL(Access Control Lists,访问控制列表)
用户A可以访问代码仓库。
所谓表,就形成了一一对应的关系,谁可以访问什么资源,都清楚列在表上。
ACL的优点是容易理解与实现。
ACL的缺点是需要维护的数据庞大,对于m个用户和n个资源,就会产生m*n的访问控制表。
三、RBAC(Role Based Access Control,基于角色的访问控制)
开发人员可以访问代码仓库。
RBAC之于ACL的一大改进,在于把用户聚类成了角色,而以角色的粒度进行权限管理。
RBAC的优点包括了ACL的优点,同时大幅度减小了需要维护的权限数据表。
RBAC的缺点则是缺乏灵活性,因为角色是管理用户最小粒度。
四、ABAC(Attribute Based Access Control,基于标签的访问控制)
9am-6pm之间可以访问代码仓库。
有了ACL和RBAC的前车之鉴,ABAC是在灵活性上下了功夫,提出基于标签进行授权管理,从而给授权管理这一历史性课题带来了动态性。相比与ACL中小明可以访问资源,以及RBAC中开发人员可以访问资源,ABAC中采用了上班时间在办公网络中可以访问资源的说法,而时间和网络环境则成为ABAC中作为授权决策的关键因素,即标签。
ABAC的优点是灵活性极大,不在拘泥于特定的对象,而是把审时度势的思考带入到的权限管理中;不再维护巨大的角色-资源对应表也是其一大优势。
ABAC的缺点在于门槛较高,因为标签这一概念并不直观,维护工作也往往需要专门的人员才能进行。
五、PBAC(Policy Based Access Control,基于策略的访问控制)
PBAC并不是学院提出的,更像民间的说法,是一种在ABAC的基础上增加策略的授权管理。然而ABAC并不是没有策略,ABAC的标签是需要策略才能执行的。所以笔者认为PBAC只是ABAC的另一种理解方式,而非新的授权模型。
六、PERM描述语言
PERM即Policy, Effect, Request, Matchers,是Casbin中用来描述授权模型的一门语言。基于PERM语言,就可以实现各种授权模型,而PERM也赋予了Casbin在各种传统授权模型上进行自定义改进的能力。
使用Casbin官方提供的在线编辑器可以实时进行PERM编写实验。
PERM中的四大元素含义如下:
Request:授权请求,至少需要包含请求者(sub)、请求资源(obj)和请求行为(act);
Policy:授权决策,与授权请求相匹配;
Effect:策略影响,决定策略的最终效果;
Matcher:授权模型的核心行为,描述了上述几大元素在模型中是如何协作完成授权工作。
Casbin提供了用PERM描述ABAC模型的示例代码:
[request_definition]
r = sub, obj, act
[policy_definition]
p = sub_rule, obj, act
[policy_effect]
e = some(where (p.eft == allow))
[matchers]
m = eval(p.sub_rule) && r.obj == p.obj && r.act == p.act
其中matcher最为值得注意,其由3个布尔判断构成。当授权请求到来时,r.obj == p.obj
和r.act == p.act
用于通过请求的信息(r)查询得到对应的策略(p)。在得到策略之后,eval(p.sub_rule)
执行策略中配置的标签条件判断,从而得到最终的授权请求决策结果。
Casbin举例的ABAC策略如下:
p, r.sub.Age > 18 && r.sub.Age < 60, /data1, read
该策略在有用户请求对/data1
资源进行read
操作时生效,通过判断该请求者的Age标签是否在18-60的范围内,从而决策该请求者是否可以对/data1
进行访问。
七、Casbin实践
7.1 模型与策略设计
正如上文对ABAC的介绍,用一句话对ABAC的决策进行概括,可以举例为上班时间在办公网络中可以对代码仓库进行访问。其中代码仓库(例如gitlab.xxx.com)是obj,时间和网络环境是标签,分别为sub.Time和sub.IP,而访问行为就是access。
根据PERM的语法,针对代码仓库这一资源的访问策略可以写作:
p, r.sub.Time >= 9 && r.sub.Time <= 18 && r.sub.IP == 1.1.1.1, gitlab.xxx.com, access
当然在实际场景中,仅仅通过时间和IP进行访问控制并不灵活,但针对策略进行修改,不需要修改模型,就可以赋予该ABAC授权模型动态的能力,例如增加对用户访问行为的检测、 对授权失败的用户增加二次授权认证的策略等。
7.2 基于Casbin的ABAC模型构建
Casbin目前不支持MongoDB数据库,所以就先用MySQL。在Golang中需要使用xormadapter
与数据库进行交互:
// 连接MySQL数据库
mysqlString := fmt.Sprintf("%s:%s@tcp(%s:%d)/", mysqlUser, mysqlPassword, mysqlIP, mysqlPort)
a, err := xormadapter.NewAdapter("mysql", mysqlString)
if err != nil {
return errors.New("Connect to database error: " + err.Error())
}
Casbin数据库用来存储策略,也可以用来存储模型。不过模型一般不会修改(需要时常修改模型的设计一定有问题),所以模型可以直接硬编码在代码中:
// 创建ABAC模型
abacModel := `
[request_definition]
r = sub, obj, act
[policy_definition]
p = sub_rule, obj, act
[policy_effect]
e = some(where (p.eft == allow)) && !some(where (p.eft == deny))
[matchers]
m = r.obj == p.obj && r.act == p.act && eval(p.sub_rule)
`
m, _ := model.NewModelFromString(abacModel)
最后拥有了模型和数据库,Casbin就可以跑起来了:
// 创建引擎
enforcer, err = casbin.NewEnforcer(m, a)
// 加载策略
err = enforcer.LoadPolicy()
还需要添加策略,以上述通过时间和环境进行访问授权决策的策略为例:
rule := "r.sub.Time >= 9 && r.sub.Time <= 18 && r.sub.IP == 1.1.1.1"
object := "gitlab.xxx.com"
action := "access"
_, err := enforcer.AddPolicy(rule, object, action)
7.3 ABAC模型授权
在授权请求时需要首先定义请求者即sub,sub的字段名称需要和Policy中的定义一致(包括大小写):
type Subject struct {
Time int
IP string
}
最后在授权请求发生时,调用起Casbin的API对授权请求进行决策,在该过程中,Casbin会从数据库中找找符合的Policy,通过计算Policy中定义的规则,得到决策结果:
// 1. 根据授权请求,实例化请求者
sub := Subject{
Time: time.Now().Unix(),
IP: ip,
}
// 2. 调用ABAC引擎,计算用户访问授权结果
ok, _ := enforcer.Enforce(sub, obj, act)
基于Casbin的ABAC授权模型设计与开发踩坑实录的更多相关文章
- C# -- HttpWebRequest 和 HttpWebResponse 的使用 C#编写扫雷游戏 使用IIS调试ASP.NET网站程序 WCF入门教程 ASP.Net Core开发(踩坑)指南 ASP.Net Core Razor+AdminLTE 小试牛刀 webservice创建、部署和调用 .net接收post请求并把数据转为字典格式
C# -- HttpWebRequest 和 HttpWebResponse 的使用 C# -- HttpWebRequest 和 HttpWebResponse 的使用 结合使用HttpWebReq ...
- Taro 开发踩坑指南 (小程序,H5, RN)
Taro 开发踩坑指南 (小程序,H5, RN) css taro 如何展示多行文本省略号 https://www.cnblogs.com/xgqfrms/p/12569057.html UI 设计稿 ...
- 基于Casbin实现ABAC
最近同事在研究Casbin的权限设计,我们主要是考虑使用ABAC基于属性的访问控制,Casbin给的示例不多,于是自己写了几个示例. 首先我们看看提到ABAC时,一般描述如下: ABAC被一些人称为是 ...
- Spring Boot 开发系列一 开发踩坑
这是学习spring boot 的第二周,公司号称这玩意是啥都不会的新手就可以填空开发,于是决定上手一把,怎么说我也是搞了快七八年的.NET和.NETcore,没想到无情打脸,快被这个能填空开的IDE ...
- fibos开发踩坑集合
fibos.js API资料: 与eosjs相比,fibos.js没有添加新功能,可以在eosjs项目页面https://developers.eos.io/eosio-nodeos/referenc ...
- ASP.Net Core开发(踩坑)指南
ASP.NET与ASP.NET Core很类似,但它们之间存在一些细微区别以及ASP.NET Core中新增特性的使用方法,在此之前也写过一篇简单的对比文章ASP.NET MVC应用迁移到ASP.NE ...
- 基于Custom-metrics-apiserver实现Kubernetes的HPA(内含踩坑)
前言 这里要说一下Prometheus的检控指标从哪里来,它有3个渠道: 主机监控,也就是部署了Node Exporter组件的主机,它以DaemonSet或者系统进程的形式运行,Prometheus ...
- Visual Studio For MacOS .NetCore开发踩坑记
自从Visual Studio For MacOS公布以来,就开始尝试在Mac上进行net core开发.断断续续遇到了各种奇奇怪怪的问题.虽然大部分利用google查查(百度屁都查不出来),都能找 ...
- 微信小程序前端开发踩坑(一)
之前由于不了解微信小程序的整个的运行开发机制,走了很多的弯路,脑子灵光的可能不会遇到,这个主题系列的帖子希望可以帮助到像我一样理解能力慢的孩子. 不论是开发微信小程序还是说学习任何一门编程语言,最重要 ...
- uni-app开发踩坑记录
大部分问题是我在h5端看不到而在android.iOS平台上暴露出来的,不包含小程序 1.:class="['defaultStyle', dynamicStyle]" 不支持直接 ...
随机推荐
- 【Unity】改变游戏运行时Window的窗口标题
[Unity]改变游戏运行时Window的窗口标题 零.需求 Unity打包好的Windows程序,启动后如何更改窗口标题?因为看着英文的感觉不太好,故有此想法.什么?你说为啥不改项目产品名?产品名会 ...
- DelayQueue 底层原理
一.DelayQueue 底层原理 DelayQueue是一种本地延迟队列,比如希望我们的任务在5秒后执行,就可以使用DelayQueue实现.常见的使用场景有: 订单10分钟内未支付,就取消. 缓存 ...
- web自动化的鼠标操作
有些场景不适合点击或进行某些操作,可运用action类模拟鼠标操作.在操作一个页面元素时有时需要一连串的动作来配合的时候,可以使用action来完成. Actions actions= new Act ...
- (倍增)LCA学习笔记+做题记录
LCA学习笔记 LCA指最长公共子序列,可以使用倍增的方法求解(复杂度较优) 步骤 (1) 预处理 a. 求深度: 对于每个结点 \(dfs\) 预处理出结点深度; b. 求倍增祖先: 计算出每个结点 ...
- Web前端入门第 40 问:CSS float 浮动布局应用场景
CSS float 浮动属性最早用于文字环绕图片效果,就像传统报纸上的印刷排版一样. CSS2 的规范推动了浮动用于其他元素,float 便被大范围应用于布局,当年常说的 div + css 布局,f ...
- c#使用内存映射像处理内存一样去快速处理文件
在 .NET Core 中,`System.IO.MemoryMappedFiles.MemoryMappedFile` 类提供了对内存映射文件的支持.通过将文件映射到内存,你可以在应用程序中直接访问 ...
- centos7配置复杂度
CentOS7/RHEL7 开始使用pam_pwquality模块进行密码复杂度策略的控制管理.pam_pwquality替换了原来Centos6/RHEL6中的pam_cracklib模块,并向后兼 ...
- SpringBoot——yaml配置文件
yaml简介 YAML 是 "YAML Ain't a Markup Language"(YAML 不是一种标记语言).在开发的这种语言时,YAML 的意思其实是:"Ye ...
- 【笔记】reko 0.10.2 反编译工具安装和使用记录|(1) README.md
(翻译自README.md,并通过自己的实际操作情况重新整理了一遍) 笔者注:我已经成功地根据README.md下载了Release版本,也自己试了下从源码编译,跟着README都挺顺利的.如果操作过 ...
- P2150 [NOI2015] 寿司晚宴 题解
P2150 [NOI2015] 寿司晚宴 刚开始看错题了,推了一个与原题类似的 DP 方程,然后不会优化,笑了. 思路 首先看到 \(n\) 很小,然后质因子个数就更少了. 因此第一反应是将所有的质因 ...