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返回决策的完整链路:
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引擎中的绑定与评估关系:
2.5 生命周期中的关键特性
| 特性 | 说明 | 日志平台影响 |
|---|---|---|
| 无状态评估 | 每次Query独立执行,不依赖历史状态 | 支持水平扩展,每个OPA实例可独立处理请求 |
| Data热更新 | 通过API增量更新Data,无需重启 | 用户权限变更后立即生效,无需重新部署 |
| Input隔离 | Input仅在单次Query中有效 | 防止请求间数据泄露,保障多租户安全 |
| 策略与数据分离 | Policy定义逻辑,Data提供上下文 | 同一套策略可适配不同项目的数据 |
| 部分求值 | 支持预计算部分规则,加速后续评估 | 适用于日志平台中高频访问的静态权限检查 |
常见误区:不要将敏感业务逻辑写入Input。Input在OPA评估过程中可能被日志记录,如果包含密码或令牌,存在泄露风险。敏感信息应通过Data中的安全上下文传递,或由日志平台在调用OPA前完成身份认证。
2.6 生命周期在日志平台中的实际映射
以“用户查询项目日志”为例,完整生命周期映射如下:
- 加载阶段:OPA启动时加载
log_acls.rego策略文件和project_members.json数据文件。 - 绑定阶段:日志平台收到用户查询请求,构造Query路径
data.log_acls.allow_query,Input包含{"user_id": "user-002", "project_id": "project-alpha", "operation": "query"}。 - 评估阶段:Rego引擎将Input中的
user-002与Data中的project-alpha成员列表匹配,发现user-002在成员列表中,规则条件满足。 - 返回阶段:OPA返回
{"result": true},日志平台放行该查询请求。
如果用户不在项目成员列表中,且不是全局管理员,则所有规则均不满足,allow_query 保持默认值 false,日志平台拒绝请求并返回403状态码。
总结:Policy、Data、Query、Input与Decision构成了OPA策略执行的完整闭环。Policy定义“做什么”,Data提供“依据什么”,Input描述“当前请求是什么”,Query触发“什么时候做”,Decision输出“结果是什么”。在云原生日志平台中,这五个要素的协同工作实现了细粒度、可热更新的访问控制能力。