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



刚刚开始处理conftest和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

对于如何处理这个案件,欢迎提出任何意见/建议。

确保反表达式(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,因为它将搜索所有使规则中的表达式为真的变量赋值。由于变量i没有在其他任何地方赋值,因此对i的赋值无限个数满足not input.spec.template.spec.containers[i].image…例如:i = 100i = -1i = "foo"等。因为我们想要保证策略执行终止,所以OPA拒绝表达式。

关于安全的更多信息和示例在这里:https://www.openpolicyagent.org/docs/latest/faq/#safety

相关内容

  • 没有找到相关文章

最新更新