标签: open-policy-agent

使用开放策略代理 (OPA) 作为 ABAC 系统

我有一个项目需要 ABAC 对我的项目资源进行访问控制。我一直在研究 OPA 和 authzforce 作为实现 ABAC 的选项,而 OPA 看起来可能没有 authzforce 复杂。我看到 OPA 将自己与其他系统和范式进行了比较,但它为 ABAC 提供的示例还有很多不足之处。主要是因为 ABAC 需要使用点来执行策略、围绕策略做出决策、为策略决策获取主体和客体属性。我觉得 OPA 拥有除最后一部分之外的所有内容,但很难判断这是否属实,因为他们的 ABAC 示例只是一次性的。

我一直在互联网上寻找 OPA 用作 ABAC 实现的示例,但我什么也没找到。

我的项目是一个 Web 应用程序,它允许最终用户创建资源并为其资源创建策略。我计划为最终用户创建一个 UI 来创建他们的策略。我的计划是抽象掉它的编码方面,而是为它们提供下拉菜单和按钮,这个 UI 将在幕后使用自定义语法,我将其解释为 OPA 策略。

我遇到的主要问题是如何将其作为 ABAC 来实现,它是否像构建将获取主题、对象和环境的属性并在它和 OPA 之间创建胶水的部分一样直接(本质上是创建一个 PIP ) 因为 OPA 本身似乎是事实上的 PEP 和 PDP?

我觉得我被文档淹没了,而且 OPA 自己的文档中似乎缺少很多来解释如何做到这一点。

authorization xacml alfa abac open-policy-agent

10
推荐指数
2
解决办法
4315
查看次数

将开放策略代理与 ASP.Net Core Web API 集成

我正在观看有关 OPA(开放策略代理)的一些视频和教程,发现使用它跨多个服务/API 实现身份验证和授权真的很酷。但是,我无法了解如何在 Windows 上安装它并将其与 ASP.Net core Web API 集成以实现身份验证和授权。有人能帮我吗?

谢谢,

阿米特·阿南德

open-policy-agent

8
推荐指数
2
解决办法
5034
查看次数

在 OPA rego 中使用 OR 条件

我想使用 OR 运算来组合以下条件:

  • 我的计数arr不等于0
  • 我的email不包含"test.com"

目前我正在使用内置函数any()

any([count(arr) != 0, not contains(email, "test.com")])
Run Code Online (Sandbox Code Playgroud)

然而我的规则产生了错误。

我怎样才能一次性实现并改进这一目标?

open-policy-agent rego

6
推荐指数
2
解决办法
1万
查看次数

OR 在 Open Policy Agent(联合行为)中

在 OPA 中,很清楚如何查询condition AND condition

values := {
  "value1": {
    "a": "one"
  },
  "value2": {
    "a": "one",
    "b": "two"
  },
  "value3": {
    "a": "one",
    "b": "one"
  }
}

goodValues = [name |
  value = values[name]
  value.a == "one"
  value.b == "one"
]
Run Code Online (Sandbox Code Playgroud)

所以goodValues这里将value3只包含。

但是如何查询condition OR condition,以便goodValues将包含所有 3 个值,因为它们具有value.a == "one"OR value.b == "one"

open-policy-agent

5
推荐指数
1
解决办法
2855
查看次数

用于前端和后端策略评估的开放策略代理 (OPA)

我们的业务应用程序具有许多 OPA 似乎非常适合的策略规则。举一个简单的例子:“如果用户处于角色‘R’,则可以将订单从状态‘X’修改为‘Y’”。

理想情况下,我们希望在前端和后端评估其中一些规则。在 FE 中(在我们的例子中是 Angular 应用程序中的浏览器),以提供良好的用户体验(根据规则的评估使字段可编辑或不可编辑),当然,也在后端。理想情况下,这些规则应该是同步的。

