# Kubernetes - OPA Gatekeeper

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

**このページの元の著者は** [**Guillaume**](https://www.linkedin.com/in/guillaume-chapela-ab4b9a196)

## 定義

Open Policy Agent (OPA) Gatekeeperは、Kubernetesにおける入場ポリシーを強制するためのツールです。これらのポリシーは、OPAが提供するポリシー言語Regoを使用して定義されます。以下は、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
```
このRegoポリシーは、Kubernetesリソースに特定のラベルが存在するかどうかをチェックします。必要なラベルが欠けている場合、違反メッセージを返します。このポリシーは、クラスターにデプロイされたすべてのリソースが特定のラベルを持っていることを保証するために使用できます。

## 制約の適用

このポリシーをOPA Gatekeeperで使用するには、Kubernetesで**ConstraintTemplate**と**Constraint**を定義します：
```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"
```
このYAMLの例では、ラベルを要求する**ConstraintTemplate**を定義します。次に、この制約に`ensure-pod-has-label`という名前を付け、`k8srequiredlabels` ConstraintTemplateを参照し、必要なラベルを指定します。

GatekeeperがKubernetesクラスターにデプロイされると、このポリシーが強制され、指定されたラベルを持たないポッドの作成が防止されます。

## References

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



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