-
Notifications
You must be signed in to change notification settings - Fork 316
/
template.yaml
71 lines (65 loc) 路 2.71 KB
/
template.yaml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
apiVersion: templates.gatekeeper.sh/v1
kind: ConstraintTemplate
metadata:
name: k8shttpsonly
annotations:
metadata.gatekeeper.sh/title: "HTTPS Only"
metadata.gatekeeper.sh/version: 1.0.2
description: >-
Requires Ingress resources to be HTTPS only. Ingress resources must
include the `kubernetes.io/ingress.allow-http` annotation, set to `false`.
By default a valid TLS {} configuration is required, this can be made
optional by setting the `tlsOptional` parameter to `true`.
https://kubernetes.io/docs/concepts/services-networking/ingress/#tls
spec:
crd:
spec:
names:
kind: K8sHttpsOnly
validation:
# Schema for the `parameters` field
openAPIV3Schema:
type: object
description: >-
Requires Ingress resources to be HTTPS only. Ingress resources must
include the `kubernetes.io/ingress.allow-http` annotation, set to
`false`. By default a valid TLS {} configuration is required, this
can be made optional by setting the `tlsOptional` parameter to
`true`.
properties:
tlsOptional:
type: boolean
description: "When set to `true` the TLS {} is optional, defaults
to false."
targets:
- target: admission.k8s.gatekeeper.sh
rego: |
package k8shttpsonly
violation[{"msg": msg}] {
input.review.object.kind == "Ingress"
regex.match("^(extensions|networking.k8s.io)/", input.review.object.apiVersion)
ingress := input.review.object
not https_complete(ingress)
not tls_is_optional
msg := sprintf("Ingress should be https. tls configuration and allow-http=false annotation are required for %v", [ingress.metadata.name])
}
violation[{"msg": msg}] {
input.review.object.kind == "Ingress"
regex.match("^(extensions|networking.k8s.io)/", input.review.object.apiVersion)
ingress := input.review.object
not annotation_complete(ingress)
tls_is_optional
msg := sprintf("Ingress should be https. The allow-http=false annotation is required for %v", [ingress.metadata.name])
}
https_complete(ingress) = true {
ingress.spec["tls"]
count(ingress.spec.tls) > 0
ingress.metadata.annotations["kubernetes.io/ingress.allow-http"] == "false"
}
annotation_complete(ingress) = true {
ingress.metadata.annotations["kubernetes.io/ingress.allow-http"] == "false"
}
tls_is_optional {
parameters := object.get(input, "parameters", {})
object.get(parameters, "tlsOptional", false) == true
}