基于属性控制访问的权限模型(ABAC)

ABAC(基于属性的访问控制, Attribute-Based Access Control)是一种访问控制模型,通过使用属性来决定用户对资源的访问权限。与传统的基于角色的访问控制模型(RBAC)不同,ABAC 不依赖于固定的角色,而是更加灵活地使用一组属性来动态地评估和授权访问请求。

ABAC的核心概念解释

在ABAC中将每一件事都抽象为四个核心元素,即用户,操作,资源,环境。对于一个用户,他要进行某一个操作,这个操作是在哪个环境下对哪个资源的实例进行操作?

举个例子:李云龙要吃晚饭,李云龙就是用户了,那李云龙这个用户要进行的操作就是吃饭,每个人都有吃晚饭的权限,但是如果李云龙的媳妇剥夺了他吃晚饭的权限,那李云龙连操作的权限都没有,也就不会有下文了,所以ABAC中操作是最关键的元素,而资源和环境都是依托于操作而来的,没有操作的权限,自然也就更不会有关联操作的资源和操作执行的环境的下文了。而对于吃饭这个操作,需要关联的资源就是食物,李云龙只能吃他家里面的食物,不能跑到别人家随便吃别人家的食物,即李云龙只对他家里面的食物(资源)有吃(操作)的权限,如果李云龙去他朋友家吃饭,那他的朋友就会赋予他吃他家食物的权限,那李云龙吃饭这个操作自然也就关联了两个资源实例,一是自己家的食物,二是朋友家的食物,他可以吃自己家的食物,也可以吃朋友家的食物。而晚饭肯定只能在晚上吃,不能在早上吃,也不能在中午吃,那只能在晚上吃晚饭就是环境对操作的一个限制。

所以,对于ABAC的权限控制策略就是,一个用户是否有某种操作的权限,这个操作是否需要关联资源,这个操作是否有环境限制?就是ABAC区别于RBAC基于角色权限控制的更细粒度的权限控制。

 ABAC的工作流程

授权:

权限管理员可以将某一个操作的权限赋予某一个用户,这个操作可以是关联了一系列资源的操作,也可以是没有关联资源的操作,如果这个操作是有关联资源的,那么管理员还需对这个用户具体可以操作哪些资源实例进行授权,例如,管理员需要赋予一个用户在虚拟机上编辑文件的权限。那么,操作就是在虚拟机上编辑文件,而虚拟机可能有多个,那么资源就是虚拟机,资源实例就是正在运行的虚拟机实例。这是动态变化的,可能随时会新增虚拟机,也可能会关闭一部分虚拟机,这个时候,权限中心就需要动态地知道哪些虚拟机是正在运行的,以便管理员从中选取并授予用户在操作实例的权限。管理员从中选取出需要让用户操作的虚拟机授予用户操作的权限,即操作所关联的资源实例。

鉴权:

鉴权的大致流程为,当用户进行某一个操作时,携带操作的唯一标识,如果需要关联资源,则一并携带资源实例的唯一标识,和用户信息一起到权限中心进行鉴权,权限中心会根据这些信息生成用户的访问策略,决定用户是否有访问权限。

ABAC的优势:

  1.  提供了更细粒度的权限控制,使得权限控制不再仅仅是局限于操作,而是拓展到操作所关联的资源,以及执行操作的环境。
  2. 属性可以实时变化,不依靠固定的权限表或角色,系统能够覆盖复杂而动态的访问控制需求。
ABAC(Attribute-Based Access Control)是一种基于属性访问控制模型,它允许管理员基于多个属性控制对资源的访问。下面是一个实现基于属性访问控制模型ABAC的示例代码: ```python class User: def __init__(self, name, age, role): self.name = name self.age = age self.role = role class Resource: def __init__(self, name, owner): self.name = name self.owner = owner class ABAC: def __init__(self): self.users = [] self.resources = [] def add_user(self, user): self.users.append(user) def add_resource(self, resource): self.resources.append(resource) def can_access(self, user, resource): if user.role == 'admin': return True if user.role == 'owner' and user.name == resource.owner: return True if user.age >= 18 and user.role == 'adult': return True return False ``` 上面的代码定义了三个类:User、Resource和ABAC。其中,User类代表系统中的用户,包括用户的名称、年龄和角色;Resource类代表系统中的资源,包括资源的名称和所有者;ABAC类则是实现基于属性访问控制模型的主要类。 ABAC类中的add_user和add_resource方法用于向系统中添加用户和资源,can_access方法则用于判断用户是否有权限访问资源。在can_access方法中,我们定义了三种授权规则: 1. 如果用户角色是admin,则直接允许访问。 2. 如果用户角色是owner且资源的所有者与用户名称相同,则允许访问。 3. 如果用户年龄大于等于18岁且角色是adult,则允许访问。 如果以上任意一条规则成立,则返回True,表示用户有权限访问资源;否则返回False,表示用户无权限访问资源。 使用示例: ```python abac = ABAC() user1 = User('Alice', 20, 'admin') user2 = User('Bob', 17, 'adult') user3 = User('Charlie', 25, 'owner') abac.add_user(user1) abac.add_user(user2) abac.add_user(user3) resource1 = Resource('file1', 'Alice') resource2 = Resource('file2', 'Charlie') abac.add_resource(resource1) abac.add_resource(resource2) print(abac.can_access(user1, resource1)) # True print(abac.can_access(user2, resource1)) # False print(abac.can_access(user3, resource2)) # True ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值