policyDefinitions/Kubernetes/selinux/template.yaml (64 lines of code) (raw):
apiVersion: templates.gatekeeper.sh/v1beta1
kind: ConstraintTemplate
metadata:
name: k8sazureselinux
spec:
crd:
spec:
names:
kind: K8sAzureSELinux
validation:
# Schema for the `parameters` field
openAPIV3Schema:
properties:
allowedSELinuxOptions:
type: array
items:
type: object
properties:
level:
type: string
role:
type: string
type:
type: string
user:
type: string
targets:
- target: admission.k8s.gatekeeper.sh
rego: |
package k8spspselinux
# Disallow top level custom SELinux options
violation[{"msg": msg, "details": {}}] {
has_field(input.review.object.spec.securityContext, "seLinuxOptions")
not input_seLinuxOptions_allowed(input.review.object.spec.securityContext.seLinuxOptions)
msg := sprintf("SELinux options is not allowed, pod: %v. Allowed options: %v", [input.review.object.metadata.name, input.parameters.allowedSELinuxOptions])
}
# Disallow container level custom SELinux options
violation[{"msg": msg, "details": {}}] {
c := input_security_context[_]
has_field(c.securityContext, "seLinuxOptions")
not input_seLinuxOptions_allowed(c.securityContext.seLinuxOptions)
msg := sprintf("SELinux options is not allowed, pod: %v, container %v. Allowed options: %v", [input.review.object.metadata.name, c.name, input.parameters.allowedSELinuxOptions])
}
input_seLinuxOptions_allowed(options) {
params := input.parameters.allowedSELinuxOptions[_]
field_allowed("level", options, params)
field_allowed("role", options, params)
field_allowed("type", options, params)
field_allowed("user", options, params)
}
field_allowed(field, options, params) {
params[field] == options[field]
}
field_allowed(field, options, params) {
not has_field(options, field)
}
input_security_context[c] {
c := input.review.object.spec.containers[_]
has_field(c.securityContext, "seLinuxOptions")
}
input_security_context[c] {
c := input.review.object.spec.initContainers[_]
has_field(c.securityContext, "seLinuxOptions")
}
# has_field returns whether an object has a field
has_field(object, field) = true {
object[field]
}