Policy as code Terraform : sécuriser les mises en production

TERRAFORM · SÉCURITÉ · GOUVERNANCE

Le policy as code Terraform transforme vos exigences de sécurité en contrôles testables. Voici une méthode pour protéger la production sans créer un mur de règles incompréhensibles.

Gouvernance des politiques Terraform avant mise en production

🧪

Tester avant de bloquer

Une politique doit réussir ses propres tests avant de décider du sort d’un déploiement.

🎚️

Graduer l’application

Informez d’abord, mesurez les écarts, puis bloquez les violations critiques et fiables.

🧾

Tracer les exceptions

Une dérogation doit avoir un propriétaire, une date d’expiration et une justification vérifiable.

Le policy as code consiste à exprimer des exigences d’infrastructure sous forme de règles versionnées et exécutables. Pour Terraform, le contrôle le plus utile analyse le plan avant l’application, puis explique précisément pourquoi une ressource respecte ou viole une règle.

Cette approche réduit les vérifications manuelles répétitives. Elle ne remplace pas la revue d’architecture. Elle rend visibles des écarts objectifs, comme une ressource publique, une région interdite, un chiffrement absent ou des tags obligatoires manquants.

Policy as code Terraform : la règle devient un produit

Une politique utile possède un objectif, un propriétaire, des tests et un cycle de vie. Elle doit produire une décision compréhensible. Un simple « refusé » ralentit l’équipe ; un message indiquant la ressource, la règle et la correction attendue accélère la résolution.

La politique reçoit des données structurées. Avec Terraform, il s’agit souvent du plan converti en JSON. Elle retourne ensuite des violations, un avertissement ou une autorisation. Le pipeline décide enfin si le déploiement peut continuer.

Flux à garder en tête

Code TerraformPlan JSONMoteur de règlesDécision tracée

Le vrai point de contrôle se situe avant terraform apply, lorsque le changement reste réversible et peu coûteux.

💡

Commencer par le plan

Le plan montre l’intention de changement. Certaines valeurs restent toutefois inconnues avant l’application ; prévoyez donc aussi des contrôles après déploiement.

Transformer les risques en règles vérifiables

Ne commencez pas par écrire cinquante règles. Listez d’abord les incidents que vous voulez empêcher. Pour chaque risque, identifiez la donnée disponible dans le plan, la sévérité, le responsable et la correction attendue.

Les premières règles devraient couvrir un petit nombre de risques importants. Une base réaliste vérifie l’exposition publique, le chiffrement, les régions autorisées, les identités trop privilégiées et les suppressions de ressources critiques.

🌍

Exposition réseau

Refuser un stockage public ou un port administratif ouvert à Internet.

🔐

Protection des données

Exiger le chiffrement et une clé adaptée au niveau de sensibilité.

💥

Rayon d’impact

Demander une validation renforcée pour les suppressions et changements IAM.

🏷️

Coût et responsabilité

Imposer des tags de propriétaire, environnement et centre de coût.

Évitez les règles portant sur un détail sans conséquence. Chaque contrôle ajoute du coût de maintenance. S’il ne protège ni une exigence métier, ni une obligation, ni un risque d’exploitation réel, il appartient probablement à un linter ou à une convention.

Placer chaque contrôle au bon niveau

Un contrôle sur le code HCL donne un retour rapide, mais il ne voit pas toujours le résultat final des modules et variables. Un contrôle sur le plan JSON se rapproche de ce qui sera créé. Un contrôle après application confirme l’état réel.

Utilisez ces niveaux ensemble. Le poste local sert au feedback rapide. La pull request applique les contrôles reproductibles. La porte avant production traite les risques élevés. La surveillance après déploiement détecte la dérive et les propriétés impossibles à connaître au plan.

Les contrôles se complètent : le plan constitue la porte de décision avant production.
⚠️

Une valeur inconnue n’est pas une valeur conforme

Certaines propriétés sont calculées par le fournisseur. Définissez explicitement le comportement attendu lorsque la politique rencontre une valeur inconnue.

Reliez aussi les politiques au périmètre. Une règle destinée à la production ne doit pas forcément bloquer une sandbox éphémère. À l’inverse, une exception de développement ne doit jamais s’étendre implicitement aux comptes sensibles.

Si votre organisation structure encore sa chaîne IaC, notre comparaison Terraform ou Ansible en entreprise aide à séparer provisioning, configuration et contrôles associés.

OPA, Conftest, Sentinel ou règles natives

OPA évalue des règles Rego sur des données JSON. Il reste indépendant du fournisseur et peut gouverner plusieurs domaines. Conftest facilite l’exécution de règles OPA dans une chaîne CI/CD et sur différents formats de configuration.

Sentinel s’intègre à HCP Terraform et Terraform Enterprise. Ses niveaux d’application permettent d’informer, d’autoriser une dérogation tracée ou de bloquer. Les politiques Terraform natives en HCL peuvent aussi réduire la courbe d’apprentissage dans cet environnement.

Choisissez selon votre plateforme, pas selon la popularité. Une équipe déjà équipée de HCP Terraform valorisera l’intégration. Une organisation multi-outils préférera souvent OPA. Une petite équipe peut commencer avec Conftest dans son pipeline existant.

Critère décisif

Préférez l’outil que votre équipe sait tester, mettre à jour et expliquer pendant un incident. La gouvernance dépend davantage du fonctionnement que de la syntaxe.

Mini-lab : contrôler un plan Terraform sans toucher au cloud

Ce test s’exécute dans un répertoire local ou un runner isolé. Il ne lance aucun apply. Utilisez un exemple sans données sensibles, un backend local et une version de Terraform validée par votre équipe.

✅ Pré-requis du lab

Terraform installé dans un environnement non critique
OPA installé localement ou via un conteneur épinglé
Aucun identifiant cloud nécessaire pour ce fichier local

Créez un exemple volontairement incomplet. La ressource locale évite de contacter un fournisseur cloud. Le contrôle exigera ici un tag logique owner.

terraform {
  required_version = ">= 1.6.0"
}

resource "terraform_data" "example" {
  input = {
    environment = "test"
  }
}

Initialisez le dossier, produisez un plan binaire, puis convertissez-le en JSON. Ne lancez pas l’application.

terraform init
terraform plan -out=tfplan.binary
terraform show -json tfplan.binary > tfplan.json

Ajoutez une politique Rego minimale. Elle cherche les ressources gérées et refuse celles dont la valeur d’entrée ne contient pas de propriétaire.

package terraform.guardrails

import rego.v1

deny contains msg if {
  some rc in input.resource_changes
  rc.mode == "managed"
  not rc.change.after.input.owner
  msg := sprintf("%s : owner manquant", [rc.address])
}

Évaluez la règle sur le plan. La requête affiche la liste des refus. Le résultat attendu contient l’adresse terraform_data.example et le message indiquant que le propriétaire manque.

opa eval \
  --data policy.rego \
  --input tfplan.json \
  'data.terraform.guardrails.deny'

Ajoutez ensuite owner = "platform" dans la valeur d’entrée, régénérez le plan et relancez OPA. La liste doit devenir vide. Cette seconde exécution vérifie le chemin conforme, pas seulement l’échec attendu.

Pour nettoyer, supprimez uniquement les fichiers générés dans ce répertoire de lab. Aucun état distant et aucune ressource cloud n’ont été créés.

rm tfplan.binary tfplan.json
rm -rf .terraform .terraform.lock.hcl
🔴

Ne bloquez pas sur ce prototype

Cette règle pédagogique ne gère ni modules complexes, ni valeurs inconnues. Écrivez des tests et validez la structure réelle de vos plans avant toute utilisation en production.

Déployer les garde-fous sans arrêter les livraisons

Commencez par une période d’observation. Le pipeline publie les violations sans bloquer. Mesurez leur fréquence, les faux positifs, le temps de correction et les équipes concernées. Corrigez les règles avant d’augmenter leur niveau d’application.

