2. OPA核心概念:Policy、Data、Query、Input与Decision的完整生命周期

OPA(Open Policy Agent)的策略执行模型围绕五个核心概念构建:Policy(策略)、Data(数据)、Query(查询)、Input(输入)与Decision(决策)。理解这五个要素及其交互生命周期,是掌握OPA在云原生日志平台中实施访问控制的基础。

2.1 核心概念定义与职责

概念 英文 职责描述 日志平台示例
策略 Policy 用Rego语言编写的规则集合,定义“允许/拒绝”的逻辑 “只有日志所属项目的成员才能查询该日志流”
数据 Data OPA加载的持久化上下文信息,通常为JSON文档 用户-角色映射表、项目成员列表、日志保留策略
查询 Query 向OPA发起的评估请求,触发策略执行 data.log_acls.allow_query
输入 Input 每次查询时传入的临时请求上下文 用户ID、请求的日志ID、时间戳、操作类型
决策 Decision OPA评估后返回的结果,包含allow布尔值及可选原因 {"allow": true, "reason": "用户是项目管理员"}
关键区分:Data是持久化的全局上下文,在OPA启动时加载或通过API增量更新;Input是每次请求携带的临时上下文,随Query一起传入。两者在Rego策略中分别通过data和input关键字访问。

2.2 完整生命周期流程

OPA的策略评估并非一次性动作,而是一个包含加载→绑定→评估→返回四个阶段的闭环过程。下图展示了从日志平台发起请求到OPA返回决策的完整链路:

OPA核心概念生命周期:从Input到Decision 阶段1:加载 Policy + Data 阶段2:绑定 Query + Input 阶段3:评估 Rego引擎执行 阶段4:返回 Decision 日志平台 发起访问请求 持久化 触发评估 输出 决策响应 生命周期关键说明: 1. 加载阶段:OPA启动时加载Policy(.rego文件)和Data(JSON文档),构建规则库与上下文。 2. 绑定阶段:日志平台构造Query(如 data.log_acls.allow)和Input(用户ID、日志ID等)。 3. 评估阶段:Rego引擎将Input与Data绑定到Policy规则中,执行逻辑判断。 4. 返回阶段:OPA输出Decision(JSON对象),日志平台根据 allow 字段决定放行或拒绝。 5. 整个生命周期无状态:每次Query独立评估,不依赖历史请求上下文。 6. Data可通过OPA API增量更新,无需重启OPA服务即可生效。

2.3 各要素在Rego中的具体表现

2.3.1 Policy(策略)—— Rego规则文件

Policy是OPA的核心,使用Rego声明式语言编写。一个典型的日志访问控制策略包含默认规则和具体规则:

package log_acls

# 默认拒绝:没有明确允许的请求一律拒绝
default allow_query = false

# 规则1:如果用户是日志所属项目的成员,允许查询
allow_query {
    input.operation == "query"
    data.project_members[input.project_id][_] == input.user_id
}

# 规则2:如果用户是全局管理员,允许查询所有日志
allow_query {
    input.operation == "query"
    data.global_admins[_] == input.user_id
}
策略设计原则:在OPA中,default allow_query = false 是安全基线。所有规则通过逻辑与({}内的条件)组合,只要有一条规则的条件全部满足,allow_query 即为 true。这种“默认拒绝+显式允许”的模式是云原生访问控制的最佳实践。

2.3.2 Data(数据)—— 持久化上下文

Data是OPA在内存中维护的JSON文档树,可通过以下方式加载:

  • 启动加载:通过 --data 参数指定JSON文件或Rego文件中的data赋值。
  • API推送:通过 PUT /v1/data 接口增量更新特定路径。
  • Bundle拉取:从远端Bundle服务器获取策略与数据的打包文件。

日志平台中的Data示例:

{
  "project_members": {
    "project-alpha": ["user-001", "user-002", "user-003"],
    "project-beta":  ["user-002", "user-004"]
  },
  "global_admins": ["user-000", "user-001"],
  "log_retention_days": 90
}

