记ABAC的落地实践

news2024/11/26 14:27:45

为什么使用ABAC

一般提到授权,我们就会想到角色(role)。什么样的用户拥有什么样的角色可以怎么操作什么样的资源,这是我们普遍使用的权限系统的模型。这里的角色实质上是包含了一组用户操作资源的规则集合。一旦角色被创建,也就意味着有一组资源操作集合被固化起来,除非去修改角色,否则这个规则集合是不会变的。 比如在一个图书馆的图书管理系统中,所有读者都可以查看书籍及其不同的分类,图书管理员编辑图书信息,管理层可能要看一些图书借阅报表等。这些都可以给读者和图书管理员分配不同的角色就可以实现。在一个较大的图书馆,图书管理员可能分布在不同楼层或者管理不同类别的图书,所以我们需要创建多个图书管理员的角色,比如: 二楼图书管理员,或经济类图书管理员等。更大的图书馆可能会有出版社区分的管理员或者代理人员,因此会有更多基于出版社和图书分类的角色。随着该图书馆的不断扩大,业务职责越来越精细,会继续不断的创建新的角色,比如对于一个出版社在一个楼层的一个特定分类的按照出版时间进行不同角色管理,就会有 “出版社数 x 楼层数 x 楼层图书分类数 x 出版时间分类数” 的角色创建,如此下去,整个系统就会面临“角色爆炸”的窘态。

上述描述的就是基于角色的访问控制,简称RBAC(Role-Based Access Control)它他是一种静态的访问控制模型,主要用于一些基本的简单授权系统中。那如果我们需要更细粒度的访问控制,而又不想面临“角色爆炸”,基于属性的访问控制,简称ABAC(Attribute-Based Access Control)可以是一种选择。在ABAC的模型中没有角色的概念,也就没有“角色爆炸”,它是通过定义一系列的访问规则,利用当前用户操作相关资源的属性,动态的决定用户有没有权限操作该资源。当前著名的AWS IAM就是使用ABAC管理访问控制的,也称PBAC(Policy-Based Access Control)。

ABAC模型和框架

在ABAC的概念模型中,主要包含:

  • 访问者(Subject):指操作的发起者,可能是一个用户,或一个系统。
  • 受访者(Object):指操作的接受者,也就是访问目标资源,例如用户数据等。
  • 操作(Operation):即对受访者的操作,常见的增删改查等。
  • 属性(Attribute):指一组来自访问者,受访者,和操作相关的数据,也包含一些环境上下文数据。
  • 策略(Policy):指可以基于属性动态生成访问控制结果的预定义的一组规则。

但ABAC毕竟只是个模型,要真正实现它,最好依赖于一种成熟的框架。XACML(eXtensible Access Control Markup Language 可扩展的访问控制标记语言)是一个标准的ABAC框架,它详细的定义了ABAC中的每一个概念和实现方式。它定义的ABAC系统主要包含4个组件:

  • 策略执行点(PEP):最终执行策略结果的地方,决定要不要继续访问资源。
  • 策略决策点(PDP):通过策略和属性信息决定有无权限进行操作的地方。
  • 策略信息点(PIP):为执行决策提供额外属性的地方,可以是一个或者多个额外系统。
  • 策略管理点(PAP):管理和配置策略的地方。

其直接关系如下图:

image.png

ABAC的实现

有了XACML的框架支持,对于ABAC的实现,我们可以按需裁减。首先我们看下系统的结构图,这样更明确下我们ABAC系统的地位和职责。

image.png

我们可以把MyABAC 看作访问者与被访者之间的一个层,类似于apiGateway 或BFF,也可以看作是受访者的代理,类似于nginx等。暂且不管它是什么,他的职责就是拦截或者转发请求。明确了这一点之后, 我们用前后端的例子将其具象化:(这里的frontend 可以是一个UI,或一个服务等)

image.png

有了具象的实例,随后就可以按照XACML的框架,迭代式的完成相对应的组件。

迭代一: PEP

核心的功能在于PEP拦截和转发来自前端的请求。所以这个版本的MyABAC有两个基本功能,1: 判断请求权限,2: 转发或拒绝请求。对于拒绝请求,可以直接返回401, 对于转发请求,我们可以创建一个ProxyServer 完整的转发整个请求。但是对于判断请求权限,要怎么处理,根据什么判断呢?ABAC中的属性就是我们判断的数据源,目前我们能拿到的数据仅仅来自于请求本身或者当前环境的上下文(Context),所以我们用一段静态逻辑从请求本身获取一些属性,用一个简单的判断进行验证。为了能适应在不同的请求当中,可以这段获取请求属性的逻辑抽象成为一个组件,权且叫它为extractor. 那么我们就有了第一个版本:

