DevSecOps

OPA Open Policy Agent : définition, Rego et cas d'usage 2026

Qu'est-ce qu'OPA (Open Policy Agent) ? Définition, langage Rego, Gatekeeper, cas d'usage Kubernetes, Terraform, CI/CD. Policy-as-code CNCF Graduated 2026.

Naim Aouaichia
13 min de lecture
  • OPA
  • Open Policy Agent
  • Rego
  • Policy as Code
  • Kubernetes
  • Admission control
  • CNCF
  • DevSecOps
  • Compliance
  • Gatekeeper
  • Conftest
  • Terraform
  • Secure CI/CD
  • Platform Engineering

OPA (Open Policy Agent) est un moteur de décision de politiques open-source, polyvalent, gradué CNCF depuis février 2021 et devenu le standard de fait du policy-as-code dans l'écosystème cloud-native en 2026. Créé par Styra en 2016, il permet de déclarer des règles d'autorisation, de conformité et de validation dans un langage dédié nommé Rego, puis de les évaluer sur des données d'entrée JSON indépendamment du système qui les applique — Kubernetes, Terraform, API Gateway, microservices, CI/CD. Sa force principale est le découplage entre la décision de politique et son application, permettant de réutiliser les mêmes règles sur tous les systèmes d'une organisation. Cet article définit précisément OPA, explique son architecture, introduit le langage Rego, détaille OPA Gatekeeper pour Kubernetes, compare les alternatives (Kyverno, Cedar, ValidatingAdmissionPolicy), et donne les bonnes pratiques de déploiement en production.

Qu'est-ce qu'OPA exactement

OPA est un moteur d'évaluation de politiques (policy engine), pas un outil de sécurité spécifique. Il répond à une question simple mais universelle dans les architectures modernes : étant donné un input JSON décrivant une situation, cette situation est-elle autorisée selon les règles que j'ai déclarées ?

Architecture conceptuelle

   +----------------------+
   |   Application ou     |
   |   Infrastructure     |
   |   (K8s, Terraform,   |
   |    microservice...)  |
   +----------+-----------+
              | (1) input JSON
              v
   +----------+-----------+
   |        OPA           |
   |   Policy Engine      |
   |   (évaluation Rego)  |
   +----------+-----------+
              ^ policies Rego
              v
   +----------+-----------+
   |   Decision JSON      |
   |   (2) allow/deny,    |
   |   reasons, context   |
   +----------------------+

L'application fournit une situation (la requête HTTP à autoriser, le manifest Kubernetes à admettre, le plan Terraform à valider). OPA évalue cette situation contre les politiques Rego chargées en mémoire et retourne une décision structurée. L'application décide ensuite quoi faire de la décision : bloquer, laisser passer, loguer, muter.

Propriétés clés

PropriétéDétail
Open-sourceLicence Apache 2.0, code sur github.com/open-policy-agent/opa
Statut CNCFGraduated (février 2021), aux côtés de Linkerd
Langage dédiéRego (déclaratif, inspiré de Datalog)
Format I/OJSON entrée, JSON sortie
DéploiementBinaire Go autonome, bibliothèque embedded, sidecar, WebAssembly
PerformanceMoins de 1 ms par requête typique, cache de compilation
DistributionBundles Rego signés, discovery centralisée possible

Comment fonctionne OPA

OPA s'appuie sur trois composants fondamentaux : le moteur d'évaluation, les politiques Rego, et les données contextuelles.

Moteur d'évaluation

Compile les politiques Rego en une représentation interne optimisée. Chaque requête d'évaluation est traitée en quelques microsecondes sur une machine moderne, permettant des milliers de décisions par seconde sur un nœud standard.

Politiques Rego

Les règles métier sont écrites en Rego et regroupées en packages. Elles peuvent être chargées depuis des fichiers locaux, depuis un bundle HTTP signé, ou depuis un serveur de gestion centralisée (Styra DAS ou équivalent).

Données contextuelles

En plus de l'input de la requête, OPA peut charger des données statiques (JSON) : liste des utilisateurs autorisés, matrice de rôles, catalogue de registries approuvés. Ces données sont mises à jour en arrière-plan via le Bundle API.

Modes de déploiement

ModeUsage typiqueLatence
Binaire autonomeServeur HTTP, évaluation via API REST1-5 ms (réseau)
Bibliothèque Go embeddedMicroservice Go appelant OPA in-process0,1-1 ms
Sidecar KubernetesUn OPA par pod, API locale0,5-2 ms
WebAssembly (OPA-Wasm)Browser, Envoy, edgeVariable
ServerlessLambda AWS, Cloud FunctionsCold start 100-300 ms

Le langage Rego en pratique

Rego est un langage déclaratif, inspiré de Datalog et de la programmation logique. Comprendre ses mécanismes fondamentaux est indispensable pour écrire des politiques correctes.

Exemple de politique Rego : autoriser l'accès à une ressource

package auth
 
import future.keywords.if
import future.keywords.in
 
# Regle par defaut : refuser
default allow := false
 
# Regle 1 : les administrateurs peuvent tout faire
allow if {
    input.user.role == "admin"
}
 
# Regle 2 : un utilisateur peut lire ses propres ressources
allow if {
    input.method == "GET"
    input.user.id == input.resource.owner_id
}
 
# Regle 3 : les utilisateurs du groupe finance peuvent lire les rapports
allow if {
    input.method == "GET"
    input.resource.type == "report"
    "finance" in input.user.groups
}

Exemple d'input JSON évalué

{
  "user": {
    "id": "alice",
    "role": "user",
    "groups": ["finance", "hr"]
  },
  "method": "GET",
  "resource": {
    "type": "report",
    "id": "q1-2026-revenue",
    "owner_id": "bob"
  }
}

Évaluation : la règle 1 échoue (pas admin), la règle 2 échoue (owner_id différent), la règle 3 passe (méthode GET, type report, groupe finance présent). OPA retourne allow: true avec les règles qui ont contribué à la décision.

Mécanismes fondamentaux à maîtriser

  • Règles : paires key-value où la valeur est calculée à partir d'expressions booléennes.
  • Unification : les variables peuvent être liées à des valeurs par correspondance, similaire à Prolog.
  • Itération implicite : some i ou variables non-instanciées parcourent automatiquement les collections.
  • Helpers : règles utilitaires pour factoriser la logique commune.
  • Fonctions intégrées : count(), contains(), regex, JSON path, dates.
  • Policies partielles : retourner un résultat partiel indiquant les contraintes restantes, utile pour des applications avancées.

OPA Gatekeeper — le Kubernetes admission controller

OPA Gatekeeper est l'intégration spécialisée d'OPA dans Kubernetes, déployée comme admission controller. Il intercepte les manifests soumis à l'API Kubernetes et les valide (ou les mute) avant qu'ils ne soient persistés dans etcd.

Architecture Gatekeeper

  • ConstraintTemplate : CRD qui définit une politique paramétrable en Rego. Exemple : « les pods doivent avoir des labels précis ».
  • Constraint : CRD qui instancie un ConstraintTemplate avec des paramètres concrets. Exemple : « tous les pods doivent avoir le label team et le label environment ».
  • Config : CRD qui contrôle les namespaces exclus, les ressources synchronisées dans le cache OPA, les options globales.

Exemple de ConstraintTemplate

apiVersion: templates.gatekeeper.sh/v1
kind: ConstraintTemplate
metadata:
  name: k8srequiredlabels
spec:
  crd:
    spec:
      names:
        kind: K8sRequiredLabels
      validation:
        openAPIV3Schema:
          type: object
          properties:
            labels:
              type: array
              items:
                type: string
  targets:
    - target: admission.k8s.gatekeeper.sh
      rego: |
        package k8srequiredlabels
 
        violation[{"msg": msg}] {
          required := input.parameters.labels
          provided := input.review.object.metadata.labels
          missing := required[_]
          not provided[missing]
          msg := sprintf("Missing required label: %v", [missing])
        }

Exemple de Constraint qui instancie la politique

apiVersion: constraints.gatekeeper.sh/v1beta1
kind: K8sRequiredLabels
metadata:
  name: pods-must-have-team-and-env
