3. 策略即代码基础:OPA与Rego语言入门、策略定义与执行模型

在Sigstore处理资源配额模型漂移告警的复测流程中,策略即代码(Policy as Code, PaC)是核心决策引擎。OPA(Open Policy Agent)作为CNCF毕业项目,提供统一的策略评估框架;Rego则是其专用的声明式查询语言。本章将建立从语言基础到执行模型的完整认知。

3.1 OPA架构与策略执行模型

OPA将策略决策与业务逻辑解耦,采用“请求-决策”模型:外部系统(如Sigstore策略控制器)发送JSON格式的查询请求,OPA根据预定义的Rego策略返回决策结果。其核心组件包括:

  • 输入(Input):外部系统传入的临时数据,如资源配额使用量、命名空间标签、请求时间戳。
  • 数据(Data):持久化的基础数据,如配额阈值表、允许的镜像仓库列表、集群角色绑定。
  • 策略(Policy):Rego编写的规则集合,定义“允许/拒绝”或“警告/通过”的判定逻辑。
  • 决策(Decision):OPA返回的JSON结果,通常包含allow、deny、violations等字段。
关键概念:OPA不执行策略,只评估策略。实际执行(如拒绝Pod创建、触发告警)由外部系统(如Kubernetes Admission Webhook、Sigstore策略控制器)完成。
OPA 策略执行模型架构 Sigstore 策略控制器 (外部系统) Input 配额使用量 / 请求元数据 Data 配额阈值 / 基线配置 OPA 引擎 Rego 策略评估 规则匹配 / 聚合 决策生成 Decision allow / deny / violations 反馈回路:决策结果影响后续输入

3.2 Rego语言核心语法

Rego是一种声明式查询语言,受Datalog启发,专注于策略定义。其核心语法要素如下:

语法元素 说明 示例
规则(Rule) 策略的基本单元,形如 head := body allow := true { input.usage < data.threshold }
表达式(Expression) 条件判断,支持比较、逻辑、集合运算 input.namespace == "production"
迭代(Iteration) 使用 some 关键字遍历集合 some i; data.quotas[i].name == input.resource
聚合(Aggregation) count()、sum()、max() 等内置函数 count(violations) > 0
默认值(Default) 为规则设置默认结果,避免未定义 default allow := false
实践建议:在编写资源配额策略时,优先使用 default deny 模式(默认拒绝),然后通过白名单规则逐步放行。这符合最小权限原则,能有效捕获未预期的漂移。

3.3 资源配额策略的Rego实现

以下是一个针对Sigstore资源配额模型漂移检测的完整Rego策略示例。该策略检查当前资源使用量是否超过基线阈值的120%,并标记为“漂移告警”。

package sigstore.quota.drift

# 默认拒绝(未匹配到规则时视为违规)
default allow := false
default drift_detected := false

# 规则1:允许在配额阈值内的请求
allow {
    input.usage <= data.thresholds[input.resource].max
}

# 规则2:检测漂移——使用量超过基线120%
drift_detected {
    input.usage > data.thresholds[input.resource].baseline * 1.2
}

# 规则3:生成告警详情(仅当漂移时)
violations[msg] {
    drift_detected
    msg := sprintf("资源 %s 使用量 %.2f 超过基线120%%(基线: %.2f)", [
        input.resource,
        input.usage,
        data.thresholds[input.resource].baseline
    ])
}

3.4 策略执行模型对比

在Sigstore复测流程中,策略执行模型的选择直接影响告警响应速度与资源开销。下表对比了三种常见模型:

执行模型 触发方式 延迟 适用场景 Sigstore复测中的角色
Push(推送) 事件驱动,实时评估 毫秒级 准入控制、实时告警 首次漂移检测与即时阻断
Pull(拉取) 定时轮询,批量评估 秒级~分钟级 合规审计、周期报告 复测阶段的批量验证
Delta(增量) 基于状态变更的增量评估 亚秒级 大规模集群、频繁变更 漂移修复后的增量复测

3.5 策略测试与调试

OPA提供内置的测试框架,支持通过 opa test 命令验证策略正确性。在资源配额漂移场景中,建议覆盖以下测试用例:

  • 正常通过:使用量 <= 阈值,期望 allow = true,drift_detected = false
  • 漂移告警:使用量 > 基线120%,期望 drift_detected = true,violations 非空
  • 边界值:使用量恰好等于基线120%,期望触发漂移(浮点数精度需注意)
  • 缺失数据:输入中缺少 resource 字段,期望 allow = false 且不抛出异常
常见陷阱:Rego中的变量一旦赋值即不可变。在迭代中修改状态(如累加计数器)是不允许的,应使用 sum()、count() 等聚合函数替代。另外,注意浮点数比较时使用 > 而非 >= 避免边界歧义。
Rego 策略评估流程(资源配额漂移检测) 1. 接收 Input 2. 加载 Data 3. 规则匹配 4a. allow = true 4b. drift_detected 5. 生成 Decision 说明:规则匹配阶段同时评估所有规则,允许多条规则同时为真 最终决策由外部系统根据 allow 和 drift_detected 的优先级决定

3.6 与Sigstore的集成要点

在Sigstore资源配额漂移复测流程中,OPA策略的集成需注意以下关键点:

  • 数据绑定:通过 data 文档注入配额基线、历史漂移记录、修复操作日志等持久化数据。
  • 输入规范:Sigstore策略控制器发送的 input 必须包含 resource(资源名称)、usage(当前使用量)、namespace(命名空间)、timestamp(评估时间戳)。
  • 决策映射:OPA返回的 violations 数组直接映射为告警事件,allow 字段控制是否允许资源变更继续。
  • 缓存策略:对于频繁查询的配额阈值,建议在OPA侧启用 opa eval --partial 部分评估缓存,减少重复计算。
复测流程中的特殊处理:在复测阶段,OPA策略应额外接收 input.remediation_id 字段,用于关联历史修复操作。策略规则可据此判断:如果当前漂移已被标记为“修复中”,则降低告警级别或跳过重复告警。