Sécuriser Amazon S3 : Chiffrement (SSE) avec Terraform
Maîtriser le chiffrement S3 avec Terraform
Pourquoi le chiffrement au repos (At Rest) est-il indispensable ?
La sécurité des données est le pilier du modèle de responsabilité partagée d’AWS. Pour un bucket S3, le chiffrement garantit que si les disques physiques du centre de données étaient compromis, vos données resteraient illisibles.
On distingue deux approches majeures :
- Server-Side Encryption (SSE) : Amazon S3 chiffre l’objet avant de l’écrire sur le disque et le déchiffre lors de la lecture. C’est la méthode la plus transparente.
- Client-Side Encryption : Vous chiffrez les données localement avant l’envoi. Bien que plus sécurisé, cela impose une gestion complexe des clés et de la logique applicative.
Comparatif : SSE-S3 vs SSE-KMS
Le choix de la méthode de chiffrement côté serveur dépend de vos besoins en audit et de votre budget (FinOps).
| Caractéristique | SSE-S3 (AES-256) | SSE-KMS |
|---|---|---|
| Gestion des clés | Entièrement gérée par AWS | Gérée par vous via KMS |
| Coût | Gratuit (inclus dans S3) | Coût par clé + Coût par requête KMS |
| Audit | Limité | Journalisation complète via CloudTrail |
| Complexité | Nulle | Nécessite des permissions IAM spécifiques |
Le conseil FinOps : Pour des buckets contenant des millions d’objets fréquemment accédés, le coût des requêtes KMS peut vite grimper. Utilisez le S3 Bucket Key pour réduire les appels à KMS et réaliser jusqu’à 99% d’économies sur ce poste.
Implémentation avec Terraform (Version >= 1.0)
Depuis les versions récentes du provider AWS pour Terraform, la configuration du chiffrement a été extraite de la ressource aws_s3_bucket vers une ressource dédiée : aws_s3_bucket_server_side_encryption_configuration.
Configuration SSE-S3 (Le standard)
C’est la méthode la plus simple et la plus économique.
resource "aws_s3_bucket" "my_secure_bucket" {
bucket = "my-company-data-production"
}
resource "aws_s3_bucket_server_side_encryption_configuration" "default" {
bucket = aws_s3_bucket.my_secure_bucket.id
rule {
apply_server_side_encryption_by_default {
sse_algorithm = "AES256"
}
}
}
Configuration SSE-KMS (Pour la conformité)
Si vous devez auditer chaque accès à vos données via CloudTrail.
resource "aws_s3_bucket_server_side_encryption_configuration" "kms_config" {
bucket = aws_s3_bucket.my_secure_bucket.id
rule {
apply_server_side_encryption_by_default {
kms_master_key_id = aws_kms_key.my_key.arn
sse_algorithm = "aws:kms"
}
bucket_key_enabled = true # Réduit les coûts KMS
}
}
Attention : Le cas des objets existants
L’activation du chiffrement sur un bucket existant n’est pas rétroactive. Les fichiers déjà présents resteront en clair (non chiffrés).
Pour y remédier, vous devrez “réécrire” vos objets sur eux-mêmes. La commande AWS CLI la plus simple pour chiffrer massivement est :
aws s3 cp s3://my-bucket/ s3://my-bucket/ --recursive --sse AES256
Conclusion
Le chiffrement d’un bucket S3 avec Terraform est devenu une “best practice” incontournable, souvent exigée par les frameworks de conformité (SOC2, RGPD). En utilisant les ressources Terraform modernes, vous assurez une infrastructure maintenable et sécurisée dès le premier jour.
Actuellement ingénieur DevOps/Architecte Cloud, j’étais initialement interessé par l’administration système et grâce aux entreprises dans lesquelles j’ai pu travailler Oxalide et maintenant Claranet j’ai eu la chance de découvrir l’univers du Cloud et de l’automatisation.
Je me suis décidé a publier ce blog pour vous faire partager ma passion mais également pour enrichir avec modestie tout ce que l’on peut trouver sur internet. Bonne lecture !