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层和数据分发机制。
2.3.1 核心组件
- OPA引擎(opa):核心运行时,负责解析Rego策略、加载数据并执行查询。提供RESTful API和gRPC接口。
- 策略包(Policy Bundle):将多个.rego文件、数据文件打包成一个压缩文件,便于分发和加载。
- 数据分发:支持通过文件系统、HTTP API或Bundle API将策略和数据推送到OPA实例。
2.3.2 工作流详解
在Serverless流水线中,OPA的工作流通常遵循以下步骤:
- 策略编写:开发者使用Rego编写安全策略,例如“只允许使用特定基础镜像”或“禁止暴露敏感环境变量”。
- 策略分发:通过CI/CD流水线将策略包推送到OPA服务器或作为Sidecar部署。
- 请求拦截:Serverless平台(如Knative、OpenFaaS)在部署或调用时,将请求元数据(如镜像标签、函数配置)作为
input发送给OPA。 - 策略评估:OPA引擎根据
input和data执行Rego规则,返回allow或deny决策。 - 执行决策:Serverless平台根据OPA的决策结果,允许或拒绝该次部署/调用。
架构要点:OPA不直接执行策略(如修改配置或阻止请求),它只做决策。具体的执行动作(如拒绝部署、发送告警)由外部系统(Serverless平台、CI/CD工具)根据OPA返回的决策结果自行实现。这种分离确保了OPA的通用性和可扩展性。