0

刚开始处理conftestOPA,我正在尝试验证示例 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

任何关于如何处理这种情况的意见/建议表示赞赏。

4

1 回答 1

2

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

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

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

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

于 2021-07-24T16:29:25.940 回答