2. OPA基础概念:策略即代码、Rego语言简介、OPA与Kubernetes集成

2.1 策略即代码(Policy as Code)

传统策略管理依赖静态配置文件、人工审批或硬编码逻辑,难以审计、测试和版本控制。策略即代码将安全与合规规则以声明式代码的形式编写、存储和执行,使策略具备与应用程序代码同等的生命周期管理能力。

核心价值:
  • 版本化:策略文件可纳入 Git 等版本控制系统,支持变更追溯与回滚。
  • 可测试:通过单元测试验证策略逻辑,避免人工误判。
  • 自动化执行:策略在请求到达时实时评估,无需人工介入。
  • 一致性:同一套策略可跨环境(开发、测试、生产)复用。

OPA(Open Policy Agent)是策略即代码理念的标杆实现,它将策略决策从业务逻辑中解耦,提供统一的策略评估引擎。

2.2 Rego语言简介

Rego 是 OPA 原生的声明式查询语言,专为策略定义和评估设计。Rego 基于 Datalog(逻辑编程语言)扩展,支持复杂的数据结构查询、规则组合和否定推理。

2.2.1 Rego 核心语法

概念 语法示例 说明
规则(Rule) allow { input.role == "admin" } 条件为真时规则成立
默认值 default allow = false 未匹配时返回默认值
迭代(Iteration) some user; users[user] 遍历集合或对象
否定(Negation) not blocked_users[user] 检查条件不成立
聚合(Aggregation) count(users) > 10 内置函数支持计数、求和等

2.2.2 完整策略示例

package example.logs

# 默认拒绝所有请求
default allow = false

# 允许管理员读取所有日志
allow {
    input.role == "admin"
    input.action == "read"
}

# 允许审计员读取非敏感日志
allow {
    input.role == "auditor"
    input.action == "read"
    not input.log.contains("secret")
}

# 拒绝已废弃的组件访问
deny["deprecated_component"] {
    input.component == "log-collector-v1"
}
提示:Rego 规则是无副作用的——它只做决策,不修改数据。所有输入通过 input 对象传入,输出通过规则名(如 allow、deny)返回。

2.3 OPA与Kubernetes集成

OPA 通过 Admission Webhook 机制与 Kubernetes 深度集成,在资源创建、更新或删除时拦截请求并执行策略评估。集成架构如下图所示:

OPA 与 Kubernetes 集成架构 kubectl / 客户端 Kubernetes API Server OPA 策略引擎 创建/更新资源 AdmissionReview 允许/拒绝 策略存储 (ConfigMap) 数据缓存 (Bundle) 加载策略 同步数据 工作流程: 1. 客户端提交资源请求 → 2. API Server 构造 AdmissionReview → 3. OPA 评估策略 → 4. 返回允许/拒绝 → 5. API Server 执行决策

2.3.1 集成配置步骤

  1. 部署 OPA:在 Kubernetes 集群中安装 OPA,通常作为 Deployment 运行,并暴露 HTTPS 服务。
  2. 配置 ValidatingWebhookConfiguration:定义哪些资源(如 Pod、Service)需要触发策略评估。
  3. 编写 Rego 策略:将策略文件挂载到 OPA 容器中(通过 ConfigMap 或 Bundle API)。
  4. 测试验证:创建测试资源确认策略生效。

2.3.2 典型策略场景

场景 策略目标 Rego 关键逻辑
镜像来源限制 只允许使用私有仓库镜像 input.spec.containers[_].image 必须以 registry.example.com/ 开头
资源配额强制 所有容器必须设置 CPU/内存限制 input.spec.containers[_].resources.limits 不能为空
标签合规 必须包含 team 和 env 标签 input.metadata.labels.team 和 input.metadata.labels.env 存在
网络策略绑定 所有 Pod 必须关联 NetworkPolicy 检查 data.networkpolicies 中是否存在匹配的规则
注意:OPA 默认采用“白名单”模式——未显式允许的请求将被拒绝。生产环境中务必先配置 default allow = false 并逐步开放权限,避免误拦截。

2.4 本章小结

  • 策略即代码将安全规则转化为可版本化、可测试的代码资产。
  • Rego 是 OPA 的声明式策略语言,支持规则、迭代、否定和聚合等高级特性。
  • OPA + Kubernetes 通过 Admission Webhook 实现资源创建时的实时策略评估,是云原生安全准入控制的标准方案。