Aller au contenu
Infrastructure as Code medium
🔐 Alerte sécurité — Incident supply chain Trivy : lire mon analyse de l'attaque

sensitive : masquer les valeurs dans Terraform

9 min de lecture

logo terraform

sensitive = true empêche Terraform d’afficher une valeur dans le terminal, mais ne la retire pas du state. Si vous manipulez des mots de passe, tokens ou clés API, ce mécanisme est le premier réflexe à connaître. Il masque les valeurs dans terraform plan et terraform apply, et propage automatiquement le marquage à toute expression qui les référence. Par contre, le fichier state continue de contenir la valeur en clair : c’est la limite fondamentale que les ressources éphémères et les arguments write-only viennent résoudre.

  • Déclarer une variable sensitive : masquer les mots de passe dans le CLI
  • Déclarer un output sensitive : empêcher l’affichage par terraform output
  • Comprendre la propagation : toute expression dérivée est contaminée
  • Connaître la limite : le state contient toujours la valeur en clair

Pensez à un formulaire web avec un champ mot de passe :

# Affichage masqué
password_field = "••••••••" # l'utilisateur voit des points
actual_value = "S3cr3t!" # la valeur est toujours en mémoire
# C'est exactement ce que fait sensitive = true :
# Terraform affiche (sensitive value) au lieu du contenu
# mais la valeur est toujours stockée dans le state

sensitive = true c’est le masquage visuel, pas le chiffrement. Comme un champ mot de passe HTML : les points remplacent les caractères à l’écran, mais la vraie valeur circule quand même dans le formulaire.

Sans précaution, Terraform affiche les valeurs de toutes les variables et de tous les outputs directement dans le terminal. Un mot de passe passé en variable se retrouve dans la sortie du plan, de l’apply, et dans les logs CI/CD.

variable "db_password" {
description = "Mot de passe de la base de données"
type = string
}
Terraform will perform the following actions:
+ resource "aws_db_instance" "main" {
+ password = "S3cr3t!P@ssw0rd"
}

Le mot de passe apparaît en clair dans le terminal. Dans un pipeline CI/CD, il finit dans les logs.

Ajoutez sensitive = true dans le bloc variable :

variable "db_password" {
description = "Mot de passe de la base de données"
type = string
sensitive = true
default = "S3cr3t!P@ssw0rd"
}

Terraform remplace la valeur par (sensitive value) dans toute sortie CLI :

Changes to Outputs:
+ db_password_raw = (sensitive value)

Un output qui expose une valeur sensible doit lui aussi être marqué sensitive = true :

output "db_password" {
description = "Mot de passe de la base de données"
value = var.db_password
sensitive = true
}

Résultat de terraform output :

db_password = <sensitive>
db_username = "admin"

Quand une expression fait référence à une variable marquée sensitive, le résultat de cette expression devient lui aussi sensitive automatiquement. Terraform vous oblige alors à marquer l’output correspondant, sinon il refuse le plan.

locals {
connection_string = "${var.db_username}:${var.db_password}@db.example.com:5432"
}
output "connection_string" {
description = "Chaîne de connexion complète"
value = local.connection_string
sensitive = true
}

Ici, connection_string contient var.db_password qui est sensitive. Si vous oubliez sensitive = true sur l’output, Terraform affiche une erreur claire :

│ Error: Output refers to sensitive values
│ on outputs.tf line 1:
│ 1: output "connection_string" {
│ To silence this warning, add sensitive = true

sensitive = true masque l’affichage CLI, mais ne protège pas le state.

Après un terraform apply, le fichier terraform.tfstate contient la valeur en clair :

Fenêtre de terminal
terraform show -json | python3 -c "
import sys, json
d = json.load(sys.stdin)
for k, v in d['values']['outputs'].items():
print(f'{k}: {v[\"value\"]}')
"
connection_string: admin:S3cr3t!P@ssw0rd@db.example.com:5432
db_password_raw: S3cr3t!P@ssw0rd
db_username: admin

Le mot de passe est lisible par quiconque a accès au state. Cela vaut pour un state local (fichier sur disque) comme pour un state distant (S3, HCP Terraform).

MécanismeCe qu’il faitCe qu’il ne fait pas
sensitive = true (variable)Masque dans plan, apply, outputNe retire pas du state
sensitive = true (output)Masque dans terraform outputoutput -json affiche en clair
PropagationContamine les expressions dérivéesNe remonte pas vers les blocs parents

Tout mot de passe, token ou clé doit avoir sensitive = true. C’est la première ligne de défense, même si elle est incomplète.

Les fichiers .tfvars contenant des secrets doivent être dans .gitignore. Préférez TF_VAR_* en CI/CD ou un gestionnaire de secrets.

Si vous utilisez un backend distant (S3, GCS, HCP Terraform), activez le chiffrement et limitez les accès. Le state est le maillon faible.

sensitive = true reste indispensable pour l’affichage, mais depuis Terraform 1.11, les ressources éphémères et les arguments write-only permettent de ne jamais stocker un secret dans le state.

SymptômeCause probableSolution
Output refers to sensitive valuesUn output référence une valeur sensitive sans sensitive = trueAjouter sensitive = true sur l’output
Une valeur apparaît en clair dans les logs CILa variable n’est pas marquée sensitiveAjouter sensitive = true
terraform output -json affiche le secretComportement normal de TerraformRestreindre l’accès au state et aux commandes Terraform
Le secret est dans terraform.tfstatesensitive ne protège pas le stateChiffrer le backend distant ou passer aux ressources éphémères
  1. sensitive = true masque une valeur dans toute la sortie CLI de Terraform.
  2. La propagation est automatique : toute expression qui référence une valeur sensitive est contaminée.
  3. terraform output -json affiche les valeurs en clair malgré le marquage.
  4. Le state contient toujours la valeur : sensitive n’est pas un mécanisme de chiffrement.
  5. Pour exclure un secret du state, utilisez les ressources éphémères et les arguments write-only (Terraform ≥ 1.11).

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens +700 guides gratuits, sans pub ni tracing. Aujourd'hui, ce site ne couvre même pas mes frais d'hébergement, d'électricité, de matériel, de logiciels, mais surtout de cafés.

Un soutien régulier, même symbolique, m'aide à garder ces ressources gratuites et à continuer de produire des guides de qualité. Merci pour votre appui.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn