Kubernetes OPA Gatekeeper是一个基于策略的Kubernetes验证Webhook,可以阻止不符合策略的Kubernetes对象的创建、修改或删除。然而,有时OPA Gatekeeper无法阻止DELETE操作。
原因是DELETE操作的验证不像创建或修改那样执行在admission control hook中。取而代之的是,它是在Kubernetes API Server的访问控制层(authorization layer)中完成的。
为了解决这个问题,我们需要在Kubernetes API Server中配置一个自定义的Webhook来添加验证DELETE请求所需的策略。以下是一个示例:
首先,创建一个名为“gatekeeper-validating-webhook.yaml”的文件,该文件包含对Gatekeeper验证Webhook的引用:
apiVersion: admissionregistration.k8s.io/v1
kind: MutatingWebhookConfiguration
metadata:
name: gatekeeper-validating-webhook
webhooks:
- name: validating.gatekeeper.sh
clientConfig:
service:
namespace: kube-system
name: gatekeeper-webhook
path: "/v1/validate"
caBundle: Q2xpZW50LVRlc3QtZW5jb2RpbmcK # 加入从Gatekeeper证书生成器中获取证书链后的值
rules:
- operations: [ "DELETE" ]
apiGroups: [""]
apiVersions: [""]
resources: ["*"]
namespaceSelector:
matchExpressions:
- key: exclude-from-gatekeeper-validating-webhook
operator: NotExists
然后,将Webhook配置部署到Kubernetes集群中:
kubectl apply -f gatekeeper-validating-webhook.yaml
最后,创建一个策略文件“deny-deletes.rego”,该文件会拒绝不符合策略的DELETE请求:
package k8snamespace
deny[{"msg": msg}] {
input.request.kind.kind == "Namespace"
input.request.operation == "DELETE"
has_annotation := input.request.object.metadata.annotations["deny-de