Aller au contenu
Infrastructure as Code medium
🔐 Alerte sécurité — Incident supply chain Trivy : lire mon analyse de l'attaque

Policy as Code et governance dans HCP Terraform

12 min de lecture

logo terraform

Un terraform plan peut être syntaxiquement correct mais proposer des changements dangereux : une instance en m5.24xlarge oubliée, une base de données sans chiffrement, un déploiement dans une région non autorisée. Le Policy as Code évalue automatiquement le plan avant l’apply pour bloquer les violations.

  • Ce qu’est le Policy as Code et pourquoi il existe
  • La différence entre Sentinel et OPA (Open Policy Agent)
  • La distinction entre policy checks et policy evaluations
  • Comment fonctionnent les policy sets et les niveaux d’enforcement
  • Comment créer et appliquer une première politique
  • Les limites du free tier pour le Policy as Code

Le Policy as Code dans HCP Terraform s’insère dans le cycle de vie d’un run, entre le plan et l’apply :

ÉtapeCe qui se passe
PlanTerraform calcule les changements
Policy checks / evaluationsLes politiques évaluent le plan
ApplyLes changements sont appliqués (si les politiques passent)

Si une politique échoue, le run est bloqué — aucun changement n’est appliqué.

HCP Terraform supporte deux frameworks de Policy as Code :

CritèreSentinelOPA (Rego)
Développé parHashiCorp (propriétaire)CNCF (open source)
LangageSentinel (DSL dédié)Rego (langage déclaratif)
ÉcosystèmeSpécifique HashiCorpMulti-usage (Kubernetes, CI/CD, API)
Courbe d’apprentissageFaible (syntaxe simple)Moyenne (Rego est particulier)
Données accessiblesPlan, state, run, organisationPlan JSON via input
Exemples et bibliothèquesterraform-sentinel-policies (HashiCorp)conftest, Rego Playground
Disponible en gratuit✅ (limité)✅ (limité)
  • Vous êtes dans un écosystème 100 % HashiCorp
  • Vous voulez une syntaxe simple et lisible sans courbe d’apprentissage
  • Vous avez besoin d’accéder aux données spécifiques HCP Terraform (run metadata, organization info)
  • Vous utilisez déjà OPA pour Kubernetes (Gatekeeper) ou vos API
  • Vous voulez des politiques portables entre outils
  • Votre équipe maîtrise déjà Rego

Pour les labs d’apprentissage, Sentinel est le choix le plus simple.

C’est la distinction architecturale la plus importante à comprendre dans HCP Terraform :

TypeFrameworks supportésEnforcement disponible
Policy checksSentinel uniquementadvisory, soft-mandatory, hard-mandatory
Policy evaluationsSentinel et OPAadvisory, mandatory (les niveaux soft-mandatory et hard-mandatory sont convertis en mandatory)

Concrètement :

  • Les policies Sentinel peuvent s’exécuter comme policy checks ou comme policy evaluations, selon le type de policy set choisi.
  • Les policies OPA s’exécutent uniquement comme policy evaluations.

Cette distinction affecte les niveaux d’enforcement disponibles, l’ordre d’exécution dans le run et les possibilités d’override.

Les niveaux d’enforcement disponibles dépendent du type d’évaluation.

NiveauComportement si échecCas d’usage
AdvisoryLe run continue, un avertissement est affichéRecommandations, bonnes pratiques non bloquantes
Soft-mandatoryLe run est bloqué, mais un utilisateur autorisé peut outrepasserRègles importantes avec exception possible
Hard-mandatoryLe run est bloqué, aucun override possibleRègles de conformité incontournables (sécurité, réglementation)

En mode policy evaluations, les niveaux soft-mandatory et hard-mandatory sont convertis en mandatory :

NiveauComportement si échec
AdvisoryLe run continue, un avertissement est affiché
MandatoryLe run est bloqué — les utilisateurs ayant la permission Manage Policy Overrides peuvent continuer

Un policy set regroupe des politiques et les applique à des workspaces ou des projects.

ComposantCe qu’il fait
PoliciesLes règles individuelles (fichiers .sentinel ou .rego)
ScopeLes workspaces ou projects ciblés
EnforcementLe niveau par défaut pour les politiques du set
SourcePolicies gérées dans l’UI, repository VCS ou API / provider tfe
  1. Préparez vos fichiers de politiques

    Exemple Sentinel — exiger des tags sur toutes les ressources AWS :

    enforce-tags.sentinel
    import "tfplan/v2" as tfplan
    mandatory_tags = ["environment", "team", "cost-center"]
    main = rule {
    all tfplan.resource_changes as _, rc {
    rc.type is "aws_instance" implies
    all mandatory_tags as tag {
    rc.change.after.tags contains tag
    }
    }
    }

    Exemple OPA (Rego) — limiter la taille des instances :

    restrict-instance-size.rego
    package terraform.policies
    deny[msg] {
    rc := input.resource_changes[_]
    rc.type == "aws_instance"
    rc.change.after.instance_type == "m5.24xlarge"
    msg := "Les instances m5.24xlarge ne sont pas autorisées"
    }

    Pour une policy OPA gérée dans l’UI, HCP Terraform demande une query qui pointe vers la règle Rego à évaluer — ici terraform.policies.deny. Le résultat de cette query doit être un tableau : la policy passe quand ce tableau est vide (aucune violation), et échoue quand il contient des messages.

  2. Créez le fichier de configuration du policy set

    Pour Sentinel, créez un sentinel.hcl :

    policy "enforce-tags" {
    source = "./enforce-tags.sentinel"
    enforcement_level = "soft-mandatory"
    }

    Pour OPA, créez un fichier policies.hcl ou utilisez l’interface web.

  3. Créez le policy set dans HCP Terraform

    Dans l’interface web : OrganizationSettingsPolicy SetsConnect a new policy set.

    ChampValeur
    SourcePolicies gérées dans l’UI (pour un test) ou VCS / API (pour la production)
    FrameworkSentinel ou OPA
    ScopeSpecific workspaces / Specific projects / All workspaces
  4. Testez la politique

    Lancez un terraform plan dans un workspace ciblé. Si le plan viole la politique :

    • En advisory : le run continue avec un avertissement.
    • En soft-mandatory (Sentinel checks) : le run est bloqué, un utilisateur autorisé peut outrepasser.
    • En hard-mandatory (Sentinel checks) : le run est bloqué sans override possible.
    • En mandatory (policy evaluations) : le run est bloqué — un utilisateur avec la permission Manage Policy Overrides peut continuer.

Voici des exemples de politiques fréquemment mises en place :

PolitiqueCe qu’elle vérifieEnforcement recommandé
Tags obligatoiresToutes les ressources ont les tags requisSoft-mandatory
Régions autoriséesPas de déploiement hors eu-west-1, eu-central-1Hard-mandatory
Chiffrement activéLes volumes EBS, S3 buckets et RDS sont chiffrésHard-mandatory
Taille d’instance limitéePas d’instances *.24xlarge ou *.metalSoft-mandatory
Pas d’adresses IP publiquesLes instances EC2 n’ont pas d’IP publiqueHard-mandatory
Coût estimé limitéLe cost estimate du plan ne dépasse pas un seuilAdvisory

HashiCorp fournit des bibliothèques de politiques prêtes à l’emploi :

  • terraform-sentinel-policies (GitHub) : collection de politiques Sentinel couvrant AWS, Azure, GCP et VMware.
  • Rego Playground : testez vos politiques OPA en ligne avant de les déployer.

En production, le cycle de vie des politiques suit un workflow structuré :

  1. Développez la politique en local ou dans le Rego Playground.

  2. Testez la politique en mode advisory sur un workspace de staging.

  3. Observez les résultats pendant quelques jours — identifiez les faux positifs.

  4. Corrigez la politique et passez en soft-mandatory (Sentinel checks) ou mandatory (policy evaluations).

  5. Déployez en production en hard-mandatory (Sentinel checks uniquement) quand la confiance est établie.

SymptômeCause probableSolution
Policy check: soft-mandatory failedLe plan viole une politique Sentinel (checks)Corrigez la configuration ou demandez un override à un utilisateur autorisé
Policy check: hard-mandatory failedLe plan viole une politique bloquante (Sentinel checks)Corrigez obligatoirement la configuration
Policy evaluation: mandatory failedLe plan viole une policy evaluation (Sentinel ou OPA)Corrigez la configuration ou demandez un override (permission Manage Policy Overrides)
Le policy check n’apparaît pasAucun policy set n’est attaché au workspaceVérifiez le scope du policy set
Error: invalid policy lors de l’uploadErreur de syntaxe dans le fichier .sentinel ou .regoValidez la syntaxe en local avant l’upload
Le policy set VCS ne se met pas à jourConnection VCS non configurée (free tier)Uploadez manuellement ou passez au plan Standard
Faux positif sur une politiqueLa politique est trop stricteAffinez les conditions ou ajoutez une exception
  • Le Policy as Code évalue automatiquement le plan entre le plan et l’apply. C’est votre dernier rempart avant un changement non conforme.
  • Sentinel (HashiCorp, syntaxe simple) et OPA (CNCF, Rego, portable) sont les deux frameworks supportés. Sentinel est plus simple pour débuter.
  • Sentinel peut s’exécuter comme policy checks (3 niveaux : advisory, soft-mandatory, hard-mandatory) ou comme policy evaluations (2 niveaux : advisory, mandatory). OPA ne supporte que les policy evaluations.
  • L’override d’une politique dépend du type d’évaluation et de la configuration du policy set — hard-mandatory en Sentinel checks est le seul cas sans override possible.
  • En édition gratuite : 1 policy set, 5 politiques maximum, pas de VCS. Suffisant pour tester et apprendre.
  • Déployez progressivement : advisorymandatory / soft-mandatoryhard-mandatory (Sentinel checks) une fois la confiance établie.

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens +700 guides gratuits, sans pub ni tracing. Aujourd'hui, ce site ne couvre même pas mes frais d'hébergement, d'électricité, de matériel, de logiciels, mais surtout de cafés.

Un soutien régulier, même symbolique, m'aide à garder ces ressources gratuites et à continuer de produire des guides de qualité. Merci pour votre appui.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn