ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Open Policy Agent(OPA)入门指南:用 Rego 将策略写成代码,在任意软件栈中统一执行

Open Policy Agent(OPA)入门指南:用 Rego 将策略写成代码,在任意软件栈中统一执行 后端认证鉴权云原生【免费下载链接】opaOpen Policy Agent (OPA) is an open source, general-purpose policy engine.项目地址https://gitcode.com/gh_mirrors/op/opa点击查看免费下载导读Open Policy AgentOPA读作 oh-pa是一个开源的通用策略引擎它把策略决策与策略执行解耦你的软件只需向 OPA 发起查询并提供结构化数据如 JSONOPA 就会根据用 Rego 语言编写的策略返回决策结果。本文以 OPA 官方文档 Introduction 章节为骨架带你从零掌握 OPA 的核心思想、Rego 语言的基础语法与规则写法并通过一个服务器网络安全策略的完整实战示例逐步走通opa eval命令行、opa run交互式 REPL、HTTP 服务模式以及 Go 库嵌入这四种使用方式。OPA 是什么策略决策与策略执行的解耦OPA 是一个开源的、通用目的的策略引擎用于将策略执行统一到整个技术栈中。它提供一种高级声明式语言让你能够把策略写成代码并通过简单 API 将策略决策从业务软件中剥离出来。你可以在微服务、Kubernetes、CI/CD 流水线、API 网关等场景中使用 OPA 执行策略。OPA 是云原生计算基金会CNCF的毕业项目graduated project其毕业公告于 2021 年 2 月发布。OPA 的核心设计思想是policy decoupling策略解耦详见 philosophy 文档。当你的软件需要做策略决策时它查询OPA 并提供结构化数据例如 JSON作为输入OPA 接受任意结构化数据作为输入然后通过评估查询输入 × 策略 × 数据来生成策略决策。因为 OPA 和 Rego 是领域无关domain-agnostic的你几乎可以用策略描述任何类型的规则例如用户访问某个资源必须具备哪些角色出站流量被允许进入哪些网络网段允许拉取容器镜像的镜像仓库列表一天中系统可以在哪些时段被访问容器中的二进制文件可以发起哪些系统调用。值得注意的是策略决策不限于简单的 yes/no 或 allow/deny。和查询输入一样你的策略也可以输出任意结构化数据。这意味着 OPA 不仅能回答是否允许还能告诉你哪些服务器违反了规则、具体错在哪里。实战场景管理一个由端口连接的服务器网络假设你的组织有一批服务器通过端口连接到受管网络上。基础设施以代码方式供给并用 JSON 表示。网络拓扑关系如下用 mermaid 图描述三个网络net1私有、net2私有、net3公有可访问 Internet五台服务器ci连接net1与net3busybox连接net1app连接net1、net3、net2cache连接net2db连接net2。服务器使用协议如http、ssh等通过端口通信这些端口将服务器连接到公有或私有网络。对应的 JSON 描述如下{ servers: [ { id: app, protocols: [https, ssh], ports: [p1, p2, p3] }, { id: db, protocols: [mysql], ports: [p3] }, { id: cache, protocols: [memcache], ports: [p3] }, { id: ci, protocols: [http], ports: [p1, p2] }, { id: busybox, protocols: [telnet], ports: [p1] } ], networks: [ { id: net1, public: false }, { id: net2, public: false }, { id: net3, public: true } ], ports: [ { id: p1, network: net1 }, { id: p2, network: net3 }, { id: p3, network: net2 } ] }组织制定了如下必须落实的安全策略可从 Internet 访问的服务器不得暴露不安全的http协议。服务器不允许暴露telnet协议。该策略需要在服务器、网络和端口被供给时强制执行同时合规团队希望定期审计系统、找出违反策略的服务器。下面我们就用 OPA 和 Rego 来实现这条策略。用 Rego 编写策略OPA 的策略使用一种高级声明式语言Rego读作 ray-go来表达。Rego 专为在复杂的层次化数据结构上表达策略而设计。完整的语言特性参见 Policy Language 文档。官方文档中的示例是交互式的你可以修改上文输入数据中的服务器、网络和端口输出会随之变化。你也可以在本地用opa eval命令运行这些示例见下文安装并运行 OPA一节。基础语法访问输入数据当 OPA 评估策略时它会把查询中提供的数据绑定到全局变量input上。你可以用.点操作符引用输入数据的特定部分package servers output : input.servers引用数组元素时使用熟悉的方括号语法package servers output : input.servers[0].protocols[0]提示如果键名包含除[a-zA-Z0-9_]之外的字符也可以用同样的方括号语法例如input[foo~bar]。如果你引用了不存在的值OPA 会返回undefined未定义。Undefined 意味着 OPA 无法找到任何结果package servers output : input.foobar最简单的策略决策是对输入数据执行逻辑运算的表达式。例如用做相等检查判断某个服务器是否有特定 IDpackage servers output : input.servers[0].id appOPA 内置了一组内置函数built-in functions可用于执行字符串处理、正则匹配、算术、聚合等常见操作。例如用count统计协议数量并做比较package servers output : count(input.servers[0].protocols) 1表达式组合AND 与变量赋值要让查询产生结果查询中的所有表达式都必须为真或已定义。表达式可以跨多行书写也可以在同一行用;连接表示 ANDpackage servers output if { input.servers[0].id app input.servers[0].protocols[0] https }如果查询中任何一个表达式不为真或未定义结果就是 undefined。下面示例中第二个表达式为假package servers output if { input.servers[0].id app input.servers[0].protocols[0] telnet }注意只有表达式位于同一条规则体中时它们才以 AND 连接。下面这个例子中对input.servers的两次检查位于不同的规则体中因此是 OR 关系。详见下文逻辑 OR小节。output if { input.servers[0].id app } output if { input.servers[0].protocols[0] telnet }你可以用:赋值操作符把值存入中间变量让复杂规则更易读。变量可以像input一样被引用并且和input一样不可变package servers output if { s : input.servers[0] s.id app p : s.protocols[0] p https }当 OPA 评估表达式时它会为变量寻找使所有表达式为真的取值。如果不存在这样的变量赋值结果就是 undefinedpackage servers output if { s : input.servers[0] s.id app s.protocols[1] telnet }迭代some ... in ...想象你需要检查是否存在公有网络。回忆 networks 是放在数组里的[{id: net1, public: false}, {id: net2, public: false}, ...]你可能天真地想逐个索引检查package servers # 只要有一个为真exists_public_network 就为真。 exists_public_network if input.networks[0].public true # 或 exists_public_network if input.networks[1].public true # 或 exists_public_network if input.networks[2].public true # 或 exists_public_network if input.networks[3].public true # ...这种方法是有问题的网络数量可能多到无法静态罗列而且数量在事前可能未知。和 SQL 等其他声明式语言一样Rego 中的迭代是隐式发生的。解决这个问题的方法是使用some ... in ...遍历集合package servers exists_public_network if { some network in input.networks network.public true }OPA 会对绑定到network的每个元素评估规则体。只要有任何元素满足规则体中的所有表达式规则就被定义。例如要找出是否有任何服务器暴露了不安全的http协议可以这样写package servers http_server if { some server in input.servers http in server.protocols }或者找出连接到公有网络的端口 IDpackage servers exposed_ports contains port.id if { some port in input.ports some network in input.networks port.network network.id network.public true }与引用不存在的字段或匹配失败的表达式一样如果 OPA 无法找到满足所有表达式的匹配结果就是 undefinedpackage servers email_server if { some server in input.servers # 没有任何服务器有这个协议 imap in server.protocols }FOR SOMEsomesome ... in ...用于迭代集合其最后一个参数并把变量key、value 位置绑定到集合元素上。它为规则体其余部分的求值引入新的绑定。in操作符的详细文档参见 policy-language 文档。用some前面介绍的迭代模式可以构造成具名规则package servers public_network contains net.id if { some net in input.networks # 存在某个网络且... net.public # 它是公有的。 } shell_accessible contains server.id if { some server in input.servers telnet in server.protocols } shell_accessible contains server.id if { some server in input.servers ssh in server.protocols }FOR ALLeveryevery允许你简洁地表达某个条件对领域内的所有元素都成立。先修改输入给某个服务器加上telnet协议{ servers: [ { id: busybox, protocols: [http, ftp] }, { id: db, protocols: [mysql, ssh] }, { id: web, protocols: [https] } ] }然后断言没有任何服务器暴露telnetpackage servers no_telnet_exposed if { every server in input.servers { not telnet in server.protocols } }every关键字的详细说明参见 policy-language 文档。策略规则Policy RulesRego 允许你用**规则rules来封装和复用逻辑。规则本质上就是 if-then 逻辑语句分为完整规则complete rules和部分规则partial rules**两类。完整规则Complete Rules完整规则是为变量赋单一值的 if-then 语句。每条规则由**规则头head和规则体body**组成。在 Rego 中如果规则体对某组变量赋值为真规则头就为真。package rules # 规则头 exists_public_network : true if { # 规则体 some network in input.networks # 存在某个网络且... network.public true # 它是公有的。 }你可以像查询其他值如input或你自己的变量一样查询规则生成的值package rules exists_public_network : true if { some network in input.networks network.public true } another_rule : { public_networks: exists_public_network, }所有规则生成的值都可以通过全局data变量从加载进 OPA 的其他包中查询package another_package yet_another_rule : { public_networks: data.rules.exists_public_network, }提示你可以通过绝对路径查询加载进 OPA 的任何规则的值。规则的路径总是data.package-path.rule-name。如果你省略规则头的 value部分值的默认值为true。可以把上面的例子改写为如下形式而不改变其含义exists_public_network if { some network in input.networks network.public true }要定义常量可以省略规则体。省略规则体时它默认为true。由于规则体为真规则头就总是真/已定义的package servers max_allowed_protocols : 5这样定义的常量可以像其他任何值一样被查询count(input.servers[0].protocols) max_allowed_protocols如果 OPA 找不到满足规则体的变量赋值规则就是 undefined这不等于 false。例如如果提供给 OPA 的input中没有公有网络那么exists_public_network就是 undefined。下面 OPA 拿到的是另一组输入网络没有任何一个公有{ networks: [ { id: n1, public: false }, { id: n2, public: false } ] }package rules exists_public_network if { some network in input.networks network.public true }部分规则Partial Rules部分规则是为变量生成一组值的 if-then 语句。下面示例中public_network contains net.id是规则头some net in input.networks; net.public是规则体。你可以像查询其他值一样查询整个值集合package example # 规则头 public_network contains net.id if { # 规则体 some net in input.networks # 存在某个网络且... net.public # 它是公有的。 }利用in关键字可以用这个集合测试某个值是否属于public_network定义的集合package example allow if net3 in public_network你也可以通过变量引用集合元素来遍历这个集合package example allow if { some net in public_network net net3 }除了部分定义集合你还可以部分定义键值对即对象。更多信息参见 policy-language 文档中的 Rules 一节。逻辑 OR在查询中把多个表达式连接起来表达的是逻辑 AND。要在 Rego 中表达逻辑 OR就定义多个同名规则。下面的例子说明了这一点。假设你想知道是否有任何服务器暴露了给客户端 shell 访问权限的协议。可以定义一个完整规则声明当任何服务器暴露telnet或ssh协议时shell_accessible为true{ servers: [ { id: busybox, protocols: [http, telnet] }, { id: db, protocols: [mysql, ssh] }, { id: web, protocols: [https] } ] }package example.logical_or default shell_accessible : false shell_accessible if { some server in input.servers telnet in server.protocols } shell_accessible if { some server in input.servers ssh in server.protocols }提示default关键字告诉 OPA当所有其他同名规则都是 undefined 时为该变量赋值。当对部分规则使用逻辑 OR 时每条规则定义都会为赋给变量的值集合贡献元素。例如可以把上面的例子改写成生成暴露telnet或ssh的服务器集合package example.logical_or shell_accessible contains server.id if { some server in input.servers telnet in server.protocols } shell_accessible contains server.id if { some server in input.servers ssh in server.protocols }提示当析取disjunction贡献一个值时多条同名规则是惯用写法。如果析取仅作为某一条规则体内部的检查使用也可以使用or关键字需要 import参见 policy-reference 文档。完整示例产出可读的违规清单前面几节解释了 Rego 的核心概念。现在把自然语言描述的策略汇总起来可从 Internet 访问的服务器不得暴露不安全的http协议。服务器不允许暴露telnet协议。从宏观上看该策略需要识别出违反某些条件的服务器。为此定义名为violation的规则生成一组违反策略的服务器。例如package example violation contains message if { # 以下情况时某台服务器进入违规集合... some server in public_servers # 它存在于 public_servers 集合中且... http in server.protocols # 它包含不安全的 http 协议。 message : sprintf(server %s exposes http, [server.id]) } violation contains message if { # 以下情况时某台服务器进入违规集合... some server in input.servers # 它存在于 input.servers 集合中且... telnet in server.protocols # 它包含 telnet 协议。 message : sprintf(server %s exposes telnet, [server.id]) } public_servers contains server if { # 以下情况时某台服务器进入 public_servers 集合... some server in input.servers # 它存在于 input.servers 集合中且... some port in server.ports # 它有一个端口... some input_port in input.ports port input_port.id # 该端口被端口列表引用... # 端口引用了 input.networks 集合中的某个网络且... some input_network in input.networks input_port.network input_network.id # 该网络是公有的。 input_network.public }这个示例展示了 Rego 如何生成一份清晰的策略违规清单将其交还给基础设施即代码Infrastructure as Code系统向用户展示让用户轻松看到哪里出了问题。这正是策略输出任意结构化数据能力的实战体现。安装并运行 OPA本节介绍如何在你自己的机器上直接查询 OPA 并与它交互。如果你只想快速感受一下这门语言而不想安装任何东西可以使用官方在线 Playgroundplay.openpolicyagent.org。1. 下载 OPAmacOS使用 Homebrew 安装同时支持 ARM64 与 AMD64 架构brew install opa也可以直接下载二进制# arm64Apple Silicon curl -L -o opa https://openpolicyagent.org/downloads/latest/opa_darwin_arm64 # amd64旧款 Intel Mac curl -L -o opa https://openpolicyagent.org/downloads/latest/opa_darwin_amd64下载后确保二进制可执行并建议移动到PATH中的目录以便在不同目录下运行chmod 755 ./opaLinux/Unix# arm64 curl -L -o opa https://openpolicyagent.org/downloads/latest/opa_linux_arm64 # amd64 curl -L -o opa https://openpolicyagent.org/downloads/latest/opa_linux_amd64同样需要chmod 755 ./opa并建议加入PATH。此外Linux/Unix 还有多个社区维护的软件包仓库如 Arch、nixpkgs、Wolfi、FreeBSD、NetBSD 等提供 OPA 二进制这些包由各自社区维护版本可能不是最新的。Windows使用 PowerShell 下载Invoke-WebRequest -Uri https://openpolicyagent.org/downloads/latest/opa_windows_amd64.exe -OutFile opa.exe或者使用 curlcurl -L -o opa.exe https://openpolicyagent.org/downloads/latest/opa_windows_amd64.exe创建 Tools 目录并把opa.exe加入PATHmkdir C:\Tools\OPA move opa.exe C:\Tools\OPA\然后通过控制面板 → 系统 → 高级系统设置 → 环境变量编辑 Path 变量并添加C:\Tools\OPA或直接运行[Environment]::SetEnvironmentVariable(Path, $env:Path;C:\Tools\OPA, User)Docker也可以直接通过 Docker 运行 OPA最新稳定镜像标签为openpolicyagent/opa:latest。验证安装无论哪种方式运行以下命令验证安装opa versiondocker run --rm -it openpolicyagent/opa:latest version所有平台的二进制文件均可在官方发布页获取校验和checksum可以通过在二进制文件名后追加.sha256获得。例如校验 macOS arm64 二进制BINARY_NAMEopa_darwin_arm64 curl -L -O https://openpolicyagent.org/downloads/latest/$BINARY_NAME curl -L -O https://openpolicyagent.org/downloads/latest/$BINARY_NAME.sha256 shasum -c $BINARY_NAME.sha2562. 尝试opa eval与 OPA 交互最简单的方式之一是通过命令行子命令opa eval见 cli 文档。它可以用于评估任意的 Rego 表达式和策略。opa eval支持大量控制评估的选项常用参数如下FlagShort说明--bundle-b将 bundle 文件或目录加载进 OPA。可重复指定。--data-d将策略或数据文件加载进 OPA。可重复指定。--input-i加载数据文件并将其用作input。不可重复指定。--format-f设置输出格式。默认是json面向程序化使用pretty格式输出更易读。--failn/a当查询结果未定义undefined时以非零退出码退出。--fail-definedn/a当查询结果不是未定义时以非零退出码退出。从源码实现看opa eval的参数校验逻辑位于 cmd/eval.go--fail与--fail-defined互斥cmd/eval.go且二者不可同时指定执行结束后若--fail且结果未定义、或--fail-defined且结果已定义命令会以退出码 1 退出cmd/eval.go其余评估错误则返回退出码 2。输出格式方面除了默认的json源码还支持values、bindings、pretty、source部分评估结果、raw、discard等格式cmd/eval.go。CLI 命令入口定义在 main.go 中它调用cmd.RootCommand.Execute()并根据错误类型映射退出码。沿用上文的输入数据与策略文件可以这样用命令行求值{ servers: [ { id: app, protocols: [https, ssh], ports: [p1, p2, p3] }, { id: db, protocols: [mysql], ports: [p3] }, { id: cache, protocols: [memcache], ports: [p3] }, { id: ci, protocols: [http], ports: [p1, p2] }, { id: busybox, protocols: [telnet], ports: [p1] } ], networks: [ { id: net1, public: false }, { id: net2, public: false }, { id: net3, public: true } ], ports: [ { id: p1, network: net1 }, { id: p2, network: net3 }, { id: p3, network: net2 } ] }package example default allow : false # 除非另有定义否则 allow 为 false allow if { # allow 为真当且仅当... count(violation) 0 # 违规数量为零。 } violation contains server.id if { # 以下情况时服务器进入违规集合... some server in public_servers # 它存在于 public_servers 集合中且... http in server.protocols # 它包含不安全的 http 协议。 } violation contains server.id if { # 以下情况时服务器进入违规集合... some server in input.servers # 它存在于 input.servers 集合中且... telnet in server.protocols # 它包含 telnet 协议。 } public_servers contains server if { # 以下情况时服务器进入 public_servers 集合... some server in input.servers # 它存在于 input.servers 集合中且... some port in server.ports # 它引用了 input.ports 集合中的一个端口且... some input_port in input.ports port input_port.id some input_network in input.networks # 该端口引用了 input.networks 集合中的一个网络且... input_port.network input_network.id # 该网络是公有的。 input_network.public }# 求值一个简单表达式。 ./opa eval 1*23 # 在命令行求值一个策略。 ./opa eval -i input.json -d example.rego data.example.violation[x] # 在命令行求值策略并利用退出码。 ./opa eval --fail-defined -i input.json -d example.rego data.example.violation[x] echo $?提示Rego 和 OPA 拥有成熟的开发者工具链支持在编辑器与 IDE 中进行实时求值和调试参见 editor-and-ide-support 文档。3. 尝试opa run交互式 REPLOPA 内置了一个通过opa run子命令访问的交互式 shell / REPLRead-Eval-Print-Loop见 cli 文档。你可以用 REPL 来试验策略、快速原型新策略。启动 REPL./opa run在 REPL 中输入语句OPA 会求值并打印结果 true true 3.14 3.14 [hello, world] [ hello, world ]大多数 REPL 允许你定义变量并在之后引用。OPA 也支持类似能力例如定义pi常量 pi : 3.14定义之后就可以查询它的值并用它书写表达式 pi 3.14 pi 3 true按 Control-D 或输入exit退出 REPL exit你可以在命令行传入策略和数据文件把它们加载进 REPL。默认情况下JSON 和 YAML 文件被挂载在data下opa run input.json然后可以运行一些查询来查看数据 data.servers[0].protocols[1] data.servers[i].protocols[j] net : data.networks[_]; net.public要把某个数据文件设置为 REPL 中的input文档可以在文件路径前加上repl.input:前缀opa run example.rego repl.input:input.json data.example.public_servers[s]说明在文件路径前加引用前缀可以控制文件被加载到data下的位置。按惯例REPL 在每次求值语句时通过读取data.repl.input来设置查询看到的input文档。详细说明可在 REPL 中输入help input查看。REPL 的具体实现位于 repl/repl.go它通过repl.New创建实例并包装了v1包中的 REPL 逻辑opa run命令则在 cmd/run.go 中注册。4. 尝试opa run服务模式要与 OPA 集成可以把它作为服务器运行并通过 HTTP 执行查询。用-s或--server启动服务模式./opa run --server ./example.rego默认情况下 OPA 监听localhost:8181的 HTTP 连接。运行opa run --help可以查看修改监听地址、启用 TLS 等选项。在另一个终端用curl或类似工具访问 OPA 的 HTTP API。查询/v1/dataHTTP API 时必须把输入数据包装在 JSON 对象中{ input: value }复制一份用于curl发送的输入文件cat EOF v1-data-input.json { input: $(cat input.json) } EOF执行几个curl请求并检查输出curl localhost:8181/v1/data/example/violation -d v1-data-input.json -H Content-Type: application/json curl localhost:8181/v1/data/example/allow -d v1-data-input.json -H Content-Type: application/json默认情况下data.system.main用于服务无路径的策略查询。执行不带路径的查询时不需要包装输入。如果data.system.main决策是 undefined则会被视为错误curl localhost:8181 -i -d input.json -H Content-Type: application/json你可以重启 OPA并把任何决策配置为默认决策./opa run --server --setdefault_decisionexample/allow ./example.rego重新执行上面最后一条curl命令curl localhost:8181 -i -d input.json -H Content-Type: application/json5. 把 OPA 作为 Go 库嵌入OPA 可以作为库嵌入到 Go 程序中。最简单的嵌入方式是导入github.com/open-policy-agent/opa/rego包import github.com/open-policy-agent/opa/rego调用rego.New函数创建一个可被 prepare 或 evaluate 的对象r : rego.New( rego.Query(x data.example.allow), rego.Load([]string{./example.rego}, nil))rego.Rego支持多种自定义求值的选项。构造新的rego.Rego对象后可以调用PrepareForEval()获得可执行的查询。如果PrepareForEval()失败说明传给rego.New()的某个选项无效例如解析错误、编译错误等ctx : context.Background() query, err : r.PrepareForEval(ctx) if err ! nil { // 处理错误 }从源码看PrepareForEval会解析输入、模块与查询参数并经历解析parse、编译compile等阶段最终生成一个可复用的PreparedEvalQueryv1/rego/rego.go。预备好的查询对象可以缓存在内存中、跨多个 goroutine 共享并针对不同输入反复调用。调用Eval()执行预备查询bs, err : ioutil.ReadFile(./input.json) if err ! nil { // 处理错误 } var input any if err : json.Unmarshal(bs, input); err ! nil { // 处理错误 } rs, err : query.Eval(ctx, rego.EvalInput(input)) if err ! nil { // 处理错误 }rego.EvalInput正是把输入配置到评估上下文的选项——它将input存入评估上下文的rawInput并标记hasInputv1/rego/rego.go。策略决策包含在Eval()返回的结果中你可以检查决策并相应处理// 在此例中我们预期单个结果存储在变量 x 中。 fmt.Println(Result:, rs[0].Bindings[x])把上面的步骤组合起来就是一个简单的命令行程序用于求值策略并输出结果package main import ( context encoding/json fmt log os github.com/open-policy-agent/opa/v1/rego ) func main() { ctx : context.Background() // 构造一个可被 prepare 或 evaluate 的 Rego 对象。 r : rego.New( rego.Query(os.Args[2]), rego.Load([]string{os.Args[1]}, nil)) // 创建一个可被求值的预备查询。 query, err : r.PrepareForEval(ctx) if err ! nil { log.Fatal(err) } // 从 stdin 加载 input 文档。 var input any dec : json.NewDecoder(os.Stdin) dec.UseNumber() if err : dec.Decode(input); err ! nil { log.Fatal(err) } // 执行预备查询。 rs, err : query.Eval(ctx, rego.EvalInput(input)) if err ! nil { log.Fatal(err) } // 对结果做点什么。 fmt.Println(rs) }按如下方式运行上面的代码go run main.go example.rego data.example.violation input.json下一步如果你对如何编写 Rego 策略还有更多疑问可以参考Policy Reference 文档内置函数的参考文档Policy Language 文档全部语言特性的完整说明。如果你想针对特定用例尝试 OPA一些热门教程包括Kubernetes 页面如何把 OPA 用作 Kubernetes 中的准入控制器admission controllerEnvoy 页面如何把 OPA 用作 Envoy 的外部授权器external authorizerTerraform 页面如何用 OPA 校验 Terraform 计划。别忘了为你常用的编辑器或文本编辑器安装 OPARego插件获得语法高亮、实时求值与调试等 IDE 体验。仓库中v1/目录下还维护着完整的 v1 版本库实现如 v1/rego、v1/ast、v1/topdown深入阅读这些源码可以进一步理解 OPA 的编译与求值管道。赞分享后端认证鉴权云原生【免费下载链接】opaOpen Policy Agent (OPA) is an open source, general-purpose policy engine.项目地址https://gitcode.com/gh_mirrors/op/opa点击查看免费下载相关推荐Open Policy Agent 数据过滤实践用 OPA 编写策略、在 SQL 中强制执行Open Policy Agent 数据过滤实践用 OPA 编写策略、在 SQL 中强制执行 Open Policy Agent OPA 的策略能力不止于允后端认证鉴权云原生Traefik 中的 OPAOpen Policy Agent中间件用 Rego 策略控制访问与注入请求头Traefik 中的 OPAOpen Policy Agent中间件用 Rego 策略控制访问与注入请求头 OPAOpen Policy Agent中后端API网关负载均衡微服务网络云原生在 Apache APISIX 中使用 Open Policy Agentopa插件实现统一授权与 RBAC 策略在 Apache APISIX 中使用 Open Policy Agentopa插件实现统一授权与 RBAC 策略 Apache APISIX 的 opaAPI网关后端云原生微服务创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表