Open Policy Agent - 检查列表中是否存在元素

Open Policy Agent - check existence of elements in a list

刚开始处理 conftest and OPA,我正在尝试验证示例 kubernetes 部署清单以确保它包含列表中的特定键(即 image 所有 containers)

存在

这是一个示例输入

apiVersion: apps/v1
kind: Deployment
spec:
  template:
    spec:
      containers:
      - image: hub.com/img1:tag1
        imagePullPolicy: Always

我认为此策略应该检查所有容器的 image 是否存在:

deny[reason] {
    input.kind == "Deployment"
    some i
    not input.spec.template.spec.containers[i].image
    reason := "Container.image not found"
}

但是 conftest 抛出一个错误抱怨 not input.spec.template.spec.containers[i].image expression is unsafe

任何关于如何处理这种情况的comments/suggestions表示感谢。

确保否定表达式 (not ...) 中的变量在规则中的另一个非否定表达式中赋值。例如:

deny[reason] {
    input.kind == "Deployment"
    container := input.spec.template.spec.containers[_]
    not container.image
    reason := "Container.image not found"
}

在这个版本中,否定表达式中唯一的变量是containercontainer 变量在上一行赋值,所以表达式是安全的。

OPA 抱怨 not input.spec.template.spec.containers[i].image,因为它将搜索使规则中的表达式成为 true 的所有变量赋值。由于变量 i 未在其他任何地方分配,因此将有 无限 次分配给 i 满足 not input.spec.template.spec.containers[i].image... 例如, i = 100i = -1i = "foo" 等。由于我们要保证策略执行终止,因此 OPA 拒绝表达式。

有关安全的更多信息和示例,请点击此处:https://www.openpolicyagent.org/docs/latest/faq/#safety