Classez ensuite les décisions. Une règle informative signale une amélioration. Une règle souple autorise une dérogation approuvée. Une règle stricte arrête un risque critique, comme une exposition publique non justifiée ou la suppression d’une ressource protégée.

Déployez par périmètre. Commencez sur une sandbox, puis un projet pilote, puis la production. Conservez la version du paquet de politiques avec chaque décision. Vous pourrez ainsi expliquer pourquoi un plan ancien a été accepté.

Faire évoluer les règles de l’observation au blocage ciblé conserve un chemin de retour arrière.

✅ Checklist avant le blocage

Chaque règle possède des tests positifs, négatifs et ambigus
Le message indique la ressource et la correction attendue
Les exceptions ont un propriétaire et une expiration
Un mode observation et un retour arrière sont documentés
Les décisions sont journalisées sans exposer de secret

Le retour arrière consiste à repasser une règle du mode bloquant au mode informatif, pas à supprimer toute la couche de contrôle. Protégez cette modification par une approbation et une trace d’audit.

Pour limiter les contournements, sécurisez aussi les runners. L’article sur la manière de restreindre les sorties réseau des runners CI/CD complète cette gouvernance du chemin de déploiement.

Erreurs courantes et dépannage

⛔ Tout bloquer immédiatement

Passez d’abord en observation. Corrigez les faux positifs, puis activez progressivement les règles dont la fiabilité est démontrée.

❓ Messages impossibles à exploiter

Retournez l’adresse Terraform, la règle, la sévérité et une action de correction. Le développeur doit résoudre le problème sans interroger l’équipe sécurité.

🕳️ Dérogations permanentes

Imposez une expiration et une revue. Une exception sans fin devient une politique parallèle, rarement comprise et jamais nettoyée.

🧩 Ignorer les modules

Testez des plans comportant des modules enfants. Une règle limitée au module racine peut laisser passer les ressources réellement déployées.

Surveillez également la durée des contrôles. Un pipeline trop lent pousse aux contournements. Séparez les règles rapides des analyses lourdes, mettez en cache les dépendances et exécutez les vérifications indépendantes en parallèle.

Sources officielles pour approfondir

FAQ sur le policy as code Terraform

À quel moment exécuter une politique Terraform ?
Exécutez-la après la génération du plan et avant l’application. Ajoutez des contrôles après déploiement pour les propriétés inconnues au moment du plan.
OPA, Conftest ou Sentinel : que choisir ?
OPA et Conftest favorisent la portabilité. Sentinel s’intègre nativement à HCP Terraform et Terraform Enterprise. Choisissez selon votre plateforme et vos compétences.
Faut-il bloquer toutes les violations dès le premier jour ?
Non. Commencez en mode informatif, mesurez les faux positifs, puis bloquez uniquement les règles critiques et fiables.
Comment gérer une exception urgente ?
Limitez sa durée et son périmètre. Associez un propriétaire, une justification et un ticket, puis journalisez l’approbation.
Une politique remplace-t-elle la revue humaine ?
Non. Elle automatise les règles objectives. La revue reste essentielle pour l’architecture, l’impact métier et les risques contextuels.
Comment vérifier qu’une politique ne casse pas la production ?
Testez des plans enregistrés, déployez en observation sur un périmètre réduit, puis gardez un retour arrière vers le mode informatif.

Faire des politiques un accélérateur de confiance

Le policy as code Terraform devient utile lorsqu’il donne un retour rapide, précis et proportionné. Commencez par quelques risques importants, testez les règles comme du code et rendez chaque exception visible.

La réussite se mesure autant au nombre d’incidents évités qu’au temps nécessaire pour corriger une violation. Une règle que chacun comprend protège mieux qu’un catalogue imposant que tout le monde contourne.

Besoin de cadrer vos garde-fous Terraform ?

Je peux auditer votre chaîne IaC, prioriser les règles et construire un déploiement progressif adapté à vos équipes.

Contacte-moi →

Quitter la version mobile