1. 权限安全基础:权限模型与最小权限原则

权限安全,说白了就是回答三个问题:谁、能干什么、在什么条件下。我做了十几年安全架构,见过太多因为权限设计不合理导致的严重事故。今天咱们就从最基础的权限模型讲起。

1.1 权限的本质与边界

先聊聊权限的本质。我个人理解,权限就是主体对客体的操作许可。主体可以是人、服务、设备;客体是文件、数据库、API;操作就是读、写、执行、删除。

边界在哪?边界就是权限不能超越职责。你想想看,一个普通员工能看工资条,但不能改工资条;能提交报销,但不能审批自己的报销。这就是边界。

核心观点:权限的本质是信任的量化表达。你给一个人多大权限,就代表你信任他到什么程度。但信任需要验证,需要边界。

我在项目中遇到过一家金融公司,他们把管理员权限给了所有运维人员。结果一个实习生误操作,删了生产数据库的索引。嗯,这就是边界没划清楚。

1.2 四大经典权限模型

权限模型发展了几十年,主流的有四种。我按出现顺序给你捋一遍。

模型 全称 核心思想 适用场景
DAC 自主访问控制 资源所有者自己决定谁可以访问 个人文件、共享文档
MAC 强制访问控制 系统根据安全标签强制控制 军事、政府机密系统
RBAC 基于角色的访问控制 权限绑定到角色,用户通过角色获得权限 企业应用、ERP、CRM
ABAC 基于属性的访问控制 根据主体、客体、环境属性动态决策 微服务、云原生、IoT

DAC:自主访问控制

DAC 是最早的模型。文件的主人说了算,他想给谁读就给谁读。Linux 的文件权限就是典型例子。

# Linux 文件权限示例
-rw-r--r--  1 alice devteam  1024 Jan 15 10:00 report.pdf
# alice 可以读写,devteam 组员只能读,其他人只能读

但 DAC 有个大问题:权限传播不可控。A 把文件分享给 B,B 又分享给 C,最后谁有权限你根本不知道。我曾经帮一家律所做安全审计,发现一个机密合同被分享了七层,源头早查不到了。

MAC:强制访问控制

MAC 正好相反,权限不由用户决定,由系统强制。每个主体和客体都有安全标签,比如「绝密」「机密」「公开」。只有标签匹配才能访问。

我记得在给某政府部门做方案时,他们要求所有文档必须打标签,用户不能越级读,也不能越级写。这就是典型的 MAC 场景。

注意:MAC 虽然安全等级高,但灵活性差。普通企业用 MAC 会把自己逼疯——审批流程太长,业务根本跑不动。

RBAC:基于角色的访问控制

RBAC 是目前企业用得最多的模型。它引入了「角色」这个中间层。权限不直接给用户,而是给角色,用户通过扮演角色获得权限。

# RBAC 权限分配示例
角色: 财务主管
  权限: 查看财务报表、审批报销单、导出账目

用户: 张三
  角色: 财务主管
  实际权限: 查看财务报表 + 审批报销单 + 导出账目

这样做的好处是管理方便。你想想看,公司有 1000 个员工,如果每个人单独配权限,配到猴年马月?但抽象成 10 个角色,管理成本直线下降。

不过 RBAC 也有坑。我在项目中遇到过一家公司,他们定义了 200 多个角色,比员工还多。这就失去了 RBAC 的意义。角色粒度要适中,我建议一个角色覆盖 10-50 个用户比较合理。

ABAC:基于属性的访问控制

ABAC 是更灵活的模型。它不看你是谁,而是看你有什么属性。属性包括:

  • 主体属性:部门、职级、工龄、是否通过安全培训
  • 客体属性:机密等级、所属项目、创建时间
  • 环境属性:访问时间、IP 地址、设备类型、地理位置

举个例子:

# ABAC 策略示例(伪代码)
策略: 允许访问财务系统
条件:
  主体.部门 == "财务部" AND
  主体.职级 >= "高级" AND
  环境.时间 BETWEEN "09:00" AND "18:00" AND
  环境.IP 属于公司内网

ABAC 的威力在于动态决策。同样是财务部的人,高级员工白天在公司能访问,初级员工或者晚上从家里访问就被拒绝。这在 RBAC 里很难实现。

我的建议:不要盲目追求 ABAC。它虽然灵活,但策略管理复杂,性能开销也大。中小型企业用 RBAC 就够了,等业务复杂到 RBAC 撑不住时再考虑 ABAC。

1.3 最小权限原则

最小权限原则,英文叫 Principle of Least Privilege,简称 PoLP。它的定义很简单:只给完成任务所需的最小权限,不多给一分。

听起来简单,做起来难。我见过太多反面案例:

  • 给所有开发人员生产数据库的 root 权限
  • 给实习生管理员账号「方便学习」
  • 一个服务用超级管理员账号跑

我曾经帮一家电商公司做安全加固。他们有个订单处理服务,居然用 root 账号跑。我说为什么?答曰「省事」。结果这个服务被 SQL 注入,攻击者直接拿到了整个数据库。如果当时只给订单表的读写权限,损失会小得多。

实施最小权限,我总结了四个步骤:

  1. 梳理权限清单:列出每个角色/服务需要访问哪些资源
  2. 按需分配:只给必要的操作(读/写/执行),不给多余的
  3. 定期审计:每季度检查一次权限,收回不再需要的
  4. 动态调整:人员变动、职责变化时及时更新权限

避坑指南:我曾经遇到一个团队,他们给所有 API 都配了「*」通配符权限。理由是「以后可能用到」。结果一个内部 API 被外部调用,差点酿成数据泄露。记住:权限只能收缩,不能扩张。一开始给最小,需要时再申请增加。

1.4 权限模型选型对比

选哪个模型?我根据实际经验给你一个参考:

场景 推荐模型 理由
个人文件管理 DAC 简单直接,用户自己控制
高安全等级系统 MAC 强制策略,不可绕过
企业通用业务系统 RBAC 管理方便,成熟稳定
微服务/云原生 ABAC 动态决策,适应复杂环境
混合场景 RBAC + ABAC 角色做粗粒度,属性做细粒度

我个人习惯用 RBAC 做基础框架,然后在关键节点用 ABAC 做精细化控制。比如:角色决定「能不能访问财务模块」,属性决定「能不能在非工作时间访问」。这样既保证了管理效率,又兼顾了灵活性。

1.5 本章知识体系图

下面这张图把本章的核心知识点串起来了。你可以把它当作思维导图来用。

权限安全基础 - 知识体系图 权限安全基础 权限本质与边界 四大权限模型 最小权限原则 模型选型 主体-客体-操作 信任量化表达 DAC MAC RBAC ABAC 梳理权限清单 按需分配 定期审计 动态调整 场景匹配 RBAC+ABAC混合 核心原则:权限是信任的量化表达,必须遵循最小权限原则 选型建议:中小型用RBAC,复杂场景用RBAC+ABAC混合

这张图把本章内容分成了四个板块。你可以看到,权限本质是基础,四大模型是工具,最小原则是底线,选型是实战。它们环环相扣,缺一不可。

学习建议:先理解 DAC、MAC、RBAC、ABAC 的区别,再重点掌握 RBAC 和 ABAC 的落地方法。最小权限原则要刻在脑子里——每次设计权限时都问自己一句:「这个权限真的需要吗?」