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
相关文章
|
1月前
|
JSON 编译器 网络安全
open policy agent 语法总结
open policy agent 语法总结
36 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)
|
1月前
|
存储 人工智能
|
8天前
|
人工智能 JSON 数据格式
RAG+Agent人工智能平台:RAGflow实现GraphRA知识库问答,打造极致多模态问答与AI编排流体验
【9月更文挑战第6天】RAG+Agent人工智能平台:RAGflow实现GraphRA知识库问答,打造极致多模态问答与AI编排流体验
RAG+Agent人工智能平台:RAGflow实现GraphRA知识库问答,打造极致多模态问答与AI编排流体验
|
10天前
|
人工智能 算法 自动驾驶
用AI自动设计智能体,数学提分25.9%,远超手工设计
【9月更文挑战第18天】《智能体自动设计(ADAS)》是由不列颠哥伦比亚大学等机构的研究者们发布的一篇关于自动化设计智能体系统的最新论文。研究中提出了一种创新算法——“Meta Agent Search”,此算法通过迭代生成并优化智能体设计,从而实现更高效的智能体系统构建。实验表明,相比人工设计的智能体,Meta Agent Search生成的智能体在多个领域均有显著的性能提升。然而,该方法也面临着实际应用中的有效性与鲁棒性等挑战。论文详细内容及实验结果可于以下链接查阅:https://arxiv.org/pdf/2408.08435。
44 12
|
2天前
|
人工智能 自然语言处理 API
深入浅出 LangChain 与智能 Agent:构建下一代 AI 助手
我们小时候都玩过乐高积木。通过堆砌各种颜色和形状的积木,我们可以构建出城堡、飞机、甚至整个城市。现在,想象一下如果有一个数字世界的乐高,我们可以用这样的“积木”来构建智能程序,这些程序能够阅读、理解和撰写文本,甚至与我们对话。这就是大型语言模型(LLM)能够做到的,比如 GPT-4,它就像是一套庞大的乐高积木套装,等待我们来发掘和搭建。
|
18天前
|
存储 机器学习/深度学习 人工智能
深入浅出 AI 智能体(AI Agent)|技术干货
随着人工智能技术的发展,智能体(AI Agents)逐渐成为人与大模型交互的主要方式。智能体能执行任务、解决问题,并提供个性化服务。其关键组成部分包括规划、记忆和工具使用,使交互更加高效、自然。智能体的应用涵盖专业领域问答、资讯整理、角色扮演等场景,极大地提升了用户体验与工作效率。借助智能体开发平台,用户可以轻松打造定制化AI应用,推动AI技术在各领域的广泛应用与深度融合。
226 0

热门文章

最新文章