built-in-references/Kubernetes/service-allowed-ports/template.yaml (36 lines of code) (raw):
apiVersion: templates.gatekeeper.sh/v1beta1
kind: ConstraintTemplate
metadata:
name: k8sazureserviceallowedports
spec:
crd:
spec:
names:
kind: K8sAzureServiceAllowedPorts
listKind: K8sAzureServiceAllowedPortsList
plural: k8sazureserviceallowedports
singular: k8sazureserviceallowedports
validation:
# Schema for the `parameters` field
openAPIV3Schema:
properties:
allowedPorts:
type: array
items:
type: string
targets:
- target: admission.k8s.gatekeeper.sh
rego: |
package k8sazureserviceallowedports
violation[{"msg": msg}] {
service := input.review.object
not service_is_kubernetes(service)
port = service.spec.ports[_]
format_int(port.port, 10, portstr)
satisfied := [good | allowedPort := input.parameters.allowedPorts[_]; good := (portstr == allowedPort)]
not any(satisfied)
msg := sprintf("Port %v for service %v has not been allowed.", [portstr, service.metadata.name])
}
service_is_kubernetes(service) = true {
service.metadata.namespace == "default"
service.metadata.name == "kubernetes"
}