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 权限模型演进关系图
下图展示了四种模型从简单到复杂、从静态到动态的演进关系:
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 微服务中权限验证的典型调用链:
1.7 本章小结
- 权限验证是系统安全的基石,缺失将导致数据泄露与越权风险。
- DAC/MAC/RBAC/ABAC 各有适用场景,从简单到复杂、从静态到动态演进。
- Go 生态中 Casbin(RBAC)和 OPA(ABAC)是主流权限引擎,后续章节将深入实战。