# Kubernetes - OPA Gatekeeper

{{#include ../../../banners/hacktricks-training.md}}

**Die oorspronklike skrywer van hierdie bladsy is** [**Guillaume**](https://www.linkedin.com/in/guillaume-chapela-ab4b9a196)

## Definisie

Open Policy Agent (OPA) Gatekeeper is 'n hulpmiddel wat gebruik word om toelatingsbeleide in Kubernetes af te dwing. Hierdie beleide word gedefinieer met behulp van Rego, 'n beleids taal wat deur OPA verskaf word. Hieronder is 'n basiese voorbeeld van 'n beleidsdefinisie wat OPA Gatekeeper gebruik:
```rego
package k8srequiredlabels

violation[{"msg": msg}] {
provided := {label | input.review.object.metadata.labels[label]}
required := {label | label := input.parameters.labels[label]}
missing := required - provided
count(missing) > 0
msg := sprintf("Required labels missing: %v", [missing])
}

default allow = false
```
Hierdie Rego-beleid kontroleer of sekere etikette op Kubernetes-hulpbronne teenwoordig is. As die vereiste etikette ontbreek, keer dit 'n oortredingsboodskap terug. Hierdie beleid kan gebruik word om te verseker dat alle hulpbronne wat in die kluster ontplooi word, spesifieke etikette het.

## Pas Beperking Toe

Om hierdie beleid met OPA Gatekeeper te gebruik, sal jy 'n **ConstraintTemplate** en 'n **Constraint** in Kubernetes definieer:
```yaml
apiVersion: templates.gatekeeper.sh/v1beta1
kind: ConstraintTemplate
metadata:
name: k8srequiredlabels
spec:
crd:
spec:
names:
kind: K8sRequiredLabels
targets:
- target: admission.k8s.gatekeeper.sh
rego: |
package k8srequiredlabels
violation[{"msg": msg}] {
provided := {label | input.review.object.metadata.labels[label]}
required := {label | label := input.parameters.labels[label]}
missing := required - provided
count(missing) > 0
msg := sprintf("Required labels missing: %v", [missing])
}

default allow = false
```

```yaml
apiVersion: constraints.gatekeeper.sh/v1beta1
kind: K8sRequiredLabels
metadata:
name: ensure-pod-has-label
spec:
match:
kinds:
- apiGroups: [""]
kinds: ["Pod"]
parameters:
labels:
requiredLabel1: "true"
requiredLabel2: "true"
```
In hierdie YAML voorbeeld, definieer ons 'n **ConstraintTemplate** om etikette te vereis. Dan noem ons hierdie beperking `ensure-pod-has-label`, wat die `k8srequiredlabels` ConstraintTemplate verwys en die vereiste etikette spesifiseer.

Wanneer Gatekeeper in die Kubernetes-kluster ontplooi word, sal dit hierdie beleid afdwing, wat die skepping van pods wat nie die gespesifiseerde etikette het nie, voorkom.

## References

* [https://github.com/open-policy-agent/gatekeeper](https://github.com/open-policy-agent/gatekeeper)



{{#include ../../../banners/hacktricks-training.md}}
