Aller au contenu

07. Sécurité de l'Infrastructure as Code

07. Sécurité de l’Infrastructure as Code

Sécuriser le code de l’infrastructure

La sécurité de l’Infrastructure as Code repose sur trois piliers : analyser le code avant déploiement (shift-left), sécuriser l’état Terraform (tfstate) et imposer des politiques automatisées dans la CI/CD.

PilierObjectifOutils
Analyse statique (SAST IaC)Détecter les misconfigurations avant applytfsec, Checkov, KICS
Gestion des secretsÉviter les secrets en clair dans le code IaCgit-secrets, detect-secrets, HashiCorp Vault
Policy as CodeValider les plans contre des règles métier et de conformitéOPA/Conftest, Sentinel (Terraform Cloud)
Backend sécuriséProtéger le tfstate (clés, IPs, mots de passe en clair)S3 chiffré + DynamoDB lock
Gates CI/CDBloquer les merge requests qui introduisent des misconfigsCheckov en pipeline, GitHub Actions SARIF

Mauvaises configurations Terraform fréquentes (ici AWS)

  • S3 sans chiffrement (encryption = false)
  • Bucket S3 accessible publiquement (block_public_acls = false)
  • Ports SSH (22) ou RDP (3389) ouverts à Internet (0.0.0.0/0)
  • Base de données RDS exposée publiquement (publicly_accessible = true)
  • Journalisation CloudTrail absente ou désactivée (enable_logging = false)
  • HTTPS non imposé sur les services web
  • Version TLS obsolète
  • Secrets stockés en clair dans le code Terraform
  • Comptes IAM avec privilèges excessifs (AdministratorAccess)
  • Absence de tags de gouvernance
  • Volumes ou bases de données non chiffrés
  • Utilisation d’images ou d’AMI non maîtrisées
  • Désactivation des protections réseau natives du cloud
  • Déploiement sans contrôle de sécurité automatisé dans la CI/CD

Les outils de scan IaC

tfsecCheckov
tfsecCheckov
• Dédié Terraform : 400+ règles de sécurité
• Intégration native GitHub Actions / GitLab CI
• Custom checks en YAML ou JSON
• SARIF (Static Analysis Results Interchange Format) output pour
GitHub Security
• Open source : maintenu par Aqua Security
• Commande : tfsec . —format sarif
• Multi-IaC : Terraform, CloudFormation, K8s, Dockerfile, ARM, B
• 1000+ checks sécurité et conformité
• Fix automatique : checkov —fix
• Intégration Prisma Cloud (Palo Alto)
• Python, open source (Bridgecrew/Palo Alto)
• Commande : checkov -d . —framework terraform
icep
KICS (checkmarx)OPA / Conftest
• 2400+ queries multi-IaC en OPA Rego
• Support : Terraform, Ansible, Docker, K8s, CloudFormation
• Rapports : HTML, JSON, SARIF, CycloneDX
• Intégration CI/CD native via Docker image
• Commande : kics scan -p ./terraform -o results/
• Open source : Checkmarx KICS GitHub
• 2400+ queries multi-IaC en OPA Rego
• Support : Terraform, Ansible, Docker, K8s, CloudFormation
• Rapports : HTML, JSON, SARIF, CycloneDX
• Intégration CI/CD native via Docker image
• Commande : kics scan -p ./terraform -o results/
• Open source : Checkmarx KICS GitHub
• Policy as Code en Rego : multi-IaC et Kubernetes
• Validation en CI/CD avant terraform apply
• Règles réutilisables et versionables dans Git
• Commande : conftest test —policy ./policy plan.json
• Intégration Terraform : terraform show -json | conftest
• Bundles OCI pour distribuer les policies

Sécurisation du fichier d’état Terraform

Le fichier terraform.tfstate contient l’état réel de l’infrastructure : adresses IP, ARN de ressources, identifiants et parfois des secrets en clair. Un tfstate exposé constitue une fuite critique.

RisqueMitigation
Stockage local (terraform.tfstate)Migrer vers un backend distant chiffré (S3, GCS, Azure Blob)
Secrets en clair dans le stateActiver le chiffrement du backend + KMS (SSE-KMS pour S3)
Accès concurrent / corruptionActiver le locking (DynamoDB pour S3 backend)
Accès non contrôlé au bucketRestreindre les accès IAM : lecture seule en dehors du pipeline
Historique Git exposéNe jamais committer le tfstate — ajouter *.tfstate* à .gitignore
terraform {
backend "s3" {
bucket = "mon-tfstate-bucket"
key = "prod/terraform.tfstate"
region = "eu-west-1"
encrypt = true
kms_key_id = "arn:aws:kms:eu-west-1:123456789012:key/xxx"
dynamodb_table = "tfstate-lock"
}
}

Prêt pour lundi

#ActionCommandeDurée / CoûtImpact
1Scanner votre code Terraform existant avec tfsecdocker run --rm -it -v $(pwd):/src aquasecurity/tfsec /src --format sarif > tfsec-results.json5 min / GratuitIdentifier les mauvaises configurations dans votre IaC existant avant le prochain apply
2Migrer votre tfstate vers un backend S3 chiffré avec locking# backend.tf : bucket = 'nexapay-tfstate' · encrypt = true · dynamodb_table = 'tfstate-lock' · kms_key_id = 'arn:aws:kms:...'30 min / < 5€mois / Un tfstate en local ou dans Git = clés, IPs, passwords en clair accessibles
3Ajouter Checkov dans votre pipeline CI/CDpip install checkov && checkov -d . --framework terraform --output junitxml > checkov-results.xml15 min / GratuitBloquer les merge requests qui introduisent des misconfigs Terraform critiques