spec:
  enforcementAction: deny
  match:
    kinds:
      - apiGroups: [""]
        kinds: ["Pod"]
    excludedNamespaces:
      - kube-system
      - gatekeeper-system
  parameters:
    labels:
      - team
      - environment

gatekeeper-library : politiques prêtes à l'emploi

Le projet open-policy-agent/gatekeeper-library sur GitHub propose plus de 80 ConstraintTemplates prêts à l'emploi couvrant :

  • Baseline Kubernetes (non-root, read-only root FS, host network interdit, capabilities limitées).
  • CIS Kubernetes Benchmark compliance.
  • Image registry whitelist, tag latest interdit.
  • Labels obligatoires, annotations obligatoires.
  • Ressources requests/limits obligatoires.
  • NetworkPolicy obligatoire par namespace.
  • PodDisruptionBudget obligatoire pour les Deployments.
  • Conformité sectorielle (PCI-DSS, HIPAA).

Cas d'usage au-delà de Kubernetes

OPA étant généraliste, il s'intègre dans de nombreux systèmes au-delà de Kubernetes.

Validation Terraform via Conftest

Conftest est un outil CLI qui évalue des politiques Rego sur des fichiers de configuration (Terraform, YAML, JSON, Dockerfile, Kubernetes manifests).

# Exemple : valider un plan Terraform contre des politiques Rego
terraform plan -out=plan.tfplan
terraform show -json plan.tfplan > plan.json
conftest test plan.json --policy terraform-policies/

Usage typique : bloquer tout bucket S3 sans chiffrement, toute instance EC2 publique, toute ressource sans tags obligatoires, toute configuration IAM trop permissive.

Autorisation applicative dans les microservices

Pattern documenté par Netflix et Intuit : chaque microservice interroge OPA (REST API locale ou bibliothèque Go embedded) avant d'exécuter une action.

// Exemple Go embedded — demande d'autorisation à OPA
import "github.com/open-policy-agent/opa/rego"
 
func AuthorizeRequest(ctx context.Context, user User, action, resource string) (bool, error) {
    input := map[string]interface{}{
        "user":     user,
        "action":   action,
        "resource": resource,
    }
    rs, err := authQuery.Eval(ctx, rego.EvalInput(input))
    if err != nil {
        return false, err
    }
    return rs.Allowed(), nil
}

API Gateway Envoy et service mesh Istio

Envoy et Istio supportent l'intégration OPA en mode ext_authz : toute requête HTTP entrante est soumise à OPA pour autorisation avant d'atteindre le service backend. Documentation officielle OPA couvre les patterns Envoy et Istio.

CI/CD pipelines

Intégration GitHub Actions, GitLab CI, Jenkins pour valider des politiques organisationnelles : qui peut pusher sur quelle branche, qui peut merger, quels artefacts peuvent être publiés, quelles dépendances sont autorisées.

OPA vs Kyverno vs Cedar vs ValidatingAdmissionPolicy

Quatre moteurs de policy-as-code coexistent en 2026 dans l'écosystème cloud-native. Choisir est stratégique.

CritèreOPAKyvernoCedar (AWS)ValidatingAdmissionPolicy
StatutCNCF GraduatedCNCF IncubatingAWS open-sourceKubernetes natif 1.30+
LangageRegoYAML native K8sCedar (syntax custom)CEL
UsageMulti-systèmeKubernetes focusAWS IAM principalementKubernetes only
Courbe d'apprentissageÉlevéeFaibleMoyenneFaible
FlexibilitéTrès élevéeÉlevée sur K8sMoyenneLimitée
PerformanceExcellenteExcellenteExcellenteExcellente (natif)
ÉcosystèmeÉtendu (Styra, gatekeeper-library)Kyverno policiesAWS-centricStandard Kubernetes

Recommandation par cas d'usage

  • Kubernetes uniquement, équipe junior ou peu de temps pour apprendre Rego → Kyverno.
  • Kubernetes + Terraform + microservices + API Gateway avec cohérence de règles → OPA.
  • AWS-heavy avec IAM fin-granulaire et moins de Kubernetes → Cedar.
  • Politiques Kubernetes simples sans dépendance externe → ValidatingAdmissionPolicy natif 1.30+.
  • Grande entreprise multi-cloud avec gouvernance centralisée → OPA + Styra DAS commercial.