image.png

迭代二: PEP + PDP

在上一个版本中我们已经实现了MyABAC 对请求的转发,和简单的基本判断。接下来可以逐渐丰富请求的判断。按照XACML的机构,PEP仅仅负责对鉴权结果的执行,对于鉴权真正的逻辑应该在PDP中执行。所以PDP中一个很重要的组件就是决策器(Decision Maker),我们选择’Permit’和’Deny’ 代表决策的结果。这样就可以在PEP 中设置一个PDP client, 将Extractor拿到的属性传递给PDP, 然后将PDP的结果给Validation来判断是否转发请求。PDP 拿到 PEP 传递的属性值之后不再是简单的判断,它将通过一系列的规则(Rule) ,每个规则都有自己的匹配条件(Condition)和结果(Effect), 不同的规则按一定的关系进行分组,每一组我们称之为一个策略(Policy). 每一个策略里按照一定的算法(R****ule-combining Algorithm)将规则结果归结为一个结果(Effect). 至此,PDP将有两个基本部分,决策器也按照策略的组合算法(Policy-combining algorithm)将结果归结, 返回给 PEP。如下图:

image.png

在具体的实现中,PDP和PEP可以是一个系统中的不同组件直接调用,也可以部署为不同的服务,使用HTTP请求。在MyABAC为了更好的微服务化,我们将PEP和PDP部署为两个系统,使用HTTP请求。

迭代三: PEP + PDP + PAP

上个迭代中,MyABAC 有了PDP 和 策略,但是对于策略还仅仅局限在一堆代码逻辑中,如何更好的管理这些策略,如何让策略和人(即系统的管理员或运维人员)合理的管理和交互,这便是PAP的主要职责。策略和规则中有一定的的逻辑组合关系来组成相对应满足的条件,对于它的定义,XACML 有一套比较复杂的基于XML的逻辑语言,但这里我们将其简化,借鉴AWS cloudformation 的语言结构,构建了一个自己的基于YAML的配置语言,姑且称之为 MPL(MyAbac Policy Language)。将每一个策略简化成为可读性较好的yaml文件,那么PAP的职责就是使用UI或者编辑器(Editor) 对yaml文件的维护。而PDP中将会有一个编译器(MPL Compiler) 将PAP 完成的策略文件,编译成为PDP可以使用的策略。这样在以后的操作过程中,仅仅通过 PAP 就可以对策略进行改变。

image.png

有了MPL的帮助,策略文件看起来也就清晰简单了。 下图前边是XACML的策略文件, 后边是MyABAC的策略文件。

image.png image.png

迭代四: PEP + PDP + PAP + PIP

有了PDP做鉴权,PEP执行结果,PAP管理策略,看起来似乎已经完成了,但是当真正投产的时候,就会发现仅仅依靠从请求中拿到的少量属性来做真正的鉴权是远远不够的,就拿上面图书管理系统来说,怎么知道一个管理员具体的职责在几楼哪个类别,怎么知道图书的信息?一般的请求当中仅仅只有一个图书的编号和管理员的编号,更多信息就需要到对应系统中请求,而这些能够提供更过信息来支持PDP做出合理判断的服务或者产品,我们称之为PIP。也就说 PIP 并不是 MyABAC 的内在组件,而是一个外部的第三方组件。这些服务可能是基于http Restful的接口,也可能是一个GraphQL的接口或者其他类型的接口。但是为了能够让 PDP 与这些PIP正确的调用,PIP 必须遵循 PDP 制定的协议,这样 PDP 才能合理传递个 PIP 必要的信息,从而获取想要的信息,比如通过管理员的编号或者管理员服务的楼层号码和服务的图书类型编号。这一切都封装在PDP 中的 PIP Client组件里。这样决策器(Decision Maker) 不仅拥有从PEP中extractor中的属性,而且可以通过PIP拿到更多想要的属性值,同时每个属性值的变化会及时反馈到PDP中,动态的参与了最终结果决断。从而达到了更细粒度的访问控制。同样我们也可以将PAP从MyABAC里分离出来,管理多个系统的策略。比如我们可能部署多个MyABAC来保护不同的服务,这样系统中的策略是不一样,但是可以使用同一个中心化PAP来管理多个系统的策略文件。

image.png

迭代五: 未来的计划

通过上面的迭代,一个比较完整的ABAC的MVP已经完成。由于在原始的请求中添加了额外的工作量,比如额外的请求,包括PEP到PDP的请求、PDP到PIP的请求等,要核对很多的策略,所以性能问题是MyABAC不能忽视的问题。再次迭代中将使用懒加载,缓存的机制来优化MyABAC的性能。同时此产品对XCAML的框架做了大量的裁决,只采纳一些基本概念和组件,所以要关注用户的使用和需求反馈,逐步的引入更多概念来不断的完善产品。

