第4章 策略即代码(PaC)入门
OPA 基础 · Rego 语法 · 策略编写与测试
4.1 OPA (Open Policy Agent) 基础
OPA 是一种开源的、通用策略引擎,将策略决策与业务逻辑解耦。它通过策略即代码的方式,让合规规则可版本化、可测试、可审计。OPA 使用高级声明式语言 Rego 来表达策略,支持 JSON、YAML、Protobuf 等多种输入格式。
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 规则默认是逻辑与关系,同一规则内多个表达式必须同时满足。不同规则之间是逻辑或关系。
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 命令,支持单元测试和覆盖率。
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 代码 |