Terraform security : sécuriser votre IaC avec Checkov, tfsec et Terrascan
Sécuriser votre code Terraform : scanner avec Checkov, tfsec et Terrascan, mauvaises configurations fréquentes (S3 public, SG permissif, IAM *), intégration CI/CD et GitOps security.
Pourquoi sécuriser votre code Terraform
L'Infrastructure as Code (IaC) a révolutionné le déploiement cloud : les configurations sont versionnées, reproductibles et auditables. Mais cette même automatisation peut déployer des mauvaises configurations à grande échelle, en production, en quelques secondes. Une règle de groupe de sécurité AWS trop permissive ou un bucket S3 public dans un fichier Terraform peut exposer des milliers de ressources d'un seul coup.
Le "shift left" de la sécurité IaC consiste à scanner le code Terraform avant qu'il soit appliqué — dans la PR, dans la CI/CD — plutôt que d'auditer l'infrastructure après déploiement. C'est 10 fois moins cher à corriger, et cela évite les incidents.
Les mauvaises configurations IaC les plus fréquentes
- Buckets S3 publics : `acl = "public-read"` ou absence de `block_public_acls = true` dans la configuration S3
- Security Groups trop permissifs : règles `0.0.0.0/0` en ingress sur SSH (22), RDP (3389) ou base de données (3306, 5432)
- IAM trop large : politiques IAM avec `"Action": "*"` ou `"Resource": "*"` sans conditions restrictives
- Secrets hardcodés : clés API, passwords, tokens écrits en clair dans les fichiers `.tf` ou dans les `user_data`
- Chiffrement désactivé : volumes EBS, bases RDS, buckets S3, secrets Manager sans chiffrement KMS
- Logging désactivé : CloudTrail, VPC Flow Logs, S3 access logs non activés
- MFA delete désactivé : sur les buckets S3 contenant des données critiques
Checkov : le scanner IaC open source le plus complet
Checkov (Bridgecrew/Prisma Cloud) est l'outil de référence pour scanner Terraform, CloudFormation, Kubernetes, Dockerfile et Helm charts. Il propose plus de 1 000 règles prédéfinies et supporte le format de politique personnalisée.
Installation et premier scan
Checkov s'installe en Python (`pip install checkov`) et scanne un répertoire Terraform en une commande :
- Scan d'un répertoire complet avec rapport JSON et SARIF
- Filtrage par provider (AWS, Azure, GCP) et par sévérité (CRITICAL, HIGH, MEDIUM)
- Suppression des faux positifs avec `# checkov:skip=CKV_AWS_XX:raison`
- Intégration native avec GitHub Actions, GitLab CI et Azure DevOps
Règles Checkov clés pour AWS
- CKV_AWS_18 : S3 bucket access logging activé
- CKV_AWS_21 : S3 versioning activé
- CKV_AWS_116 : Lambda dead letter queue configurée
- CKV_AWS_25 : Security Group sans 0.0.0.0/0 sur SSH
- CKV_AWS_57 : S3 public access block activé
- CKV2_AWS_6 : S3 bucket level public access block
tfsec et Terrascan : complémentaires à Checkov
tfsec (Aqua Security)
tfsec est spécialisé Terraform avec une vitesse d'exécution très rapide. Ses points forts :
- Analyse statique des fichiers `.tf` sans state file ni provider credentials
- Détection des modules Terraform avec leurs variables pour réduire les faux positifs
- Règles personnalisées en REGO (OPA) ou en format natif tfsec
- Output SARIF compatible avec GitHub Advanced Security pour les annotations dans les PRs
Terrascan (Tenable)
Terrascan supporte Terraform, Helm, Kubernetes, Dockerfile et CloudFormation avec 500+ règles. Sa particularité est sa gestion avancée des politiques OPA/Rego :
- Policy as Code en Rego pour des règles d'entreprise personnalisées
- Intégration avec les registres OCI pour scanner les charts Helm
- Mode serveur pour une intégration dans les pipelines CI/CD via API
Recommandation : utiliser plusieurs outils
Checkov, tfsec et Terrascan ne détectent pas exactement les mêmes problèmes. La combinaison Checkov + tfsec dans la CI/CD offre le meilleur rapport couverture/performance.
Intégration dans la CI/CD GitHub Actions
L'intégration des scanners IaC dans GitHub Actions permet de bloquer les PRs contenant des mauvaises configurations avant merge. Un workflow typique :
- Trigger : sur chaque PR modifiant des fichiers `.tf`
- Checkov : scan avec `bridgecrewio/checkov-action@master`, seuil de sévérité configurable
- tfsec : `aquasecurity/tfsec-action@v1.0.0` avec output SARIF vers GitHub Security
- Terraform plan : génération du plan et commentaire automatique dans la PR avec les changements d'infrastructure
- Infracost : estimation du coût des changements d'infrastructure (optionnel)
- Blocage : statut de check GitHub bloquant le merge si des violations CRITICAL sont trouvées
Sécurité du state file Terraform
Le state file Terraform (`terraform.tfstate`) contient des secrets en clair (mots de passe RDS, clés de chiffrement, outputs sensibles). Sa sécurisation est critique :
- Remote state uniquement : ne jamais commiter le state file dans Git. Utiliser S3 + DynamoDB (AWS), GCS (GCP) ou Azure Blob avec state locking
- Chiffrement côté serveur : activer SSE-KMS sur le bucket S3 contenant le state
- Accès limité : restreindre l'accès au state bucket aux seules pipelines CI/CD et aux administrateurs via des politiques IAM strictes
- Audit des accès : activer CloudTrail sur le bucket state pour tracer tous les accès
- Sensitive outputs : marquer les outputs contenant des secrets avec `sensitive = true` dans Terraform 0.14+
Gestion des secrets dans Terraform
Ne jamais mettre de secrets en clair dans le code Terraform. Les bonnes pratiques :
- AWS Secrets Manager / Parameter Store : référencer les secrets via `data "aws_secretsmanager_secret_version"` plutôt que de les écrire en dur
- HashiCorp Vault : provider Vault pour Terraform permettant de récupérer dynamiquement les secrets à l'apply
- Variables d'environnement : passer les secrets via `TF_VAR_nom_variable` dans la CI/CD (jamais dans le code)
- OIDC authentication : utiliser OIDC pour authentifier la CI/CD auprès d'AWS/Azure/GCP sans secrets statiques — voir l'article GitHub Actions security
- detect-secrets / gitleaks : scanner le code Terraform pour détecter les secrets accidentellement commités avant le push
Policy as Code avec OPA/Rego
Pour les organisations avec des règles de sécurité spécifiques (ex. "tous les buckets S3 doivent avoir un tag `data-classification`", "aucune instance EC2 ne peut avoir une IP publique"), Open Policy Agent (OPA) avec Rego permet de coder ces politiques :
- Conftest : outil CLI pour tester les plans Terraform contre des politiques Rego avant l'apply
- Sentinel (Terraform Enterprise/Cloud) : framework de policy as code natif de HashiCorp pour Terraform
- Checkov custom checks : écrire des règles Checkov en Python ou YAML pour des politiques d'entreprise
- Guardrails : les politiques OPA peuvent être centralisées dans un dépôt "policy" et référencées par tous les projets Terraform
Conclusion
La sécurité IaC est indispensable pour maintenir une posture cloud sécurisée à l'échelle. En intégrant Checkov et tfsec dans votre CI/CD, vous détectez les mauvaises configurations avant qu'elles atteignent la production. La prochaine étape est d'ajouter un CSPM (Cloud Security Posture Management) pour surveiller en continu l'état de conformité de votre infrastructure déployée, en complément des contrôles préventifs IaC.
Besoin d'un accompagnement en cybersécurité ?
CloudSecure vous aide à sécuriser votre infrastructure cloud et à protéger vos données.
Contactez-nous