Intégration dans un pipeline CI/CD

Un pipeline DevSecOps mature exploite OPA à plusieurs niveaux.

name: DevSecOps with OPA
on:
  pull_request:
    branches: [main]
 
jobs:
  opa-validations:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
 
      - name: Setup OPA CLI
        uses: open-policy-agent/setup-opa@v2
        with:
          version: latest
 
      - name: Validate Kubernetes manifests
        run: |
          opa eval --data policies/k8s/ --input manifests/deployment.yaml \
            "data.kubernetes.admission.deny"
 
      - name: Validate Terraform plan
        run: |
          terraform plan -out=tfplan
          terraform show -json tfplan > tfplan.json
          opa eval --data policies/terraform/ --input tfplan.json \
            "data.terraform.analysis.deny"
 
      - name: Validate Dockerfile with Conftest
        run: |
          conftest test Dockerfile --policy policies/docker/
 
      - name: Validate GitHub Actions workflow
        run: |
          opa eval --data policies/ci/ --input .github/workflows/main.yaml \
            "data.ci.security.deny"

Écosystème Styra et outils connexes

Styra est l'entreprise créatrice d'OPA. Elle propose autour du projet open-source plusieurs produits commerciaux et outils.

OutilTypeRôle
OPAOpen-sourceMoteur de décision
RegoOpen-sourceLangage
Styra DASCommercialGestion centralisée politiques, UI, audit
Styra LoadCommercialOPA haute performance pour microservices
Styra AcademyGratuitCours en ligne Rego et OPA
ConftestOpen-source (OPA adjacent)CLI pour tester des configs avec Rego
GatekeeperOpen-sourceKubernetes admission controller basé sur OPA
OPALOpen-source (Permit.io)Distribution temps réel des politiques
gatekeeper-libraryOpen-sourceCatalogue de ConstraintTemplates
RegulaOpen-source (Fugue)IaC security via OPA

Concurrents Rego (même esprit, autre langage)

  • Cerbos : moteur de policy-as-code focus applicatif, YAML-driven.
  • Permit.io : plateforme policy-as-service avec UI non-technique.
  • SpiceDB (Zanzibar clone) : autorisation fine-grained, inspiré Google Zanzibar.

Pièges courants

Écrire des politiques monolithiques dans un seul fichier. Rego supporte le packaging. Organiser par domaine : package auth.api, package kubernetes.admission, package terraform.aws. Faciliter les tests unitaires et la réutilisation.

Ignorer les tests unitaires Rego. Rego dispose d'un framework de test natif (opa test) souvent négligé. Couvrir chaque règle avec des cas positifs et négatifs, particulièrement les chemins d'autorisation critiques. Objectif : 80 % de couverture sur les règles de décision.

Confondre else et règles multiples. Rego n'a pas d'else impératif. Plusieurs règles avec le même nom sont ou-ées (logique OR). Cette subtilité cause des bugs silencieux en rédaction.

Ne pas versionner les politiques. Les politiques Rego sont du code. Elles doivent vivre dans un Git, passer par PR, être code-reviewées, signer les bundles OPA en production (intégrité des politiques chargées).

Charger des politiques trop gourmandes. Une itération quadratique sur un tableau de 10 000 éléments prend 100 ms. À l'échelle de 1 000 requêtes/s, OPA sature. Profiler avec opa eval --explain full pour identifier les goulots.

Mélanger Rego v0 et Rego v1. Rego v1 (par défaut depuis OPA 1.0 en janvier 2025) impose if et in pour les règles. Les politiques v0 historiques restent lisibles avec import rego.v1 mais les équipes doivent migrer progressivement.

Ignorer le cache et les patterns partiels. Pour les décisions haute fréquence (milliers par seconde), utiliser l'évaluation partielle pour pré-compiler les décisions en SQL ou règles plus rapides.

