刚刚开始处理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"
}
在这个版本中,被否定表达式中唯一的变量是container
。container
变量是在前一行赋值的,所以表达式是安全的。
OPA抱怨not input.spec.template.spec.containers[i].image
,因为它将搜索所有使规则中的表达式为真的变量赋值。由于变量i
没有在其他任何地方赋值,因此对i
的赋值无限个数满足not input.spec.template.spec.containers[i].image
…例如:i = 100
、i = -1
、i = "foo"
等。因为我们想要保证策略执行终止,所以OPA拒绝表达式。
关于安全的更多信息和示例在这里:https://www.openpolicyagent.org/docs/latest/faq/#safety