Open Policy Agent(OPA) 【1】介绍(1)

简介: Open Policy Agent(OPA) 【1】介绍(1)

Open Policy Agent(OPA)

tags: OPA,策略

文章目录

Open Policy Agent(OPA)

1. OPA 介绍

2. OPA 解决了哪些问题

3. rego介绍

4. OPA 安装

5. OPA 运行

6. OPA run(互动式)

7. OPA run(服务器)

8. Rego 语法

8.1 参考

8.2 表达式(逻辑与)

8.3 逻辑或

8.4 Variables变量

8.5 迭代

8.6 规则

8.6.1 完整规则

8.6.2 部分规则

8.7 语法示例

9. 将 OPA 用作Go库

1. OPA 介绍

开放策略代理(OPA,发音为“ oh-pa”)是一个开放源代码的通用策略引擎,它统一了整个堆栈中的策略执行。OPA提供了一种高级的声明性语言,使您可以将策略指定为代码和简单的API,以减轻软件决策的负担。您可以使用OPA在微服务,Kubernetes,CI / CD管道,API网关等中实施策略。


OPA 最初是由 Styra 公司在 2016 年创建并开源的项目,目前该公司的主要产品就是提供可视化策略控制及策略执行的可视化 Dashboard 服务的。


OPA 首次进入 CNCF 并成为 sandbox 级别的项目是在 2018 年, 在 2021 年的 2 月份便已经从 CNCF 毕业,这个过程相对来说还是比较快的,由此也可以看出 OPA 是一个比较活跃且应用广泛的项目。


透过现象看本质,策略就是一组规则,请求发送到引擎,引擎根据规则来进行决策。OPA 并不负责具体任务的执行,它仅负责决策,需要决策的请求通过 JSON 的方式传递给 OPA ,在 OPA 决策后,也会将结果以 JSON 的形式返回。

1035234-20181020215539574-213176954.png

2. OPA 解决了哪些问题

OPA通过评估查询输入以及针对策略和数据来生成策略决策。OPA和Rego是域无关的,因此您可以描述策略中几乎所有类型的不变式。例如:


哪些用户可以访问哪些资源;

允许哪些子网出口流量;

必须将工作负载部署到哪个群集;

可以从哪些注册表二进制文件下载;

容器可以执行哪些OS功能;

可以在一天的哪个时间访问系统;

需要策略控制用户是否可登陆服务器或者做一些操作;

需要策略控制哪些项目/哪些组件可进行部署;

需要策略控制如何访问数据库;

10.需要策略控制哪些资源可部署到 Kubernetes 中;

策略决策不仅限于简单的是/否或允许/拒绝答案。像查询输入一样,您的策略可以生成任意结构化数据作为输出。

1035234-20181020215539574-213176954.png

但是对于这些场景或者软件来说,配置它们的策略是需要与该软件进行耦合的,彼此是不统一,不通用的。管理起来也会比较混乱,带来了不小的维护成本。

OPA 的出现可以将各处配置的策略进行统一,极大的降低了维护成本。以及将策略与对应的软件/服务进行解耦,方便进行移植/复用。

1035234-20181020215539574-213176954.png

假设您在具有以下系统的组织中工作:

1035234-20181020215539574-213176954.png

系统中包含三种组件:

  • 服务器暴露零层或多个协议(例如,http,ssh等等)
  • 网络连接服务器,可以是公共的或私有的。公共网络已连接到Internet。
  • 端口将服务器连接到网络。

所有服务器,网络和端口均由脚本设置。该脚本接收系统的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},
        {"id": "net4", "public": true}
    ],
    "ports": [
        {"id": "p1", "network": "net1"},
        {"id": "p2", "network": "net3"},
        {"id": "p3", "network": "net2"}
    ]
}

当天早些时候,您的老板告诉您必须实施的新安全策略:


Servers reachable from the Internet must not expose the insecure ‘http’ protocol.

从Internet可访问的服务器不能暴露不安全的“http”协议。

Servers are not allowed to expose the ‘telnet’ protocol.

服务器不允许公开’telnet’协议

配置了服务器,网络和端口并且合规团队希望定期审核系统以查找违反策略的服务器时,必须执行该策略。


您的老板已要求您确定OPA是否适合实施该政策。

3. rego介绍

OPA 中的策略是以 Rego 这种 DSL(Domain Specific Language) 来表示的。