Points clés à retenir

  • OPA = moteur généraliste de décision de politiques, CNCF Graduated (février 2021), langage Rego, standard de fait du policy-as-code cloud-native en 2026.
  • Découplage décision / application : les mêmes politiques Rego servent Kubernetes, Terraform, microservices, API Gateway, CI/CD.
  • Rego : déclaratif, inspiré Datalog, courbe d'apprentissage moyenne à élevée (20-40 heures pour maîtrise opérationnelle).
  • OPA Gatekeeper : admission controller Kubernetes basé sur OPA, remplace les PSP dépréciées, bibliothèque gatekeeper-library avec 80+ templates prêts.
  • Alternatives : Kyverno (plus simple, K8s-only), Cedar (AWS IAM), ValidatingAdmissionPolicy (K8s natif 1.30+). Kyverno prend des parts sur le pur use case Kubernetes.
  • Cas d'usage multi-systèmes : validation Terraform via Conftest, autorisation microservices (Netflix, Intuit), API Gateway Envoy/Istio, CI/CD policies.
  • Styra : entreprise créatrice, propose Styra DAS (gestion centralisée commerciale) et Styra Academy (formation gratuite).
  • Bonnes pratiques : packaging clair, tests unitaires Rego, versionning Git, signature bundles, monitoring performance, migration progressive v0 → v1.

Pour aller plus loin

