4. Open Policy Agent (OPA) 入门:OPA的架构、Rego语言简介、本地安装OPA并运行第一个“Hello World”策略

4.1 OPA 核心架构与设计理念

Open Policy Agent (OPA) 是一个开源的、通用策略引擎,它将策略决策与业务逻辑执行分离。OPA 不负责处理请求,而是作为“策略决策点”(PDP)对外提供服务。其核心架构遵循“解耦”原则,使得策略可以在不修改应用代码的情况下独立更新。

核心思想: OPA 将策略视为数据,通过统一的查询接口(基于 Rego 语言)对外提供决策结果。任何需要策略判断的系统(如 Kubernetes、微服务网关、CI/CD 管道)都可以向 OPA 发送查询,OPA 返回“允许”或“拒绝”等决策。
OPA 核心架构与决策流程 外部系统 (K8s / API 网关 / 应用) 查询 (input) OPA 引擎 (Rego 策略评估) 决策 (allow/deny) 外部系统 (执行决策) 策略数据 (Rego 文件 / Bundle) 外部数据 (JSON / YAML 文档) OPA 通过 Rego 查询语言,将策略(Policy)和数据(Data)结合,对输入(Input)做出决策(Decision)。 策略与数据分离,使得策略可以独立于应用进行管理和分发。

4.2 Rego 语言简介

Rego 是 OPA 专用的声明式查询语言,灵感来源于 Datalog。它专为定义策略而设计,支持复杂的逻辑推理、数据查询和规则组合。Rego 的核心概念包括:

概念 说明 示例
规则 (Rule) 策略的基本单元,定义决策逻辑 allow { input.role == "admin" }
查询 (Query) 向 OPA 请求决策的表达式 data.example.allow
输入 (Input) 外部系统传入的请求数据 input.user, input.action
数据 (Data) 策略依赖的上下文信息 data.users, data.resources
迭代 (Iteration) 隐式循环,遍历集合 some user; data.users[user]
学习建议: Rego 的语法与主流编程语言(如 Python、JavaScript)差异较大,初学者应重点理解“声明式”思维——你只需要描述“策略是什么”,而不是“如何计算策略”。建议从简单的“允许/拒绝”规则开始,逐步过渡到复杂的数据查询。

4.3 本地安装 OPA

OPA 以单一二进制文件分发,安装过程非常简单。以下是针对主流操作系统的安装步骤:

  1. 下载 OPA 二进制文件: 从 OPA 官方 GitHub Releases 页面下载对应操作系统的版本。
  2. 赋予执行权限: 在 Linux/macOS 上使用 chmod +x opa 命令。
  3. 验证安装: 运行 ./opa version 查看版本信息。
  4. (可选)添加到 PATH: 将 OPA 二进制移动到 /usr/local/bin/ 或类似目录,方便全局调用。
快速安装命令(Linux/macOS):
# 下载最新版 OPA
curl -L -o opa https://openpolicyagent.org/downloads/latest/opa_linux_amd64

# 赋予执行权限
chmod 755 ./opa

# 验证安装
./opa version

4.4 编写并运行第一个“Hello World”策略

我们将创建一个最简单的策略,用于判断某个用户是否被允许访问系统。该策略将演示 Rego 的基本语法和 OPA 的交互方式。

步骤 1:创建策略文件

创建一个名为 hello.rego 的文件,内容如下:

package example

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

# 如果输入的用户名是 "admin",则允许访问
allow {
    input.user == "admin"
}

步骤 2:使用 OPA 评估策略

OPA 支持多种评估模式。最直接的方式是通过命令行传入输入数据:

# 评估:用户为 "admin",预期返回 true
echo '{"user": "admin"}' | ./opa eval --format pretty \
    --data hello.rego \
    --input - \
    "data.example.allow"

# 输出:true

# 评估:用户为 "guest",预期返回 false
echo '{"user": "guest"}' | ./opa eval --format pretty \
    --data hello.rego \
    --input - \
    "data.example.allow"

# 输出:false

步骤 3:启动 OPA 服务器(交互式模式)

OPA 也可以作为 HTTP 服务器运行,提供 RESTful API 接口:

# 启动 OPA 服务器,加载策略文件
./opa run --server --log-level=info hello.rego

# 在另一个终端中,使用 curl 发送查询请求
curl -X POST http://localhost:8181/v1/data/example/allow \
    -H "Content-Type: application/json" \
    -d '{"input": {"user": "admin"}}'

# 返回:{"result":true}
OPA 交互模式:CLI 评估 vs 服务器模式 CLI 评估模式 一次性输入 + 策略 → 输出结果 适合:测试、调试、CI/CD 管道 命令:opa eval 服务器模式 持续运行,通过 HTTP API 提供服务 适合:生产环境、微服务集成 命令:opa run --server 两种模式共享相同的策略引擎和 Rego 语法 策略文件(.rego)无需修改即可在两种模式下运行

4.5 策略结构解析

理解 Rego 策略文件的结构是编写复杂策略的基础。以下是对 hello.rego 的逐行解析:

代码行 说明
package example 定义策略包名,用于在查询时引用(如 data.example.allow)
default allow = false 设置默认值,当没有规则匹配时,allow 的值为 false(安全默认)
allow { input.user == "admin" } 定义规则:当 input.user 等于 "admin" 时,allow 为 true
常见陷阱: Rego 中的变量名区分大小写,且规则体(花括号内的部分)中的所有条件必须同时满足(逻辑与)。如果需要“或”逻辑,需要定义多条同名规则。例如,允许 admin 或 manager 访问,需要写两条 allow { ... } 规则。

4.6 本章小结

通过本章的学习,你已经掌握了 OPA 的核心架构、Rego 语言的基本概念,并成功在本地安装 OPA 并运行了第一个策略。关键收获包括:

  • 架构理解: OPA 作为策略决策点,将策略与业务逻辑解耦。
  • Rego 基础: 声明式语法、规则、输入、数据等核心概念。
  • 安装与运行: 二进制安装、CLI 评估、服务器模式。
  • 策略编写: 从简单的“Hello World”策略开始,理解默认拒绝原则。