后记

相对于RBAC,ABAC的概念更广,实现更复杂。如果把角色(role)当作唯一的属性,那么RBAC就是一个ABAC的特列。对ABAC和RBAC的选择要基于当前业务的需求。不要将简单的问题复杂化,也不能把复杂的问题看的太过简单。MyABAC的出现,将系统中的鉴权部分完全从系统中抽离出来,让系统的设计者和开发者更加关注在具体的业务实现上。作为一个完全自管理的产品,可以以边车(sidecar)的形式部署在每个系统中,甚至可以部署在一套系统中不同层级(layer),比如BFF层,API层或数据库层。 但同时也增加了系统部署的复杂性,我们要合理的选择和取舍。
目前,MyABAC已经在公司多个系统中使用,根据用户的反馈已经引入了一些新的功能,比如对义务(Obligation)的支持等。在部署中我们将MyABAC封装称为一个docker image,这样用户就不会过多的关注它的具体实现,而仅仅通过一些简单的参数配置就可以完成对MyABAC的引入。

参考:
https://en.wikipedia.org/wiki/Attribute-based_access_control
http://docs.oasis-open.org/xacml/3.0/xacml-3.0-core-spec-os-en.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/551692.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【RISC-V】执行环境

裸机程序 操作系统 虚拟化 RISC-V处理器3种模式 机器模式(M模式) 安全执行环境,通常运行SBI固件,为操作系统提供服务。 特权模式(S模式) 运行操作系统内核,为应用程序提供服务。 用户模式(U模式) 运行应用程序。 虚拟化新增特权模式 …

Boundary IoU:Improving Object-Centric Image Segmentation Evaluation总结笔记

Boundary IoU:Improving Object-Centric Image Segmentation Evaluation(边界Iou:改进以对象为中心的图像分割评价) 目录 一、论文出发点 二、论文核心思想 三、相关工作 四、敏感度分析 五、Boundary IoU定义和实验证明 六、应用 七…

【系统移植】uboot 通过 NFS 加载根文件系统(一) —— 网络环境配置

前面试过了SD卡烧录根文件系统,然后借助环境变量 bootargs 来加载SD卡中的根文件系统,但是实际开发需要经常对文件做增删改等操作,所以将根文件系统放在SD上不大合适。 因此,最常用的做法是把根文件系统放在NFS服务端&#xff08…

Spring事务及事务传播机制

一.事务的含义:多个操作封装在一起,要么同时执行成功,一旦有一个操作执行失败,那么全部执行失败。这里给大家举个例子:比如A给B转账50元,而B没有收到这50元,此时A转账B这个操作也需要进行回滚,恢复到A给B没…

HTTP 协议的基本格式

HTTP 什么是HTTP?HTTP是应用层的一个重要协议.它定义了浏览器怎样向服务器请求文件,以及服务器怎样把文件传送给浏览器. 我们打开浏览器,手动输入一个网址:baidu.com.那么此时浏览器就会给百度的服务器发送请求.百度服务器在返回一个html的响应. 那么我们如何学习HTTP协议呢…

【系统移植】uboot 通过 NFS 加载根文件系统(二) —— 修改环境变量 bootcmd、bootargs

上一部分已经配置好了网络环境,我们要修改环境变量以保证开发板可以正常启动,uboot 环境变量中比较重要的环境变量就是 bootcmd 和 bootargs 目录 1、修改自启动命令 — bootcmd 2、修改自启动参数 —— bootargs (1) root/dev/nfs rw (2) nfsroot …

Godot引擎 4.0 文档 - 循序渐进教程 - 创建你的第一个脚本

本文为Google Translate英译中结果,DrGraph在此基础上加了一些校正。英文原版页面: Creating your first script — Godot Engine (stable) documentation in English 创建你的第一个脚本 在本课中,您将编写您的第一个脚本,使用…

Datacom-HCIE 题库 02(10月26日更新)--含解析

单选题 1.[试题编号:189785] (单选题)如图所示,VTEP1上在BD20域内开启了ARP广播抑制功能,并且VTEP1通过 BGP EVPN路由学习到了PC2的ARP信息,则PC1发送的针对PC2的ARP请求,VIEP1在转发给VIEP2时…

设备采购信息管理系统

