Sécurité de l'Infrastructure as Code
L'Infrastructure as Code apporte des bénéfices de versioning et d'automatisation mais introduit des risques si les misconfigurations sont propagées automatiquement. La sécurité doit être shift-left pour l'IaC.
Vulnérabilités courantes dans l'IaC
- Hardcoded secrets : Identifiants dans le code versionné
- Règles trop permissives : Security groups 0.0.0.0/0
- Ressources non chiffrées : Buckets S3, RDS sans chiffrement
- Accès public : Ressources exposées inutilement
- Logging manquant : CloudTrail, flow logs désactivés
- Authentification faible : MFA non imposé
Outils de scanning
Terraform - tfsec, Checkov, Terrascan
# Exemple de vulnérabilité - bucket S3 public
resource "aws_s3_bucket" "bad_bucket" {
bucket = "my-public-bucket"
acl = "public-read" # [ERREUR] VULNÉRABLE
}
# Correction
resource "aws_s3_bucket" "good_bucket" {
bucket = "my-private-bucket"
acl = "private" # [OK] Sécurisé
server_side_encryption_configuration {
rule {
apply_server_side_encryption_by_default {
sse_algorithm = "AES256"
}
}
}
versioning {
enabled = true
}
}
resource "aws_s3_bucket_public_access_block" "good_bucket" {
bucket = aws_s3_bucket.good_bucket.id
block_public_acls = true
block_public_policy = true
ignore_public_acls = true
restrict_public_buckets = true
}
tfsec - Scanning Terraform
# Install
brew install tfsec
# Scan Terraform files
tfsec .
# Sortie spécifique
tfsec --format json --out results.json .
# CI/CD integration
tfsec --soft-fail . || exit 1
Checkov - Scanner IaC Multi-Cloud
# Install
pip install checkov
# Scan Terraform
checkov -d ./terraform
# Scan CloudFormation
checkov -f template.yaml
# Scan Kubernetes manifests
checkov -d ./k8s
# Skip specific checks
checkov -d . --skip-check CKV_AWS_20
# Custom policies
checkov -d . --external-checks-dir ./custom-policies
Policy as Code
Open Policy Agent (OPA)
OPA permet d'écrire des policies dans le langage Rego pour imposer la conformité :
# deny_public_s3.rego
package terraform.aws.s3
deny[msg] {
resource := input.resource_changes[_]
resource.type == "aws_s3_bucket"
resource.change.after.acl == "public-read"
msg := sprintf("S3 bucket %s cannot be public", [resource.address])
}
deny[msg] {
resource := input.resource_changes[_]
resource.type == "aws_s3_bucket"
not resource.change.after.server_side_encryption_configuration
msg := sprintf("S3 bucket %s must have encryption enabled", [resource.address])
}
Sentinel (HashiCorp)
Framework de policies intégré à Terraform Cloud/Enterprise :
# enforce-mandatory-tags.sentinel
import "tfplan/v2" as tfplan
mandatory_tags = ["Environment", "Owner", "Project"]
all_resources = filter tfplan.resource_changes as _, rc {
rc.mode is "managed"
}
deny_resources_without_tags = rule {
all all_resources as _, resource {
all mandatory_tags as tag {
resource.change.after.tags contains tag
}
}
}
Secrets Management dans l'IaC
Terraform - Utilisation d'AWS Secrets Manager
# Créer un secret dans Secrets Manager
resource "aws_secretsmanager_secret" "db_password" {
name = "production/db/password"
recovery_window_in_days = 30
}
resource "aws_secretsmanager_secret_version" "db_password" {
secret_id = aws_secretsmanager_secret.db_password.id
secret_string = random_password.db_password.result
}
# Référencer le secret (n'expose pas la valeur)
data "aws_secretsmanager_secret_version" "db_password" {
secret_id = aws_secretsmanager_secret.db_password.id
}
# Utiliser dans RDS (référence, pas de valeur hardcoded)
resource "aws_db_instance" "main" {
# ... autres configs
password = data.aws_secretsmanager_secret_version.db_password.secret_string
}
git-secrets - Empêcher les commits de secrets
# Install git-secrets
brew install git-secrets
# Setup hooks pour le dépôt
git secrets --install
git secrets --register-aws
# Scan de l'historique des commits
git secrets --scan-history
# Empêcher les commits contenant des secrets
# Automatique via pre-commit hook
Sécurité du State File
- Remote state : S3 + DynamoDB lock, ne jamais commiter le state local
- Chiffrement : Server-side encryption sur S3
- Contrôle d'accès : Policies IAM restrictives pour le bucket de state
- Versioning : Activer le versioning pour la recovery
- State locking : DynamoDB pour empêcher les modifications concurrentes
Backend distant Terraform sécurisé
terraform {
backend "s3" {
bucket = "terraform-state-prod"
key = "global/s3/terraform.tfstate"
region = "us-east-1"
encrypt = true
dynamodb_table = "terraform-state-lock"
# MFA delete protection
versioning {
enabled = true
mfa_delete = true
}
}
}
CI/CD Integration
GitHub Actions - Workflow Terraform sécurisé
name: 'Terraform Security Scan'
on:
pull_request:
branches: [ main ]
jobs:
terraform-security:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Run tfsec
uses: aquasecurity/[email protected]
with:
soft_fail: false
- name: Run Checkov
uses: bridgecrewio/checkov-action@master
with:
directory: .
framework: terraform
output_format: sarif
output_file_path: checkov.sarif
- name: Upload results to GitHub Security
uses: github/codeql-action/upload-sarif@v2
with:
sarif_file: checkov.sarif
Drift Detection
Détecter les changements manuels en dehors de l'IaC qui créent des failles de sécurité :
- Terraform Cloud : Health checks automatiques
- driftctl : Drift detection open-source
- CloudFormation Drift Detection : Service natif AWS
- Scheduled scans : Jobs CI/CD périodiques
Frameworks de Compliance
- CIS Benchmarks : Modules Terraform pour la compliance
- NIST 800-53 : Policy packs pour les contrôles
- PCI-DSS : Policies pour le traitement des cartes de paiement
- HIPAA : Policies de compliance pour la santé
- SOC 2 : Policies de sécurité organisationnelle
Modules Terraform sécurisés
- Utiliser des modules vérifiés du Terraform Registry
- Épingler les versions des modules (ne pas utiliser latest)
- Code review des modules internes
- Registry privé pour les modules personnalisés
- Documenter les considérations de sécurité
Bonnes pratiques
- Peer review : PRs obligatoires pour les changements en production
- Plan avant apply : Revue des changements proposés
- Separate environments : Dev/Staging/Prod isolés
- Stratégie de tagging : Tags pour la gouvernance et le cost allocation
- Least privilege : Rôles IAM spécifiques pour le CI/CD
- Automated testing : Terratest pour la validation
Recommandations finales
La sécurité de l'IaC doit être automatisée et intégrée au CI/CD dès le début. Utilisez plusieurs outils de scanning (tfsec, Checkov) pour une couverture complète. Mettez en place le policy as code avec OPA ou Sentinel. Ne commitez jamais de secrets, utilisez des secret managers. Surveillez le drift en continu. La misconfiguration de l'IaC est l'une des causes les plus courantes de cloud breaches.
