RBAC模型和ABAC模型是什么,有什么区别
RBAC (Role-Based Access Control) 基于角色的访问控制
RBAC的核心思想是,访问权限不直接授予用户,而是授予“角色”(Role)。然后,将用户分配到相应的角色中。这样,用户就通过其所属的角色,间接地拥有了该角色所包含的所有权限。
它的关系可以简化为:用户-角色-权限 (Who -> What roles -> What permissions)。权限的集合是静态地绑定在角色上的。
让我们以一个常见的内容管理系统(CMS)为例:
-
用户 (Users): 张三、李四、王五
-
角色 (Roles):
-
管理员 (Admin): 拥有系统的所有权限。
-
编辑 (Editor): 可以创建、修改和发布文章。
-
撰稿人 (Contributor): 只能创建和修改自己的文章草稿,不能发布。
-
-
权限 (Permissions):
-
post:create (创建文章)
-
post:edit (修改文章)
-
post:publish (发布文章)
-
user:manage (管理用户)
-
在这个模型中,我们的授权逻辑如下:
-
我们将权限分配给角色:
-
管理员角色 拥有 post:create, post:edit, post:publish, user:manage 权限。
-
编辑角色 拥有 post:create, post:edit, post:publish 权限。
-
撰稿人角色 拥有 post:create, post:edit 权限。
-
-
我们将用户分配给角色:
-
张三是管理员。
-
李四是编辑。
-
王五是撰稿人。
-
现在,当王五尝试发布文章时,系统会检查:王五是“撰稿人”角色 -> “撰稿人”角色没有 post:publish 权限 -> 拒绝操作。
RBAC的优点是模型清晰,易于理解和管理。在用户和权限数量众多时,通过角色这个中间层,极大地简化了授权管理。
ABAC (Attribute-Based Access Control) 基于属性的访问控制
ABAC是一种更为灵活和精细的访问控制模型。它的核心思想是基于一系列“属性”(Attribute)来动态地决定是否授予访问权限。这些属性可以来自任何地方。
通常,ABAC的决策逻辑基于一个“策略”(Policy),这个策略会评估以下四类属性:
-
主体属性 (Subject attributes): 关于发起请求的用户的信息,如年龄、部门、安全等级、职位等。
-
客体/资源属性 (Object/Resource attributes): 关于被访问资源的信息,如文件类型、敏感度、所属项目、创建时间等。
-
操作属性 (Action attributes): 关于正在执行的操作的信息,如读取、写入、删除、审批等。
-
环境属性 (Environment attributes): 关于访问发生时的上下文信息,如时间、地点(IP地址)、设备类型等。
它的决策可以表述为:当主体的属性、客体的属性、操作和环境属性满足某个策略时,允许或拒绝访问。
我们以一个企业报销系统为例,这个场景用RBAC会非常复杂:
假设有一个策略 (Policy):
“允许一个用户审批报销单,当且仅当:
-
该用户的角色是‘经理’ (主体属性)
-
并且报销单的金额小于该用户自身的‘审批额度’属性 (主体属性 vs 客体属性)
-
并且报销单的类型不是‘特殊报销’ (客体属性)
-
并且当前时间是工作日的9点到18点 (环境属性)”
在这个模型下:
-
用户A: 角色是经理,审批额度是5000元。
-
用户B: 角色是经理,审批额度是10000元。
-
报销单C: 金额4000元,类型是差旅费。
-
报销单D: 金额8000元,类型是差旅费。
当用户A尝试审批报销单C时,系统评估:
-
角色是经理?是。
-
4000 < 5000?是。
-
类型不是特殊报销?是。
-
当前是工作时间?是。
-
结论:允许操作。
当用户A尝试审批报销单D时,因为 8000 不小于 5000,操作将被拒绝。而用户B则可以审批报销单D。
可以看到,ABAC不需要为“5000元额度经理”和“10000元额度经理”创建两个不同的角色,而是通过动态评估属性来实现更细粒度的控制。
| RBAC (基于角色的访问控制) | ABAC (基于属性的访问控制) | |
|---|---|---|
| 核心思想 | 以“角色”为中心,权限静态地赋予角色。 | 以“策略”和“属性”为中心,权限是动态计算出来的。 |
| 授权粒度 | 较粗。权限控制到角色级别。 | 非常精细。可以控制到每一次具体访问的上下文。 |
| 灵活性 | 较低。对于超出角色定义的场景,需要创建新角色,可能导致“角色爆炸”。 | 极高。可以组合无限的属性来定义复杂的访问规则,无需修改主体或客体。 |
| 管理复杂度 | 概念简单,易于上手。但在复杂场景下,角色管理会变得困难。 | 初期设置复杂,需要设计策略引擎和属性来源。但对于复杂规则,长期维护更清晰。 |
| 适用场景 | 适用于企业内部系统、CMS等权限结构稳定、分层明确的场景。 | 适用于金融、云计算、物联网等需要高度灵活、动态和上下文感知权限控制的场景。 |