2.3.3 Query(查询)与Input(输入)—— 请求触发

日志平台通过REST API向OPA发起查询,Query指定要评估的规则路径,Input携带请求上下文:

POST /v1/data/log_acls/allow_query
Content-Type: application/json

{
  "input": {
    "user_id": "user-002",
    "project_id": "project-alpha",
    "operation": "query",
    "log_id": "log-20250315-001",
    "timestamp": "2025-03-15T10:30:00Z"
  }
}
Input设计建议:Input应包含最小必要信息,避免携带敏感数据(如密码)。在日志平台场景中,推荐包含:用户标识、资源标识、操作类型、时间戳。OPA不存储Input,每次评估后即丢弃。

2.3.4 Decision(决策)—— 评估结果

OPA返回的Decision是一个JSON对象,包含查询路径对应的规则值:

{
  "result": true
}

如果策略中定义了更丰富的输出,Decision可以包含结构化信息:

# 增强策略:返回允许原因
allow_query = {"allowed": true, "reason": "user-002 是 project-alpha 的成员"} {
    input.operation == "query"
    data.project_members[input.project_id][_] == input.user_id
}

# 返回结果
{
  "result": {
    "allowed": true,
    "reason": "user-002 是 project-alpha 的成员"
  }
}

2.4 生命周期中的关键交互关系

下图展示了Policy、Data、Input在Rego引擎中的绑定与评估关系:

Policy、Data、Input在Rego引擎中的绑定关系 Policy(策略) Rego规则文件 package + rules Data(数据) 持久化JSON文档 data.* 引用 Input(输入) 请求上下文 input.* 引用 Rego引擎评估 规则匹配 → 条件求值 → 结果聚合 Decision(决策) 规则定义 上下文 请求参数 输出

2.5 生命周期中的关键特性

特性 说明 日志平台影响
无状态评估 每次Query独立执行,不依赖历史状态 支持水平扩展,每个OPA实例可独立处理请求
Data热更新 通过API增量更新Data,无需重启 用户权限变更后立即生效,无需重新部署
Input隔离 Input仅在单次Query中有效 防止请求间数据泄露,保障多租户安全
策略与数据分离 Policy定义逻辑,Data提供上下文 同一套策略可适配不同项目的数据
部分求值 支持预计算部分规则,加速后续评估 适用于日志平台中高频访问的静态权限检查
常见误区:不要将敏感业务逻辑写入Input。Input在OPA评估过程中可能被日志记录,如果包含密码或令牌,存在泄露风险。敏感信息应通过Data中的安全上下文传递,或由日志平台在调用OPA前完成身份认证。

2.6 生命周期在日志平台中的实际映射

以“用户查询项目日志”为例,完整生命周期映射如下:

  1. 加载阶段:OPA启动时加载 log_acls.rego 策略文件和 project_members.json 数据文件。
  2. 绑定阶段:日志平台收到用户查询请求,构造Query路径 data.log_acls.allow_query,Input包含 {"user_id": "user-002", "project_id": "project-alpha", "operation": "query"}。
  3. 评估阶段:Rego引擎将Input中的 user-002 与Data中的 project-alpha 成员列表匹配,发现 user-002 在成员列表中,规则条件满足。
  4. 返回阶段:OPA返回 {"result": true},日志平台放行该查询请求。

如果用户不在项目成员列表中,且不是全局管理员,则所有规则均不满足,allow_query 保持默认值 false,日志平台拒绝请求并返回403状态码。

总结:Policy、Data、Query、Input与Decision构成了OPA策略执行的完整闭环。Policy定义“做什么”,Data提供“依据什么”,Input描述“当前请求是什么”,Query触发“什么时候做”,Decision输出“结果是什么”。在云原生日志平台中,这五个要素的协同工作实现了细粒度、可热更新的访问控制能力。