前言
在计算机和信息系统的发展过程中,安全问题一直是关注的焦点。传统的访问控制模型主要基于用户身份、资源和操作等方面进行控制,但这种模型存在一些严重的缺陷,如难以适应复杂的应用环境、权限管理不够灵活、难以实现分级授权等问题。
为了解决这些问题,RBAC模型开始被引入。
RBAC是什么
RBAC(Role-Based Access Control)模型是一种常用的权限控制模型,用于管理和控制用户对系统资源的访问权限。在 RBAC 模型中,访问权限是通过角色而不是直接与用户关联来进行管理的。
RBAC组成
- 用户(User):用户代表系统中的实体,可以是个人用户或其他应用程序。用户通过被分配角色来获得相应的权限,从而决定其在系统中能够执行的操作。
- 角色(Role):角色代表了一组相关权限的集合,通常与用户的职能、责任或角色相对应。每个角色拥有特定的权限,定义了该角色所能执行的操作。
- 权限(Permission):权限是指用户对系统资源的访问能力。它可以是操作级别的,如读取、写入、删除等,也可以是对象级别的,如访问特定文件或数据库。
关系如下图:
角色和用户、角色和权限大多设计为多对多关系。
RBAC工作原理
把权限赋予角色,再把角色赋予用户,用户就拥有了角色所对应的权限。用户拥有的权限等于他所有的角色持有权限之和。
RBAC1
上边是基本的 RBAC0 模型,包括了 RBAC 最核心的概念和机制。RBAC0 模型主要解决了访问控制模型的简单性和灵活性问题,将访问权限的管理从用户直接解耦出来,实现了相对较好的权限管理和安全性。
RBAC1 在 RBAC0 的基础上,进行了 角色分层。通过给角色划分等级,每个等级拥有不同的权限,从而实现了更细粒度的权限管理。这种角色的分层让权限的分配更加灵活,可以根据具体需求来调整角色等级和相应的权限。
角色分层如下图所示:
角色分层,同一个角色可以有不同等级,不同等级又对应着不同的权限。
子角色可以对父角色的权限进行继承,但是子角色的权限一定小于父角色。
RBAC2
RBAC2 在 RBAC0 的基础上增加了 RBAC 的 约束模型。具体来说,这些限制可以分成两类,即静态职责分离(SSD)和动态职责分离(DSD)。通过这些约束模型,RBAC2 能够更好地保证权限的安全性和稳定性。
静态职责分离(SSD) 主要是对用户、角色和权限三者之间增加了一些限制,例如互斥角色和基数约束。在 SSD 中,一些特定的角色不能被分配给同一个用户。例如,同一用户不能被分配 "管理员" 和 "普通用户" 这两个互斥角色。另外,对于用户拥有的角色数量也有限制,即一个用户拥有的角色是有限的。在一些场景中,例如公司或组织的实际运营中,不同的职位或角色之间具有一定的排他性,不能同时由同一人担任。通过 SSD,我们可以保证这种排他性得以实现。
动态职责分离(DSD) 主要是在会话和角色之间增加限制。具体来说,DSD 可以动态地约束用户拥有的角色。例如,一个用户可以有多个角色,但是在一次会话中只能激活一个角色。这种动态的约束可以防止用户在会话中同时激活多个角色,从而保证系统的安全性。
RBAC2 用户、角色和权限的关系如下图所示:
RBAC3
RBAC3 是 RBAC2 和RBAC1的合集,所以它 既包含了角色分层,也包括了可以增加的各种约束。因此,RBAC3是这四种模型中最为全面和复杂的权限管理模型。可以实现更为精细和安全的权限管理。
总结
RBAC 适用于需要对用户进行细粒度访问控制的场景,比如企业内部系统。权限控制最难的部分在于业务上的设计,根据需求设计一个适应本企业的 RBAC 才是真正的难点。