Open Policy Agent
| Fiche express | |
|---|---|
| Type | Moteur générique de policy-as-code |
| Langage | Rego (DSL déclaratif inspiré de Datalog) |
| Origine | Styra ; projet CNCF (graduated, à vérifier selon la période) |
| Usages types | Admission controller Kubernetes (Gatekeeper), validation de plans Terraform (Conftest), autorisation d'API |
| Alternative propriétaire | Sentinel (HashiCorp) |
| Voir aussi | Terraform — Concepts fondamentaux · Réseau Kubernetes — Modèle et primitives · InSpec |
Open Policy Agent (OPA) est un moteur de policy-as-code générique, découplé de la pile technique qu'il contrôle : il évalue des règles sur des entrées structurées (JSON) quelconques — manifeste Kubernetes, plan Terraform, requête d'API, fichier de configuration — sans rien connaître nativement de leur origine. Cette généricité le distingue d'outils de test de conformité orientés machine comme InSpec, et d'alternatives propriétaires liées à un seul écosystème comme Sentinel (HashiCorp). OPA est un projet de la CNCF, largement adopté comme standard ouvert de policy-as-code.
Rego, le langage de politique
Rego est le langage déclaratif d'OPA, inspiré de Datalog : on n'y décrit pas une suite d'instructions, mais des règles logiques (faits et conditions) qui déterminent si une entrée est conforme ou non.
package kubernetes.admission
deny[msg] {
input.request.kind.kind == "Pod"
container := input.request.object.spec.containers[_]
not container.resources.limits
msg := sprintf(
"le conteneur %v doit définir des limites de ressources (cpu/memory)",
[container.name],
)
}
deny[msg] {
input.request.kind.kind == "Pod"
container := input.request.object.spec.containers[_]
not startswith(container.image, "registry.interne.example.com/")
msg := sprintf(
"l'image %v doit provenir du registre interne autorisé",
[container.image],
)
}
Chaque règle deny qui « produit » un message signale une violation de politique ;
l'absence de message signifie conformité.
Architecture : un moteur découplé de son contexte d'usage
OPA lui-même ignore ce qu'est un Pod Kubernetes ou une ressource Terraform : il reçoit un document JSON en entrée (input), applique les règles Rego chargées, et renvoie une décision (généralement booléenne, accompagnée de messages). Il peut tourner en bibliothèque, en sidecar, ou en serveur HTTP interrogé par l'appelant via une API REST de décision. Ce découplage permet de réutiliser le même moteur — et souvent les mêmes règles — pour des contextes très différents : admission Kubernetes, passerelles API, pipelines CI/CD, autorisation applicative.
Cas d'usage : Gatekeeper (admission controller Kubernetes)
Gatekeeper intègre OPA comme webhook d'admission Kubernetes : il expose des CRD
(ConstraintTemplate pour définir une politique paramétrable, Constraint
pour l'instancier) qui permettent de refuser — ou de muter — des objets non conformes au moment
de leur création (labels obligatoires, images issues d'un registre autorisé, limites de
ressources imposées, interdiction du mode privilégié...). Voir [[Réseau Kubernetes — Modèle et
primitives]] pour le contexte plus large de l'admission control dans Kubernetes.
Cas d'usage : Conftest (validation de plans Terraform / IaC)
Conftest est un outil en ligne de commande qui applique des règles Rego à des
fichiers structurés — notamment la sortie JSON de terraform plan, mais aussi des
manifestes Kubernetes, des Dockerfiles, etc. — indépendamment de tout runtime. Utilisé en CI, il
permet de bloquer un plan Terraform non conforme avant
le terraform apply (ex. interdire les buckets de stockage exposés publiquement, imposer
un tag de coût sur chaque ressource). Voir Frontière IaC — Terraform, Ansible, GitOps pour la
place de ce type de contrôle dans une chaîne IaC/GitOps.
Positionnement face à Sentinel (HashiCorp)
| Open Policy Agent | Sentinel | |
|---|---|---|
| Éditeur/gouvernance | CNCF, open source | HashiCorp, propriétaire |
| Langage | Rego | Sentinel (langage propre à HashiCorp) |
| Portée | Générique (K8s, Terraform, API, CI...) | Écosystème HashiCorp (Terraform Cloud/Enterprise, Vault, Consul, Nomad) |
| Disponibilité | Libre, utilisable partout | Réservé aux offres payantes HashiCorp (Cloud/Enterprise) |
Sentinel offre une intégration plus « clé en main » dans l'écosystème HashiCorp mais reste propriétaire et cantonné à ce dernier ; OPA, plus générique et ouvert, s'impose comme le choix par défaut dès qu'on veut mutualiser une même politique entre plusieurs outils (Kubernetes, Terraform, API internes) plutôt que de la dupliquer par produit.
Voir aussi
- Terraform — Concepts fondamentaux · Frontière IaC — Terraform, Ansible, GitOps
- Réseau Kubernetes — Modèle et primitives
- InSpec — audit de conformité de machines, portée et modèle différents (constat après coup vs contrôle au moment de l'admission/apply)
- Glossaire cloud-native