相关术语

在权限模型中有如下相关术语:

英文名中文名描述
Subject主体通常是用户或者用户组
Action操作对Object的操作,比如访问、创建、删除、查询、修改等
Object对象权限所作用的对象,通常指各类资源
Effect效力限规则匹配后的操作,比如Allow/Deny
Condition限制条件权限生效的条件
Permission权限用来指代是否允许某人在某种条件下对某种资源做某种操作
Role角色权限集合,包含了一个或多个权限
Policy策略一组规则/声明,在特定用户尝试执行特定操作时进行评估,然后将策略应用于用户、组和角色

权限模型

常见的权限模型有5种,下面一一介绍。

1. 权限控制列表ACL

ACL(Access Control List,权限控制列表),用来判断用户是否可以对资源做特定的操作,例如,允许Colin创建文章的ACL策略为:

Subject: Colin
Action: Create
Obejct: Article

在ACL中,权限管理是围绕资源Object来进行的,这也是比较简单的一种模型。

2. 自主访问控制DAC

DAC(Discretionary Access Control,自主访问控制)是ACL的扩展模型。可以让Subject将其拥有的权限授予其它Subject,例如Colin具有创建文章的权限

Subject: Colin
Action: Create
Object: Article

那么Colin也可以将创建文章的权限赋予其它用户。

3. 强制访问控制MAC

MAC(Mandatory Access Control,强制访问控制),也是ACL的扩展模型,安全性更高。 在MAC权限模型下,Subject和Object同时具有安全属性,授权时需要同时满足两点才能授权通过:

  • Subject可以对Object做Action操作。
  • Object可以被Subject做Action操作。 也就是说,如果设置了”Colin和James可以创建文章”这个MAC策略:
Subject: Colin
Action: Create
Object: Article

Subject: James
Action: Create
Object: Article

同时还有另一个MAC策略,“文章可以被Colin创建”:

Subject: Article
Action: Create
Object: Colin

只有Colin才可以创建文章,James不可以创建,因为它不满足第二条条件。

也就是说MAC要求权限是双向可通的,那么这个授权才能够通过

上面三种都是旧时代的权限控制模型,现代应用主要使用后两种,RBAC和ABAC。

4. 基于角色的访问控制RBAC

RBAC(Role-Based Access Control,基于角色的访问控制)。引入了Role的概念,并且将权限与角色进行关联,用户通过扮演某种角色来具有该角色的所有权限,如下图所示

  • 每个用户具有一个或者多个角色
  • 每个角色关联一个或者多个权限
  • 每个权限包含了一个或者多个操作
  • 操作包含了对资源的操作集合 角色的引入将用户与权限之间解耦,通过抽象出不同的角色,可以灵活地对用户进行授权。

通过对用户赋予一个角色,就可以批量授予这个角色的所有权限;对角色的权限的修改,就相当于对所有与此角色关联的用户的权限进行修改。

RBAC还可以分为RBAC0、RBAC1、RBAC2、RBAC3。

  • RBAC0:基础模型,只包含核心的四个要素。用户、角色、会话、权限。
  • RBAC1:在RBAC0的基础上,添加了角色继承。角色可以继承其它角色,在拥有其它角色权限的同时,还可以关联额外的权限。
  • RBAC2:在RBAC0的基础上,添加了约束
    • 互斥约束:同一个用户不能拥有互斥的角色。互斥的角色不能拥有一样的权限。互斥的权限不能分配给同一个角色。
    • 基数约束:一个角色被分配的数量有限。例如公司的CEO。
    • 先决条件约束:要获得较高的权限,首先要拥有较低以及的权限。例如,先有副总经理的权限,再有总经理的权限。
    • 静态职责分离:用户无法被同时赋予有冲突的角色。
    • 动态职责分离:用户会话中,无法同时激活有冲突的角色。
  • RBAC3:同时结合了RBAC1和RBAC2。

以一个示例来说明RBAC:

  • 存在write_article和manager_article的权限
Permission:
    - Name: write_article
        - Effect: "allow"
        - Action: ["Create", "Update", "Read"]
        - Object: ["Article"]
    - Name: manage_article
        - Effect: "allow"
        - Action: ["Delete", "Read"]
        - Object: ["Article"]
  • 有三个角色,Writer具有write_article的权限,Manager具有manager_article的权限,CEO具有全部权限。
Role:
    - Name: Writer
      Permissions:
        - write_article
    - Name: Manager
      Permissions:
        - manage_article
    - Name: CEO
      Permissions:
        - write_article
        - manage_article
  • 为用户赋予角色
Subject: Colin
Roles:
    - Writer

这样Colin就具有了Writer的所有权限。

5. 基于属性的权限认证ABAC

ABAC(Attribute-Based Access Control,基于属性的权限认证)这是最强大的权限认证。 相对于RBAC,具有更细的控制粒度,主要规定了下面的四种属性:

  • 用户属性:例如性别、年龄、工作等。
  • 资源属性:例如创建时间、所属位置等。
  • 操作属性:例如创建、修改等。
  • 环境属性:例如来源IP、当前时间等。

例如:

Subject:
    Name: Colin
    Department: Product
    Role: Writer
Action:
    - create
    - update
Resource:
    Type: Article
    Tag:
        - technology
        - software
    Mode:
        - draft
Contextual:
    IP: 10.0.0.10

上面的策略表示,用户可以在来源IP为10.0.0.10的客户端,创建和更新带有technology与software标签的草稿文章。

ABAC也被称作PBAC(Policy-Based Access Control)和CBAC(Claims-Based Access Control)。

相关开源项目

Casbin

支持ACL、RBAC、ABAC等访问模型。

keto

keto 是一个云原生权限控制服务,通过提供 REST API 进行授权,支持 RBAC、ABAC、ACL、AWS IAM 策略、Kubernetes Roles 等权限模型。