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