2. OPA基础概念:策略即代码、Rego语言概述、OPA架构与工作流

在云原生与Serverless环境中,传统基于静态规则或人工审批的安全策略难以应对动态、短生命周期的基础设施。OPA(Open Policy Agent)通过将策略从软件逻辑中解耦,实现了策略即代码(Policy as Code)的核心理念。本章将深入剖析OPA的基础概念、Rego语言的核心语法以及OPA的运行时架构与工作流。

2.1 策略即代码(Policy as Code)

策略即代码是一种将安全、合规与治理规则以代码形式进行声明、版本控制、测试和自动执行的实践。OPA将策略决策从应用程序的请求处理逻辑中剥离,形成一个统一的决策层。

特性 传统策略管理 OPA策略即代码
存储方式 配置文件、数据库、硬编码 纯文本代码文件(.rego)
版本控制 难以追踪变更 原生支持Git等VCS
测试能力 依赖手动验证 支持单元测试与模拟
执行环境 绑定特定应用 独立于应用运行
变更影响 需重启服务 热加载,无中断
核心价值:在Serverless流水线中,每次函数部署或API调用都可能触发策略评估。OPA的策略即代码模式确保安全策略与基础设施代码(IaC)同步演进,实现“安全左移”。

2.2 Rego语言概述

Rego是OPA专用的声明式查询语言,专为在复杂嵌套数据结构(如JSON、YAML)上进行策略评估而设计。Rego的核心思想是将策略表达为对输入数据的查询,而非编写命令式的“if-else”逻辑。

2.2.1 基础语法要素

  • 规则(Rules):策略的基本单元,格式为 rule_name := expression 或 rule_name { condition }。
  • 表达式(Expressions):使用逻辑运算符(and、or、not)和比较运算符(==、!=、>、<)。
  • 迭代(Iteration):使用 some 关键字遍历数组或集合。
  • 内置函数(Built-ins):如 count()、split()、time.now_ns() 等。
# 示例:检查部署镜像是否来自允许的仓库
package serverless.deploy

# 定义允许的镜像仓库前缀
allowed_registries := ["docker.io/secure-team", "gcr.io/my-org"]

# 策略规则:如果镜像来源不在允许列表中,则拒绝
deny[msg] {
    input.image := image_name
    not startswith(image_name, allowed_registries[_])
    msg := sprintf("镜像 '%s' 来自未授权的仓库", [image_name])
}

2.2.2 关键概念对比

概念 说明 示例
input 外部传入的请求数据 input.method == "POST"
data OPA加载的外部上下文数据 data.allowed_users[user]
完全规则 产生一个确定的值 x := 5 + 3
部分规则 产生一组键值对或集合 allowed_ports[p] { p := 80; p := 443 }
默认规则 为规则提供默认值 default allow = false
常见误区:Rego中变量名以大写字母开头表示未绑定变量,用于匹配任意值。例如 deny[msg] { input.user := Name } 中的 Name 是变量,而非字符串。若需匹配字面量,应使用引号:input.user == "admin"。

2.3 OPA架构与工作流

OPA采用解耦架构,将策略决策(Policy Decision)与策略执行(Policy Enforcement)分离。其核心组件包括OPA引擎、API层和数据分发机制。

OPA 核心架构与决策流程 外部系统 (Serverless函数/API网关) 查询(input) OPA 引擎 策略评估 (Rego 解释器) 决策(allow/deny) 策略存储 (.rego 文件) 加载数据 数据上下文 (JSON/YAML 文档) 拉取/推送 外部数据源 (K8s API/DB/文件) 工作流说明: 1. 外部系统发送查询请求(input)到OPA引擎。 2. OPA引擎结合加载的策略(.rego)和数据上下文(data)进行规则评估。 3. 返回决策结果(allow/deny)给外部系统执行。

2.3.1 核心组件

  • OPA引擎(opa):核心运行时,负责解析Rego策略、加载数据并执行查询。提供RESTful API和gRPC接口。
  • 策略包(Policy Bundle):将多个.rego文件、数据文件打包成一个压缩文件,便于分发和加载。
  • 数据分发:支持通过文件系统、HTTP API或Bundle API将策略和数据推送到OPA实例。

2.3.2 工作流详解

在Serverless流水线中,OPA的工作流通常遵循以下步骤:

  1. 策略编写:开发者使用Rego编写安全策略,例如“只允许使用特定基础镜像”或“禁止暴露敏感环境变量”。
  2. 策略分发:通过CI/CD流水线将策略包推送到OPA服务器或作为Sidecar部署。
  3. 请求拦截:Serverless平台(如Knative、OpenFaaS)在部署或调用时,将请求元数据(如镜像标签、函数配置)作为input发送给OPA。
  4. 策略评估:OPA引擎根据input和data执行Rego规则,返回allow或deny决策。
  5. 执行决策:Serverless平台根据OPA的决策结果,允许或拒绝该次部署/调用。
Serverless 流水线中的 OPA 工作流 1. 代码提交 2. CI 流水线 3. OPA 策略检查 (安全合规评估) 4. 决策结果 拒绝部署 允许部署 关键集成点: • 在CI流水线中,OPA作为准入控制器,对构建产物(如Docker镜像、Helm Chart)进行安全扫描。 • 在CD部署阶段,OPA对Serverless函数的配置(如环境变量、IAM角色)进行合规校验。 • 决策结果直接决定流水线是否继续,实现自动化安全门禁。
架构要点:OPA不直接执行策略(如修改配置或阻止请求),它只做决策。具体的执行动作(如拒绝部署、发送告警)由外部系统(Serverless平台、CI/CD工具)根据OPA返回的决策结果自行实现。这种分离确保了OPA的通用性和可扩展性。