第4章 策略即代码(PaC)入门

OPA 基础 · Rego 语法 · 策略编写与测试

4.1 OPA (Open Policy Agent) 基础

OPA 是一种开源的、通用策略引擎,将策略决策与业务逻辑解耦。它通过策略即代码的方式,让合规规则可版本化、可测试、可审计。OPA 使用高级声明式语言 Rego 来表达策略,支持 JSON、YAML、Protobuf 等多种输入格式。

请求 / 事件 OPA 引擎 决策 策略 (Rego)   |   数据文档 策略库 + 外部数据

OPA 将策略决策从应用中剥离,提供统一的策略即服务。典型集成包括 Kubernetes 准入控制、Terraform 计划检查、API 网关授权等。

4.2 Rego 语言语法

Rego 是专为 OPA 设计的声明式查询语言,灵感来自 Datalog。核心概念包括规则 (rules)、表达式、迭代和内置函数。

基础语法示例

package example.auth

# 允许所有管理员
allow {
    input.role == "admin"
}

# 允许拥有资源的用户
allow {
    input.role == "user"
    input.resource == "document"
    input.action == "read"
}

Rego 规则默认是逻辑与关系,同一规则内多个表达式必须同时满足。不同规则之间是逻辑或关系。

input.role 规则匹配 决策 Rego 规则集:默认 deny,显式 allow package example.auth allow { ... }

4.3 策略编写实战

编写策略通常遵循:定义package、编写规则、使用内置函数(如 count()、glob.match())。以下是一个合规策略:确保容器镜像来自受信任仓库。

package kubernetes.admission

deny[msg] {
    input.request.kind.kind == "Pod"
    container := input.request.object.spec.containers[_]
    not startswith(container.image, "trusted.registry.io/")
    msg := sprintf("容器镜像 %v 未使用受信任仓库", [container.image])
}

策略测试是 PaC 的关键环节。OPA 提供 opa test 命令,支持单元测试和覆盖率。

编写策略 .rego opa test 通过 测试文件:*_test.rego   断言:allow 或 deny

4.4 策略测试与验证

OPA 测试使用 test_ 前缀规则,结合 data 模拟输入。示例:

package example.auth_test

test_admin_allowed {
    allow with input as {"role": "admin", "action": "delete"}
}

test_user_denied {
    not allow with input as {"role": "user", "action": "delete"}
}

运行 opa test . --verbose 可查看详细结果。覆盖率报告使用 opa test --coverage。

命令说明
opa eval直接评估策略表达式
opa test运行策略测试
opa check静态检查语法
opa fmt格式化 Rego 代码
Rego 策略 测试框架 通过/失败 CI/CD 集成:opa test --coverage > 合规门禁