我看到“OPA 能够将 Rego 策略编译成可执行的 Wasm 模块,可以使用不同的输入和外部数据进行评估。” (链接)还有一个 JavaScript SDK,因此这似乎是一个可行的选择。

我无法找到类似的问题或任何人做类似事情的参考,我想知道这是否是一个好方法,或者是否有更好的替代方案来解决当前的问题。

javascript policy web-frontend open-policy-agent

5
推荐指数
0
解决办法
815
查看次数

Rego测试:如何测试“不否认”?

我正在探索使用opa test以下简单规则来测试我的 Rego 策略:

\n\n
deny["Must be allowed"] {\n  input.allowed == "no"\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

我能够在被拒绝的情况下成功测试这一点:

\n\n
test_denied_example {\n  deny with input as {"allowed":"no"}\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

但是,当我尝试针对应该允许的情况对其进行测试时,如下所示:

\n\n
test_allowed_example {\n  not deny with input as {"allowed":"yes"}\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

我收到错误:

\n\n
data.example.test_allowed_example: FAIL (330.534\xc2\xb5s)\n\n  Enter data.example.test_allowed_example = _\n  | Enter data.example.test_allowed_example\n  | | Fail not data.example.deny with input as {"allowed": "yes"}\n  | Fail data.example.test_allowed_example = _\n
Run Code Online (Sandbox Code Playgroud)\n\n

test_allowed_example除了知道这是失败的测试之外,我无法真正解析此错误消息。

\n\n

如何正确测试允许(而不是拒绝)输入的情况?

\n

testing open-policy-agent rego

4
推荐指数
1
解决办法
3241
查看次数

开放策略代理满足所有数组项的条件

试图解决这个问题一段时间 - 我有一个包含数组的 JSON 输入,请说如下:

{
    "array" : [
        {"foo": "bar"},
        {"foo": "buzz"},
        {"misbehaving": "object"}
    ]
}
Run Code Online (Sandbox Code Playgroud)

我的目标是验证数组中的所有对象是否满足具有名为 foo 的字段的条件(实际用例是确保云部署中的所有资源都有标签)。我的问题是标准 rego 表达式被评估为“至少”而不是“全部”,这意味着表达式如下:

all_have_foo_field {
    input.array.foo
}
Run Code Online (Sandbox Code Playgroud)

总是返回 true,即使某些对象不满足这一点。我已经看过这个,但是评估一个正则表达式返回true或者false当我的策略检查字段是否存在时,这意味着如果它不存在,我会收到一个“var_is_unsafe”错误。

有任何想法吗?

open-policy-agent rego

3
推荐指数
1
解决办法
1468
查看次数

无法使用http.send请求资源

当我运行以下代码时:

data := response {
    response := http.send({
        "method" : "GET",
        "url": "https://httpbin.org/status/200"
    })
}
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

发生 1 个错误:policy.rego:4: rego_type_error: 表达式中的不安全内置函数调用:http.send

我使用 rego play 来运行该策略。https://play.openpolicyagent.org/p/iqK8Zt5L62

open-policy-agent

3
推荐指数
1
解决办法
1475
查看次数

OPA/Rego 对数组的每个元素执行函数

我是 OPA/Rego 的新手,我正在尝试编写一个策略来检查 Azure 网络安全组是否包含我在阵列上定义的所有规则

package sample
default compliant = false
toSet(arr) = {x | x := arr[_]}
checkProperty(rule, index, propertySingular, propertyPlural) = true
{
    object.get(input.properties.securityRules[index].properties, propertySingular, "") == object.get(rule, propertySingular, "")
    count(toSet(object.get(input.properties.securityRules[index].properties, propertyPlural, [])) - toSet(object.get(rule, propertyPlural, []))) == 0
}
existRule(rule) = true
{
    input.properties.securityRules[i].name == rule.name
    input.properties.securityRules[i].properties.provisioningState == rule.provisioningState
    input.properties.securityRules[i].properties.description == rule.description
    input.properties.securityRules[i].properties.protocol == rule.protocol
    checkProperty(rule, i, "sourcePortRange", "sourcePortRanges")
    checkProperty(rule, i, "destinationPortRange", "destinationPortRanges")
    checkProperty(rule, i, "sourceAddressPrefix", "sourceAddressPrefixes")
    checkProperty(rule, i, "destinationAddressPrefix", "destinationAddressPrefixes")
    input.properties.securityRules[i].properties.access == rule.access
    input.properties.securityRules[i].properties.priority == rule.priority …
Run Code Online (Sandbox Code Playgroud)

open-policy-agent rego

3
推荐指数
1
解决办法
2096
查看次数

OPA (Rego) 作为 Go lib:如何应用外部数据?

我按照https://www.openpolicyagent.org/docs/latest/#5-try-opa-as-a-go-library的示例进行操作。重要代码片段:

r := rego.New(
rego.Query("x = data.example.allow"),
rego.Load([]string{"./example.rego"}, nil)
...
rs, err := query.Eval(ctx, rego.EvalInput(input))
...
Run Code Online (Sandbox Code Playgroud)

如何添加外部数据 ( data.json) 以便我可以data.wantedName在 rego 策略中使用它来访问它?

我尝试通读 go 文档和示例,但找不到任何有用的信息。

谢谢!

go open-policy-agent rego

2
推荐指数
1
解决办法
2296
查看次数

如何在 Rego 中发出 HTTP GET 请求

我想向 rego 中的 url 发出 get 请求。但它引发了Invalid argument: unallowedbuilt-in function call in rego module: http.send错误 这是我的代码。

package play

default hello = false

hello {
    response := http.send({
        "method" : "GET",
        "url": "http://localhost:8181/v1/data/example"
    })
}
Run Code Online (Sandbox Code Playgroud)

我做错了什么?

open-policy-agent rego

1
推荐指数
1
解决办法
3593
查看次数

Rego规则中的参数[开放策略代理]

如何在Rego规则中使用参数?我会有这样的东西:

deny[reason] {
  input.request.kind.kind == "Route"
  not valid_route_request[label]
  reason := sprintf("missing or wrong router selector label: %v", [label])
}

valid_route_request[label] {
  requester := input.request.userInfo.username
  some i # iterate on all users
  requester == data.kubernetes.users[i].metadata.name
  label := input.request.object.metadata.labels["router-selector"]
  label == data.kubernetes.users[i].metadata.annotations[router_selector_key]
}
Run Code Online (Sandbox Code Playgroud)

wherelabel用于构建错误消息。我从 OPA 收到错误:var label is unsafe ...

总的来说,我还是不太清楚如何在Rego中传递参数。

open-policy-agent rego

1
推荐指数
1
解决办法
9935
查看次数

使用 walk 通过 rego 递归聚合 terraform 状态下的资源

我正在使用开放策略代理针对 terraform 状态的 JSON 输出编写策略。

这是状态文件的结构:

{
  "format_version": "0.1",
  "terraform_version": "0.12.28",
  "values": {
    "root_module": {
      "resources": [],
      "child_modules": [
        {
          "resources": [],
          "address": "",
          "child_modules": [
            {
              "resources": [],
              "address": "",
              "child_modules": [
                {}
              ]
            }
          ]
        }
      ]
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

我定义了这个令人讨厌的规则来实现我想要的,但这显然不是聚合这些资源的理想方式。

resources[resource_type] = all {
    some resource_type
    resource_types[resource_type]
    rm := tfstate.values.root_module

    # I think the below can be simplified with the built in "walk" function TODO: do that.
    root_resources := [name |
        name := rm.resources[_]
        name.type == resource_type …
Run Code Online (Sandbox Code Playgroud)

policy terraform open-policy-agent rego

1
推荐指数
1
解决办法
2761
查看次数