# Kubernetes - OPA Gatekeeper

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

**L'autore originale di questa pagina è** [**Guillaume**](https://www.linkedin.com/in/guillaume-chapela-ab4b9a196)

## Definizione

Open Policy Agent (OPA) Gatekeeper è uno strumento utilizzato per applicare politiche di ammissione in Kubernetes. Queste politiche sono definite utilizzando Rego, un linguaggio di policy fornito da OPA. Di seguito è riportato un esempio base di una definizione di policy utilizzando OPA Gatekeeper:
```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
```
Questa politica Rego verifica se alcune etichette sono presenti sulle risorse Kubernetes. Se le etichette richieste mancano, restituisce un messaggio di violazione. Questa politica può essere utilizzata per garantire che tutte le risorse distribuite nel cluster abbiano etichette specifiche.

## Applica Vincolo

Per utilizzare questa politica con OPA Gatekeeper, è necessario definire un **ConstraintTemplate** e un **Constraint** in Kubernetes:
```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 questo esempio YAML, definiamo un **ConstraintTemplate** per richiedere etichette. Poi, nominiamo questo vincolo `ensure-pod-has-label`, che fa riferimento al ConstraintTemplate `k8srequiredlabels` e specifica le etichette richieste.

Quando Gatekeeper è distribuito nel cluster Kubernetes, applicherà questa politica, impedendo la creazione di pod che non hanno le etichette specificate.

## Riferimenti

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



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