Questions fréquentes

  • Qu'est-ce qu'OPA en une phrase ?
    OPA (Open Policy Agent) est un moteur de décision de politiques open-source, généraliste et polyvalent, qui permet de déclarer des règles d'autorisation, de conformité et de validation dans un langage dédié appelé Rego, puis de les évaluer sur des données d'entrée JSON indépendamment du système qui les applique (Kubernetes, Terraform, API Gateway, microservice, CI/CD). Créé par Styra en 2016, accepté au CNCF en 2018 et gradué en février 2021, OPA est devenu le standard de fait du policy-as-code dans l'écosystème cloud-native. Il est utilisé en production par Netflix, Pinterest, Capital One, Chef, Intuit, Atlassian et des milliers d'autres organisations. Sa force tient à trois propriétés : découplage complet entre la décision de politique et son application, polyvalence (mêmes règles réutilisables sur tous les systèmes), performance élevée grâce à un moteur d'évaluation optimisé (moins de 1 ms par requête typique).
  • Quelle différence entre OPA et Kyverno en 2026 ?
    Les deux sont des projets CNCF de policy-as-code pour Kubernetes. OPA (gradué 2021) est généraliste : il s'utilise pour Kubernetes via Gatekeeper, mais aussi Terraform via Conftest, API Gateway, microservices d'autorisation, service mesh. Son langage Rego est puissant mais a une courbe d'apprentissage significative (logique déclarative inspirée de Datalog). Kyverno (incubating 2022, en progression vers gradué) est Kubernetes-native : les politiques s'écrivent en YAML Kubernetes standard, pas de nouveau langage à apprendre. Kyverno dépasse OPA Gatekeeper sur la facilité d'adoption pour les équipes DevOps qui ne veulent pas apprendre Rego, mais OPA dépasse Kyverno sur la flexibilité multi-système. Critère de choix 2026 : Kubernetes only + équipe junior sur policies → Kyverno. Multi-système + équipe prête à investir dans Rego → OPA. CNCF Survey 2024 montre une adoption relativement équilibrée entre les deux, avec une légère avance de Kyverno sur le pur use case Kubernetes.
  • Comment OPA remplace les Pod Security Policies Kubernetes ?
    Les Pod Security Policies (PSP) ont été dépréciées dans Kubernetes 1.21 (avril 2021) et supprimées dans 1.25 (août 2022). Trois alternatives cohabitent en 2026. 1) Pod Security Admission (PSA) : intégré nativement depuis 1.23, plus simple que PSP mais limité aux trois profils privileged, baseline, restricted. Suffisant pour les cas simples. 2) OPA Gatekeeper : flexibilité maximale via CRD ConstraintTemplate + Constraint, expressivité complète du Rego. Bibliothèque gatekeeper-library open-source avec centaines de politiques prêtes à l'emploi. 3) Kyverno : alternative CNCF native Kubernetes, politiques en YAML. La plupart des clusters entreprise en 2026 combinent PSA (baseline standards Pod) + Gatekeeper ou Kyverno (règles métier spécifiques : image registry autorisé, labels obligatoires, quotas custom, conformité CIS, exigences sectorielles). Le passage forcé des PSP vers ces alternatives a été l'un des plus gros chantiers Kubernetes 2022-2024.
  • OPA est-il utilisable au-delà de Kubernetes ?
    Oui, c'est une force principale d'OPA par rapport aux alternatives Kubernetes-only. Cas d'usage au-delà de Kubernetes en 2026. 1) Validation Terraform via Conftest : vérifier avant apply que les ressources Terraform respectent les politiques de conformité (pas de S3 public, tagging obligatoire, régions autorisées). 2) Autorisation applicative dans les microservices : l'application interroge OPA (REST API ou bibliothèque Go embedded) pour savoir si l'utilisateur authentifié peut exécuter une action donnée. Pattern famous chez Netflix et Intuit. 3) API Gateway Envoy ou Kong : autorisation des requêtes HTTP au niveau gateway, avant atteinte des backends. 4) Service mesh Istio : autorisation fine inter-service. 5) SSH (via pam-opa), Kafka, Docker, CI/CD pipelines (GitHub Actions custom, Jenkins). 6) Conformité cloud (AWS, GCP, Azure) via outils comme Regula ou terrascan. Cette polyvalence justifie l'investissement dans Rego : les mêmes règles peuvent être réutilisées entre des dizaines de systèmes.
  • Quelle est la courbe d'apprentissage de Rego ?
    Moyenne à élevée selon les attentes. Les trois premiers jours sont frustrants pour qui vient d'un langage impératif (Python, JavaScript, Go) : Rego est déclaratif, inspiré de Datalog, avec des règles qui s'évaluent toutes simultanément et des variables dont la signification diffère des langages usuels. À partir du 5e-7e jour, les mécanismes fondamentaux deviennent clairs : rules, expressions, iterations implicites, unification. Une maîtrise opérationnelle (écriture de politiques non triviales en autonomie) s'atteint après 20-40 heures de pratique. Les ressources essentielles 2026 : playground interactif sur play.openpolicyagent.org (excellent), documentation officielle OPA et Styra Academy (gratuite, 10-15 heures de cours), livre Policy as Code (Jimmy Ray, O'Reilly 2024), gatekeeper-library comme source d'exemples réels. Les faux débutants (quelques semaines de pratique) peuvent produire des politiques qui fonctionnent mais sont inefficaces ou contiennent des bugs logiques subtils — la revue par un senior reste importante pendant les 3-6 premiers mois.
  • Comment déployer OPA Gatekeeper en production ?
    Déploiement type en 5 étapes sur 3-6 mois. 1) Installation Gatekeeper via Helm chart officiel (chart gatekeeper/gatekeeper), namespace dédié gatekeeper-system. Validation en mode enforcement = DENY sur un cluster de dev d'abord. 2) Import des politiques baseline depuis gatekeeper-library : required labels, image registry whitelist, resource quotas, non-root containers, read-only root filesystem. Une cinquantaine de politiques couvrent les exigences CIS Kubernetes Benchmark standards. 3) Déploiement en mode dry-run (enforcementAction: dryrun) sur les clusters de staging et prod pendant 2-4 semaines pour identifier les violations existantes, sans bloquer. 4) Remédiation progressive des violations identifiées équipe par équipe, avec plan de migration et exceptions documentées (excludedNamespaces pour kube-system, exceptions ciblées via Constraint). 5) Basculement en mode enforcement = deny par politique, en commençant par les moins impactantes. Prévoir 10-20 % du temps d'un DevSecOps Engineer sur 6-12 mois pour la mise en place complète sur un cluster mature.

Écrit par

Naim Aouaichia

Expert cybersécurité et fondateur de Zeroday Cyber Academy

Expert cybersécurité avec un master spécialisé et un parcours hybride : développement, DevOps, DevSecOps, SOC, GRC. Fondateur de Hash24Security et Zeroday Cyber Academy. Formateur et créateur de contenu technique sur la cybersécurité appliquée, la sécurité des LLM et le DevSecOps.