Rego 受 Datalog(https://en.wikipedia.org/wiki/Datalog) 的启发,并且扩展了 Datalog 对于结构化文档模型的支持,方便以 JSON 的方式对数据进行处理。


Rego 允许策略制定者可以专注于返回内容的查询而不是如何执行查询。同时 OPA 中也内置了执行规则时的优化,用户可以默认使用。


Rego 允许我们使用规则(if-then)封装和重用逻辑,规则可以是完整的或者是部分的。


每个规则都是由头部和主体组成。在 Rego 中,如果规则主体对于某些变量赋值为真,那么我们说规则头为真。可以通过绝对路径引用任何加载到 OPA 中的规则来查询它的值。规则的路径总是:data…(规则生成的所有值都可以通过全局 data 变量进行查询。例如,下方示例中的 data.example.rules.any_public_networks


完整规则是将单个值分配给变量的 if-then 语句。

1035234-20181020215539574-213176954.png

部分规则是生成一组值并将该组分配给变量的 if-then 语句

1035234-20181020215539574-213176954.png

逻辑或是要在 Rego 中定义多个具有相同名称的规则。(查询中将多个表达式连接在一起时,表示的是逻辑 AND)

1035234-20181020215539574-213176954.png

4. OPA 安装

本节说明如何直接查询OPA并在自己的计算机上与其交互。

1.下载OPA

要开始从GitHub版本下载适用于您平台的OPA二进制文件,请执行以下操作:

在macOS(64位)上:

curl -L -o opa https://openpolicyagent.org/downloads/v0.28.0/opa_darwin_amd64

在Linux(64位)上:

curl -L -o opa https://openpolicyagent.org/downloads/v0.28.0/opa_linux_amd64
chmod 755 ./opa
cp opa /usr/local/bin/
$ opa version
Version: 0.35.0
Build Commit: a54537a
Build Timestamp: 2021-12-01T02:11:47Z
Build Hostname: 9e4cf671a460
Go Version: go1.17.3
WebAssembly: unavailable

容器

$ docker run --rm  openpolicyagent/opa:0.35.0 version    
Version: 0.35.0
Build Commit: a54537a
Build Timestamp: 2021-12-01T02:10:31Z
Build Hostname: 4ee9b086e5de
Go Version: go1.17.3
WebAssembly: available

5. OPA 运行

与OPA交互的最简单方法是通过命令行使用opa eval子命令。opa eval是一把瑞士军刀,可用于评估任意的Rego表达式和策略。opa eval支持大量用于控制评估的选项。常用标志包括:


旗帜 短的 描述


–bundle -b 将捆绑包文件或目录加载到OPA中。该标志可以重复。

–data -d 将策略或数据文件加载到OPA中。该标志可以重复。

–input -i 加载数据文件并将其用作input。该标志不能重复。

–format -f 设置要使用的输出格式。默认值为json,并且旨在用于程序设计。该pretty格式发出了更多人类可读的输出。

–fail 不适用 如果查询未定义,则以非零的退出代码退出。

–fail-defined 不适用 如果查询不是未定义的,则以非零的退出代码退出。

例如:


input.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},
        {"id": "net4", "public": true}
    ],
    "ports": [
        {"id": "p1", "network": "net1"},
        {"id": "p2", "network": "net3"},
        {"id": "p3", "network": "net2"}
    ]
}

example.rego:

package example
default allow = false                               # unless otherwise defined, allow is false
allow = true {                                      # allow is true if...
    count(violation) == 0                           # there are zero violations.
}
violation[server.id] {                              # a server is in the violation set if...
    some server
    public_server[server]                           # it exists in the 'public_server' set and...
    server.protocols[_] == "http"                   # it contains the insecure "http" protocol.
}
violation[server.id] {                              # a server is in the violation set if...
    server := input.servers[_]                      # it exists in the input.servers collection and...
    server.protocols[_] == "telnet"                 # it contains the "telnet" protocol.
}
public_server[server] {                             # a server exists in the public_server set if...
    some i, j
    server := input.servers[_]                      # it exists in the input.servers collection and...
    server.ports[_] == input.ports[i].id            # it references a port in the input.ports collection and...
    input.ports[i].network == input.networks[j].id  # the port references a network in the input.networks collection and...
    input.networks[j].public                        # the network is public.
}

执行:

root@master:~/cks/opa# ./opa eval "1*2+3"
{
  "result": [
    {
      "expressions": [
        {
          "value": 5,
          "text": "1*2+3",
          "location": {
            "row": 1,
            "col": 1
          }
        }
      ]
    }
  ]
}
root@master:~/cks/opa# ./opa eval -i input.json -d example.rego "data.example.violation[x]"
{
  "result": [
    {
      "expressions": [
        {
          "value": "ci",
          "text": "data.example.violation[x]",
          "location": {
            "row": 1,
            "col": 1
          }
        }
      ],
      "bindings": {
        "x": "ci"
      }
    },
    {
      "expressions": [
        {
          "value": "busybox",
          "text": "data.example.violation[x]",
          "location": {
            "row": 1,
            "col": 1
          }
        }
      ],
      "bindings": {
        "x": "busybox"
      }
    }
  ]
}
root@master:~/cks/opa# ./opa eval --fail-defined -i input.json -d example.rego "data.example.violation[x]"
{
  "result": [
    {
      "expressions": [
        {
          "value": "ci",
          "text": "data.example.violation[x]",
          "location": {
            "row": 1,
            "col": 1
          }
        }
      ],
      "bindings": {
        "x": "ci"
      }
    },
    {
      "expressions": [
        {
          "value": "busybox",
          "text": "data.example.violation[x]",
          "location": {
            "row": 1,
            "col": 1
          }
        }
      ],
      "bindings": {
        "x": "busybox"
      }
    }
  ]
}
root@master:~/cks/opa# echo $?
1
相关文章
|
4月前
|
JSON 编译器 网络安全
open policy agent 语法总结
open policy agent 语法总结
57 1
|
Cloud Native
Open Policy Agent (OPA) 【3】实战
Open Policy Agent (OPA) 【3】实战
Open Policy Agent (OPA) 【3】实战
|
存储 JSON Kubernetes
Open Policy Agent(OPA) 【2】rego 语法
Open Policy Agent(OPA) 【2】rego 语法
|
缓存 Cloud Native Go
Open Policy Agent(OPA) 【1】介绍(3)
Open Policy Agent(OPA) 【1】介绍(3)
|
存储 SQL JSON
Open Policy Agent(OPA) 【1】介绍(2)
Open Policy Agent(OPA) 【1】介绍(2)
|
23小时前
|
机器学习/深度学习 人工智能 自然语言处理
Gemini 2.0:谷歌推出的原生多模态输入输出 + Agent 为核心的 AI 模型
谷歌最新推出的Gemini 2.0是一款原生多模态输入输出的AI模型,以Agent技术为核心,支持多种数据类型的输入与输出,具备强大的性能和多语言音频输出能力。本文将详细介绍Gemini 2.0的主要功能、技术原理及其在多个领域的应用场景。
41 20
Gemini 2.0:谷歌推出的原生多模态输入输出 + Agent 为核心的 AI 模型
|
2天前
|
人工智能 自然语言处理 前端开发
Director:构建视频智能体的 AI 框架,用自然语言执行搜索、编辑、合成和生成等复杂视频任务
Director 是一个构建视频智能体的 AI 框架,用户可以通过自然语言命令执行复杂的视频任务,如搜索、编辑、合成和生成视频内容。该框架基于 VideoDB 的“视频即数据”基础设施,集成了多个预构建的视频代理和 AI API,支持高度定制化,适用于开发者和创作者。
44 9
Director:构建视频智能体的 AI 框架,用自然语言执行搜索、编辑、合成和生成等复杂视频任务
|
23小时前
|
人工智能 API 语音技术
TEN Agent:开源的实时多模态 AI 代理框架,支持语音、文本和图像的实时通信交互
TEN Agent 是一个开源的实时多模态 AI 代理框架,集成了 OpenAI Realtime API 和 RTC 技术,支持语音、文本和图像的多模态交互,具备实时通信、模块化设计和多语言支持等功能,适用于智能客服、实时语音助手等多种场景。
33 15
TEN Agent:开源的实时多模态 AI 代理框架,支持语音、文本和图像的实时通信交互
|
10天前
|
人工智能 自然语言处理 JavaScript
Agent-E:基于 AutoGen 代理框架构建的 AI 浏览器自动化系统
Agent-E 是一个基于 AutoGen 代理框架构建的智能自动化系统,专注于浏览器内的自动化操作。它能够执行多种复杂任务,如填写表单、搜索和排序电商产品、定位网页内容等,从而提高在线效率,减少重复劳动。本文将详细介绍 Agent-E 的功能、技术原理以及如何运行该系统。
48 5
Agent-E:基于 AutoGen 代理框架构建的 AI 浏览器自动化系统
|
28天前
|
存储 人工智能 自然语言处理
AI经营|多Agent择优生成商品标题
商品标题中关键词的好坏是商品能否被主搜检索到的关键因素,使用大模型自动优化标题成为【AI经营】中的核心能力之一,本文讲述大模型如何帮助商家优化商品素材,提升商品竞争力。
105 13
AI经营|多Agent择优生成商品标题