built-in-references/Kubernetes/allowed-seccomp-profiles/template.yaml (51 lines of code) (raw):
apiVersion: templates.gatekeeper.sh/v1beta1
kind: ConstraintTemplate
metadata:
name: k8sazureallowedseccomp
spec:
crd:
spec:
names:
kind: K8sAzureAllowedSeccomp
validation:
# Schema for the `parameters` field
openAPIV3Schema:
properties:
allowedProfiles:
type: array
items:
type: string
targets:
- target: admission.k8s.gatekeeper.sh
rego: |
package k8sazureallowedseccomp
violation[{"msg": msg, "details": {}}] {
metadata := input.review.object.metadata
not input_wildcard_allowed(metadata)
container := input_containers[_]
not input_container_allowed(metadata, container)
msg := sprintf("Seccomp profile is not allowed, pod: %v, container: %v, Allowed profiles: %v", [metadata.name, container.name, input.parameters.allowedProfiles])
}
input_wildcard_allowed(metadata) {
input.parameters.allowedProfiles[_] == "*"
}
input_container_allowed(metadata, container) {
not get_container_profile(metadata, container)
metadata.annotations["seccomp.security.alpha.kubernetes.io/pod"] == input.parameters.allowedProfiles[_]
}
input_container_allowed(metadata, container) {
profile := get_container_profile(metadata, container)
profile == input.parameters.allowedProfiles[_]
}
get_container_profile(metadata, container) = profile {
value := metadata.annotations[key]
startswith(key, "container.seccomp.security.alpha.kubernetes.io/")
[prefix, name] := split(key, "/")
name == container.name
profile = value
}
input_containers[c] {
c := input.review.object.spec.containers[_]
}
input_containers[c] {
c := input.review.object.spec.initContainers[_]
}