2. ABAC核心概念:属性、策略、规则与决策引擎

好,咱们正式开始啃ABAC的核心概念。这一章是整个课程的基石,说白了,后面所有复杂策略都是从这里长出来的。我个人习惯把ABAC拆成四个积木块:属性(Attribute)、策略(Policy)、规则与条件(Rule & Condition),以及决策引擎(PDP)与策略管理点(PAP)。搞懂这四个东西,你就掌握了ABAC的骨架。

2.1 属性(Attribute)的定义与分类

属性是什么?简单说,就是描述一个实体“是谁、有什么、在哪儿、什么时候”的标签。在ABAC里,一切决策都围绕属性展开。没有属性,策略就是空话。

我一般把属性分成四大类,你记牢了:

属性类别 英文 典型例子 说明
主体属性 Subject Attributes 用户ID、角色、部门、职级、安全等级 谁在发起请求
资源属性 Resource Attributes 文件类型、密级、所属项目、创建者 要访问什么东西
环境属性 Environment Attributes 当前时间、IP地址、设备类型、地理位置 在什么环境下访问
操作属性 Action Attributes 读、写、删除、导出、审批 想干什么事

嗯,这里要注意一点:属性不是随便定义的。我在项目中遇到过团队把“用户昵称”也当成属性,结果策略里根本用不上,白白增加了属性管理的复杂度。我的建议是——只定义那些真正参与决策的属性。

小技巧:属性值最好从统一身份源(比如LDAP、HR系统)同步,别让业务系统各自维护。否则你会陷入“属性不一致”的泥潭。

2.2 策略(Policy)的构成要素

策略是ABAC的核心产物。它告诉决策引擎:在什么条件下,允许谁对什么资源做什么操作。

一个完整的策略,我个人习惯拆成五个要素:

  1. 策略ID —— 唯一标识,方便审计和追溯。
  2. 目标(Target) —— 策略适用于哪些主体、资源、操作。说白了就是“这个策略管谁”。
  3. 规则集(Rule Set) —— 一组规则的集合,决定最终是允许还是拒绝。
  4. 效果(Effect) —— Permit(允许)或 Deny(拒绝)。
  5. 义务(Obligation) —— 决策后必须执行的动作,比如“记录审计日志”或“发送通知”。

举个例子,一个典型的策略片段长这样:

策略ID: POL-FIN-001
目标:
  主体: 部门 = "财务部"
  资源: 类型 = "财务报表"
  操作: 读取
规则集:
  - 如果 当前时间 在 09:00-18:00 之间 → 允许
  - 否则 → 拒绝
效果: Permit
义务: 记录审计日志
避坑指南:我曾经见过一个团队把几十条规则塞进一个策略里,结果调试时根本分不清哪条生效。我的建议是——一个策略只解决一个权限场景。比如“财务部读取报表”单独一个策略,“管理员删除报表”另起一个。这样维护起来清爽得多。

2.3 规则(Rule)与条件(Condition)

规则是策略里的“执行单元”。一条规则通常包含一个条件(Condition)和一个效果(Effect)。条件就是布尔表达式,返回true或false。

条件可以简单,也可以复杂。比如:

  • 简单条件:user.department == "Engineering"
  • 复合条件:user.department == "Engineering" && resource.classification == "Internal"
  • 带函数条件:timeInRange(currentTime, "09:00", "18:00")

为什么会这样设计?因为实际业务里很少只有一个条件。我记得在做一个金融项目时,需求是“只有风控经理在工作时间且IP来自内网时才能导出客户数据”。你看,这就组合了主体属性、环境属性和操作属性。

核心原则:条件表达式必须幂等——同样的输入,永远返回同样的输出。别在条件里写随机数或者依赖外部状态,否则决策结果会飘忽不定。

2.4 决策引擎(PDP)与策略管理点(PAP)

这两个是ABAC架构里的“大脑”和“编辑器”。

  • PDP(Policy Decision Point) —— 策略决策点。它接收请求,加载策略,评估规则,返回决策结果。PDP本身不存储策略,它只做计算。
  • PAP(Policy Administration Point) —— 策略管理点。它是策略的“创作工坊”,负责策略的编写、测试、版本管理和发布。

PDP和PAP的关系,你可以理解为:PAP写好菜谱,PDP照着菜谱做菜。两者必须解耦,否则策略一改就得重启服务,这在生产环境里是不可接受的。

下面这张图展示了它们在整个ABAC架构中的位置:

ABAC核心组件交互图 用户/请求者 PEP PDP 资源 PAP 策略存储 请求 XACML请求 允许/拒绝 加载策略 发布/更新 说明 PEP:策略执行点 负责拦截请求并执行决策

从图上你能看到:用户请求先到PEP(策略执行点),PEP把请求转成标准格式发给PDP,PDP从PAP发布的策略存储里加载策略,做出决策,然后PEP根据决策结果允许或拒绝用户访问资源。整个过程里,PAP只负责策略的“写”,PDP只负责策略的“算”,职责非常清晰。

实战建议:PDP最好设计成无状态服务,这样你可以水平扩展。PAP则需要支持策略版本回滚,万一新策略有问题,能秒级恢复到上一个版本。我在生产环境里就靠这个功能救过两次火。

本章小结

这一章我们拆解了ABAC的四个核心积木:属性是决策的“原料”,策略是“配方”,规则和条件是“烹饪步骤”,PDP和PAP是“厨房和厨师”。你想想看,没有原料做不出菜,没有配方不知道做什么,没有步骤会搞砸,没有厨房和厨师一切白搭——这四个东西缺一不可。