Open Policy Agent

De wiki.nexiat.fr
Aller à la navigation Aller à la recherche
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