Kubernetes - OPA Gatekeeper

Reading time: 3 minutes

tip

Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE) Apprenez et pratiquez le hacking Azure : HackTricks Training Azure Red Team Expert (AzRTE)

Soutenir HackTricks

L'auteur original de cette page est Guillaume

Définition

Open Policy Agent (OPA) Gatekeeper est un outil utilisé pour appliquer des politiques d'admission dans Kubernetes. Ces politiques sont définies à l'aide de Rego, un langage de politique fourni par OPA. Ci-dessous un exemple de base d'une définition de politique utilisant 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

Cette politique Rego vérifie si certaines étiquettes sont présentes sur les ressources Kubernetes. Si les étiquettes requises sont manquantes, elle renvoie un message de violation. Cette politique peut être utilisée pour s'assurer que toutes les ressources déployées dans le cluster ont des étiquettes spécifiques.

Appliquer la contrainte

Pour utiliser cette politique avec OPA Gatekeeper, vous devez définir un ConstraintTemplate et une Constraint dans 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"

Dans cet exemple YAML, nous définissons un ConstraintTemplate pour exiger des étiquettes. Ensuite, nous nommons cette contrainte ensure-pod-has-label, qui fait référence au ConstraintTemplate k8srequiredlabels et spécifie les étiquettes requises.

Lorsque Gatekeeper est déployé dans le cluster Kubernetes, il appliquera cette politique, empêchant la création de pods qui n'ont pas les étiquettes spécifiées.

Références

tip

Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE) Apprenez et pratiquez le hacking Azure : HackTricks Training Azure Red Team Expert (AzRTE)

Soutenir HackTricks