built-in-references/Kubernetes/allowed-proc-mount-types/template.yaml (60 lines of code) (raw):

apiVersion: templates.gatekeeper.sh/v1beta1 kind: ConstraintTemplate metadata: name: k8sazureprocmount spec: crd: spec: names: kind: K8sAzureProcMount validation: # Schema for the `parameters` field openAPIV3Schema: properties: procMount: type: string targets: - target: admission.k8s.gatekeeper.sh rego: | package k8sazureprocmount violation[{"msg": msg, "details": {}}] { c := input_containers[_] allowedProcMount := get_allowed_proc_mount(input) not input_proc_mount_type_allowed(allowedProcMount, c) msg := sprintf("ProcMount type is not allowed, container: %v. Allowed procMount types: %v", [c.name, allowedProcMount]) } input_proc_mount_type_allowed(allowedProcMount, c) { allowedProcMount == "default" lower(c.securityContext.procMount) == "default" } input_proc_mount_type_allowed(allowedProcMount, c) { allowedProcMount == "unmasked" } input_containers[c] { c := input.review.object.spec.containers[_] c.securityContext.procMount } input_containers[c] { c := input.review.object.spec.initContainers[_] c.securityContext.procMount } get_allowed_proc_mount(arg) = out { not arg.parameters out = "default" } get_allowed_proc_mount(arg) = out { not arg.parameters.procMount out = "default" } get_allowed_proc_mount(arg) = out { not valid_proc_mount(arg.parameters.procMount) out = "default" } get_allowed_proc_mount(arg) = out { out = lower(arg.parameters.procMount) } valid_proc_mount(str) { lower(str) == "default" } valid_proc_mount(str) { lower(str) == "unmasked" }