系列文章 任务14 设备采购信息管理系统 文章目录 系列文章一、实践目的与要求1、目的2、要求 二、课题任务三、总体设计1.存储结构及数据类型定义2.程序结构3.所实现的功能函数4、程序流程图 四、小组成员及分工五、 测试界面展示添加采购信息按编号查找采购信息按设备编号查找…

vue记录鼠标拖拽划过位置并将划过位置变色

首先 我们要做一个这样的基本组件 <template><div><!--循环遍历 List数组用当前下面当做key值然后定义了 onDragStart 鼠标拖动时触发定义 onDragEnd 拖动结束后触发定义 onDragOver 记录所有鼠标拖动经过的位置--><divclass"skeleton"v-f…

DAY 63 mysql的高级语句:存储过程

什么是存储过程 存储过程是一组为了完成特定功能的SQL语句集合。 存储过程在使用过程中是将常用或者复杂的工作预先使用SQL语句写好并用一个指定的名称存储起来&#xff0c;这个过程经编译和优化后存储在数据库服务器中。当需要使用该存储过程时&#xff0c;只需要调用它即可…

数据结构之堆详解

目录 1.什么是堆 堆的定义 结构体定义与函数接口 堆的初始化 堆的销毁 入堆 向上调整算法 大堆 出堆 向下调整算法 返回堆顶元素 判空 堆的应用 1.什么是堆 知道以上的存储方法&#xff0c;对于完全二叉树&#xff0c;有一个叫做堆的结构&#xff0c;堆本质就是一…

内核调试工具crash使用

内核调试工具crash使用 前言初识获取vmlinuxDwarf Error: wrong version in compilation unit header (is 5, should be 2, 3, or 4) 其他 前言 在编写内核驱动的过程中&#xff0c;时不时就导致内核崩溃&#xff0c;也没啥好的调试方法&#xff0c;要么dmesg打印内核日志&…

socket | 网络套接字、网络字节序、sockaddr结构

欢迎关注博主 Mindtechnist 或加入【Linux C/C/Python社区】一起学习和分享Linux、C、C、Python、Matlab&#xff0c;机器人运动控制、多机器人协作&#xff0c;智能优化算法&#xff0c;滤波估计、多传感器信息融合&#xff0c;机器学习&#xff0c;人工智能等相关领域的知识和…

量化论文学习之《基于 CNN-LSTM 混合模型的股价 预测》

主要原理 CNN-LSTM 混合模型首先使用 CNN 来提取时间序列数据的特征&#xff0c;然 后将特征输入进 LSTM 模型中来进行下一交易日股票收盘价的预测。 数据处理 使用数据 作者发现加入volume,pctChg后效果变差&#xff0c;可能原因是加入了相关性较低的特征后造成了数据冗余…

Ubuntu挂载阿里云盘

目录 所需环境安装docker安装rclone获取阿里云盘token 获取docker镜像并运行获取本机IP信息总结rclone配置挂载网盘到本地文件夹开机启动 所需环境 安装docker 使用官方脚本进行全自动安装 curl -fsSL https://test.docker.com -o test-docker.shsudo sh test-docker.sh安装r…

Spring Boot 可执行 Jar 包运行原理

Spring Boot 有一个很方便的功能就是可以将应用打成可执行的 Jar。那么大家有没想过这个 Jar 是怎么运行起来的呢&#xff1f;本篇博客就来介绍下 Spring Boot 可执行 Jar 包的运行原理。 打可执行 Jar 包 将 Spring Boot 应用打成可执行 Ja r包很容易&#xff0c;只需要在 p…

数字信号处理基础(一):常用信号产生

目录 1. 写在前面2. 连续信号和离散信号2.1连续信号2.2 离散信号 3. 常用信号的产生3.1 单位脉冲序列3.2 单位阶跃序列3.3 指数函数3.4 正弦信号和余弦信号3.5 sinc函数3.6 矩形脉冲信号 4. 信号卷积5. 完整代码 1. 写在前面 为了更好的理解通信原理系列文章&#xff0c;在此补…

28 SQL——表子查询

create table dept(id int primary key auto_increment,name varchar(15))comment 部门;insert into dept(id, name) values (1,研发部),(2,市场部),(3,财务部),(4,销售部),(5,总经办),(6,人事部);create table staff (id int primary key auto_increment commentID,name …

使用Mathtype公式编辑器生成CSDN中的数学公式

使用Mathtype公式编辑器生成CSDN中的数学公式 在CSDN中输入数学公式&#xff0c;直接使用LaTeX编辑输入公式有一些难度&#xff0c;如果你熟悉Mathtype公式编辑器&#xff0c;那么在CSDN文档中输入数学公式也变的相对容易。 下面我们举例说明使用Mathtype转换输入CSDN的公式。…