访问控制基础与模型综述

一、访问控制的基本概念

在信息系统安全中,访问控制(Access Control)是保障数据和资源安全的核心机制。它通常分为两个阶段:

  • 认证(Authentication, AuthN):确认"你是谁",即验证用户或实体的身份。例如:用户名+密码登录、OAuth2.0 登录。
  • 授权(Authorization, AuthZ):确认"你能做什么",即在身份确认之后,判断是否允许执行某个操作或访问某个资源。

二者的关系是:认证是前提,授权是目的。只有通过认证的实体,才能进入授权环节。


二、常见访问控制模型

1. DAC(Discretionary Access Control,自主访问控制)

  • 核心思想:资源的拥有者有权决定谁能访问该资源。
  • 优点:灵活、实现简单。
  • 缺点:依赖资源所有者的安全意识,难以满足严格安全需求。
  • 适用场景 :文件系统(如 Unix 的 chmod)、小型应用。
  • Go 抽象实现 :定义一个 owner -> ACL 映射,检查当前用户是否在资源所有者的授权列表中。

2. MAC(Mandatory Access Control,强制访问控制)

  • 核心思想:系统预先设定安全策略和安全级别,用户和资源被赋予不同的安全标签,访问由系统强制决定。
  • 优点:高度安全、不可由用户随意更改。
  • 缺点:灵活性差,难以适应多变的业务场景。
  • 适用场景:军事、政府、保密系统。
  • Go 抽象实现 :在访问请求时比较 subject.level >= object.level,否则拒绝。

3. ACL(Access Control List,访问控制列表)

  • 核心思想:每个资源绑定一张列表,记录允许或拒绝的用户及其权限。
  • 优点:直观、易于理解,实现简单。
  • 缺点:当用户和资源数量庞大时,列表维护成本高,扩展性差。
  • 适用场景:API 网关的白名单/黑名单,操作系统文件权限。
  • Go 抽象实现 :用 map[resourceID][]PermissionEntry 存储 ACL,检查当前用户是否在列表中。

4. RBAC(Role-Based Access Control,基于角色的访问控制)

  • 核心思想:用户不直接绑定权限,而是通过"角色"间接获取权限。
  • 优点:权限集中管理,减少冗余,适合组织结构。
  • 缺点:角色过多时可能导致"角色爆炸";难以表达上下文属性。
  • 适用场景:企业信息系统、SaaS 平台。
  • Go 抽象实现 :建立 User -> Roles -> Permissions 的三层映射,访问时判断用户是否具备所需角色。

5. ABAC(Attribute-Based Access Control,基于属性的访问控制)

  • 核心思想:通过用户属性、资源属性、环境属性进行综合判断。
  • 优点:灵活、细粒度,可以表达复杂的上下文策略。
  • 缺点:策略设计复杂,性能开销较大。
  • 适用场景:云计算、跨组织数据共享。
  • Go 抽象实现 :设计一个 PolicyEngine,输入 (subjectAttrs, objectAttrs, envAttrs),输出 allow/deny

6. ReBAC(Relationship-Based Access Control,基于关系的访问控制)

  • 核心思想:利用用户与资源之间的关系(如"owner"、"collaborator")来决定权限。
  • 优点:适合社交网络、协作系统,能够表达复杂的图关系。
  • 缺点:实现复杂,关系图存储和计算开销大。
  • 适用场景:GitHub(用户-仓库-协作者)、Google Docs(文档共享关系)。
  • Go 抽象实现:使用图结构(邻接表/图数据库),检查用户与资源间是否存在允许访问的关系路径。

三、模型对比与研究角度

模型 优点 缺点 典型场景
DAC 灵活,用户自主 安全性低,依赖用户操作 文件系统、个人应用
MAC 安全性高,统一控制 缺乏灵活性 军事、政府系统
ACL 简单直观 扩展性差,维护复杂 API 网关、文件权限
RBAC 管理高效,组织结构友好 角色爆炸,难表达动态上下文 企业、SaaS 平台
ABAC 灵活细粒度,支持上下文 策略复杂,性能开销大 云计算、跨组织协作
ReBAC 关系表达力强,适合协作 图计算复杂 社交网络、文档协作

研究方向与挑战:

  1. 模型融合:RBAC + ABAC 结合,既有管理性又有灵活性。
  2. 可扩展性:在海量用户/资源下高效评估访问请求。
  3. 可解释性:访问被拒绝时,系统能提供"Why Denied"解释。
  4. 隐私与安全:与差分隐私、同态加密、联邦学习等技术结合,保护访问日志和策略。

四、Go 语言视角下的访问控制抽象

在 Go 系统中,可以通过以下方式实现统一的访问控制框架:

  • 中间件模式:将鉴权逻辑封装成 Gin/Chi/HTTP 中间件,统一拦截请求。

  • 策略引擎接口

    go 复制代码
    type PolicyEngine interface {
        Evaluate(subject Subject, action string, object Resource) (bool, string)
    }