1. 权限验证概述:为什么需要权限验证、常见权限模型对比

1.1 为什么需要权限验证

在软件系统中,权限验证(Authorization)决定了“谁(Who)能对什么资源(What)执行什么操作(How)”。没有权限验证的系统将面临以下风险:

  • 数据泄露:普通用户可访问管理员后台或他人隐私数据。
  • 越权操作:低权限用户执行高敏感操作(如删除数据库、修改配置)。
  • 合规风险:无法满足 GDPR、等保 2.0、SOC2 等审计要求。
  • 攻击面扩大:未授权接口成为攻击者横向移动的跳板。
核心原则:权限验证应遵循 最小权限原则(Principle of Least Privilege)和 纵深防御(Defense in Depth),在网关、应用层、数据层分别实施校验。

1.2 常见权限模型对比

业界主流权限模型包括 DAC、MAC、RBAC、ABAC 四种。下表从核心思想、适用场景、优缺点三个维度进行对比:

模型 核心思想 适用场景 优点 缺点
DAC(自主访问控制) 资源所有者自行决定谁可以访问 文件系统(Linux chmod)、个人网盘 灵活、实现简单 权限分散、难以集中审计
MAC(强制访问控制) 系统根据安全标签强制控制 军事系统、政府机密、SELinux 安全性高、不可绕过 配置复杂、灵活性差
RBAC(基于角色的访问控制) 用户通过角色获得权限 企业管理系统、SaaS 平台 易管理、职责分离 角色爆炸、细粒度不足
ABAC(基于属性的访问控制) 根据用户/资源/环境属性动态决策 云原生、微服务、IoT 细粒度、动态、上下文感知 策略复杂、性能开销大

1.3 权限模型演进关系图

下图展示了四种模型从简单到复杂、从静态到动态的演进关系:

权限模型演进关系 DAC 自主访问控制 MAC 强制访问控制 RBAC 基于角色 ABAC 基于属性 演进趋势:从“谁控制” → “系统强制” → “角色抽象” → “属性动态决策” DAC/MAC 偏底层系统安全;RBAC/ABAC 偏应用层业务安全 灵活性:高 灵活性:低 灵活性:中 灵活性:极高 安全性:低 安全性:极高 安全性:高 安全性:高

1.4 各模型核心特征详解

DAC(自主访问控制)

  • 控制主体:资源所有者(Owner)。
  • 典型实现:Linux 文件权限(rwx)、Windows ACL。
  • Go 示例:os.Chmod() 修改文件权限。
// Go 中 DAC 示例:设置文件所有者读写权限
import "os"
err := os.Chmod("secret.txt", 0600) // 仅 owner 可读写
if err != nil {
    log.Fatal(err)
}

MAC(强制访问控制)

  • 控制主体:系统安全策略(如 SELinux 策略)。
  • 典型实现:SELinux、AppArmor、Windows Mandatory Integrity Control。
  • 特点:用户无法绕过系统级标签检查。

RBAC(基于角色的访问控制)

  • 核心概念:用户 → 角色 → 权限。
  • 典型实现:NIST RBAC 标准、Casbin、Kubernetes RBAC。
  • Go 示例:使用 Casbin 定义策略。
// Casbin RBAC 策略文件示例 (model.conf + policy.csv)
// model.conf:
[request_definition]
r = sub, obj, act

[policy_definition]
p = sub, obj, act

[role_definition]
g = _, _

[matchers]
m = g(r.sub, p.sub) && r.obj == p.obj && r.act == p.act

// policy.csv:
p, admin, /api/data, read
p, admin, /api/data, write
p, user, /api/data, read
g, alice, admin
g, bob, user

ABAC(基于属性的访问控制)

  • 核心概念:策略引擎根据 主体属性(部门、职级)、资源属性(机密等级)、环境属性(时间、IP)动态决策。
  • 典型实现:XACML、AWS IAM Policy、Google Zanzibar。
  • Go 示例:使用 OPA (Open Policy Agent) 编写 Rego 策略。
// OPA Rego 策略示例:仅允许上班时间访问生产环境
package authz

default allow = false

allow {
    input.user.role == "operator"
    input.resource.env == "production"
    time.clock(input.request_time, [9, 0, 0])  // 9:00 AM
    time.clock(input.request_time, [18, 0, 0]) // 6:00 PM
}

1.5 模型选型建议

选型决策树:
  • 系统级安全(内核、文件系统)→ MAC(SELinux)
  • 简单应用、个人项目 → DAC(文件权限)
  • 企业级 Web 应用、SaaS → RBAC(Casbin、K8s RBAC)
  • 微服务、IoT、多租户、动态策略 → ABAC(OPA、Zanzibar)
常见误区:不要试图用 RBAC 实现 ABAC 的细粒度(如“仅允许部门经理在上班时间查看本部门薪资”),会导致角色爆炸。此时应直接选用 ABAC 或 RBAC+ABAC 混合模型。

1.6 权限验证在 Go 中的典型架构

下图展示了一个 Go 微服务中权限验证的典型调用链:

Go 微服务权限验证调用链 API Gateway Auth Middleware Policy Engine Business Service Go 权限验证典型流程 1. Gateway 提取 JWT Token → 2. Middleware 解析用户身份 3. Policy Engine 根据 RBAC/ABAC 策略判断 → 4. 允许/拒绝请求 常用 Go 库:Casbin、OPA/Rego、go-jwt、gin-authz

1.7 本章小结

  • 权限验证是系统安全的基石,缺失将导致数据泄露与越权风险。
  • DAC/MAC/RBAC/ABAC 各有适用场景,从简单到复杂、从静态到动态演进。
  • Go 生态中 Casbin(RBAC)和 OPA(ABAC)是主流权限引擎,后续章节将深入实战。