Aller au contenu
Sécurité medium

Vault Transit : chiffrement as a service

15 min de lecture

logo vault

Le secrets engine Transit offre du chiffrement as a service. Au lieu de gérer vous-même les clés de chiffrement dans votre application, vous envoyez les données à Vault qui les chiffre ou les déchiffre pour vous. Les clés ne quittent jamais Vault.

Ce guide vous montre comment utiliser Transit pour sécuriser vos données applicatives.

  • Vault installé et démarré
  • Variables d’environnement configurées (VAULT_ADDR, VAULT_TOKEN)

Imaginons une application qui stocke des données sensibles (numéros de carte, données de santé) dans une base de données. Vous devez les chiffrer, mais :

  • Où stocker la clé de chiffrement ? Dans le code ? Une variable ? Un fichier ?
  • Comment faire la rotation ? Changer la clé sans re-chiffrer toutes les données ?
  • Qui a accès aux clés ? Comment auditer ?

Transit résout ces problèmes :

Approche traditionnelleAvec Transit
Clé dans le code/configClé dans Vault, jamais exposée
Rotation complexe (re-chiffrement manuel)Rotation facilitée (rewrap)
Audit difficileLogs d’audit complets
Algorithme à choisiraes256-gcm96 par défaut

Transit est puissant, mais il a des limites structurelles :

CapacitéTransitAlternative
Conserver le format/longueur des donnéesTransform (FPE)
Chiffrer de gros fichiers efficacementGPG, age, KMS cloud
Remplacer un KMS plateforme complet⚠️ PartielAWS KMS, GCP KMS
TokenisationTransform

Le secrets engine Transit n’est pas activé par défaut :

Fenêtre de terminal
vault secrets enable transit

Sortie :

Success! Enabled the transit secrets engine at: transit/

Chaque application ou domaine fonctionnel devrait avoir sa propre clé :

Fenêtre de terminal
vault write -f transit/keys/my-app-key

L’option -f (force) indique qu’on n’envoie pas de données, juste une création.

Sortie :

Key Value
--- -----
allow_plaintext_backup false
auto_rotate_period 0s
deletion_allowed false
derived false
exportable false
imported_key false
keys map[1:1773667976]
latest_version 1
min_available_version 0
min_decryption_version 1
min_encryption_version 0
name my-app-key
supports_decryption true
supports_derivation true
supports_encryption true
supports_signing false
type aes256-gcm96

Transit supporte plusieurs types de clés avec des capacités différentes :

Type de cléChiffrementDéchiffrementSignatureHMACUsage typique
aes256-gcm96Chiffrement symétrique standard
chacha20-poly1305Alternative à AES
rsa-2048 / rsa-4096Chiffrement asymétrique
ecdsa-p256 / ecdsa-p384Signatures uniquement
ed25519Signatures EdDSA
Fenêtre de terminal
# Clé RSA pour chiffrement asymétrique
vault write transit/keys/my-rsa-key type=rsa-4096
# Clé ECDSA pour signatures
vault write transit/keys/my-signing-key type=ecdsa-p256

Pour chiffrer, envoyez le texte en base64 :

Fenêtre de terminal
# Chiffrer "données sensibles"
vault write transit/encrypt/my-app-key \
plaintext=$(echo -n "données sensibles" | base64)

Sortie :

Key Value
--- -----
ciphertext vault:v1:+SBSxpnGHczUzugypADpd12e/P2p2bT/grzy8whwrwu7Ijt+NpXxI733VF/ER48=
key_version 1

Le ciphertext retourné est au format vault:v<version>:<données_chiffrées>.

#!/bin/bash
SECRET="mon_secret_api_key_123"
# Chiffrer
ENCRYPTED=$(vault write -field=ciphertext transit/encrypt/my-app-key \
plaintext=$(echo -n "$SECRET" | base64))
echo "Chiffré : $ENCRYPTED"
# Stockez $ENCRYPTED dans votre base de données
Fenêtre de terminal
vault write transit/decrypt/my-app-key \
ciphertext="vault:v1:+SBSxpnGHczUzugypADpd12e/P2p2bT/grzy8whwrwu7Ijt+NpXxI733VF/ER48="

Sortie :

Key Value
--- -----
plaintext ZG9ubsOpZXMgc2Vuc2libGVz

Le plaintext est en base64. Décodez-le :

Fenêtre de terminal
vault write -field=plaintext transit/decrypt/my-app-key \
ciphertext="vault:v1:..." | base64 -d
# données sensibles

Pour des volumes importants, Transit supporte le batch via batch_input :

Fenêtre de terminal
vault write transit/encrypt/my-app-key \
batch_input='[
{"plaintext": "'$(echo -n "secret1" | base64)'"},
{"plaintext": "'$(echo -n "secret2" | base64)'"},
{"plaintext": "'$(echo -n "secret3" | base64)'"}
]'

Sortie :

Key Value
--- -----
batch_results [map[ciphertext:vault:v1:...] map[ciphertext:vault:v1:...] ...]

Le batch réduit drastiquement le nombre d’appels réseau et améliore les performances pour les traitements de masse.

La dérivation permet d’isoler cryptographiquement des usages sans multiplier les clés. Une même clé logique produit des clés effectives différentes selon le context fourni.

Fenêtre de terminal
vault write transit/keys/multi-tenant-key derived=true
Fenêtre de terminal
# Données du tenant A
vault write transit/encrypt/multi-tenant-key \
plaintext=$(echo -n "données tenant A" | base64) \
context=$(echo -n "tenant-a" | base64)
# Données du tenant B (même clé, contexte différent)
vault write transit/encrypt/multi-tenant-key \
plaintext=$(echo -n "données tenant B" | base64) \
context=$(echo -n "tenant-b" | base64)
Fenêtre de terminal
vault write transit/decrypt/multi-tenant-key \
ciphertext="vault:v1:..." \
context=$(echo -n "tenant-a" | base64)
ScénarioContexte
Multi-tenantID du tenant
Par environnementprod, staging, dev
Par type de donnéespii, financial, logs
Par utilisateurUser ID

Par défaut, Transit produit un ciphertext différent pour chaque chiffrement du même plaintext (même clé, même données). C’est le comportement le plus sûr.

Le convergent encryption produit un ciphertext identique pour la même combinaison plaintext + context :

Fenêtre de terminal
vault write transit/keys/convergent-key \
derived=true \
convergent_encryption=true
Cas d’usageUtilité
DéduplicationDétecter les doublons sans déchiffrer
Recherche déterministeIndexer sur des valeurs chiffrées
ComparaisonVérifier l’égalité sans exposer le plaintext

La rotation crée une nouvelle version de la clé. Les anciennes versions restent disponibles pour déchiffrer les données existantes.

Fenêtre de terminal
vault write -f transit/keys/my-app-key/rotate

Vérifiez :

Fenêtre de terminal
vault read transit/keys/my-app-key

Sortie (extrait) :

keys map[1:1773667976 2:1773668123]
latest_version 2
OpérationVersion utilisée
Nouveau chiffrementToujours la dernière (v2)
Déchiffrement v1Fonctionne ✅
Déchiffrement v2Fonctionne ✅

La rotation seule ne migre pas les données existantes. Elles restent chiffrées avec l’ancienne version jusqu’à un rewrap explicite.

Rewrap : migrer les données vers la nouvelle clé

Section intitulée « Rewrap : migrer les données vers la nouvelle clé »

Pour que les données existantes bénéficient de la nouvelle version de clé, utilisez rewrap :

Fenêtre de terminal
vault write transit/rewrap/my-app-key \
ciphertext="vault:v1:..."

Sortie :

Key Value
--- -----
ciphertext vault:v2:... ← Nouvelle version
key_version 2
  1. Rotation : créer la nouvelle version de clé

  2. Rewrap progressif : migrer les données en batch via l’application

  3. Vérification : s’assurer qu’aucune donnée n’utilise l’ancienne version

  4. Restriction : augmenter min_decryption_version pour forcer la migration

Configurez une rotation périodique automatique :

Fenêtre de terminal
vault write transit/keys/my-app-key/config auto_rotate_period=720h # 30 jours

Pour forcer la migration vers les nouvelles clés, définissez une version minimale de déchiffrement :

Fenêtre de terminal
# Refuser le déchiffrement avec les versions < 3
vault write transit/keys/my-app-key/config min_decryption_version=3

Par défaut, les clés ne sont jamais exportables. Pour des besoins exceptionnels (migration hors Vault) :

Fenêtre de terminal
# À faire UNIQUEMENT à la création de la clé
vault write transit/keys/exportable-key exportable=true allow_plaintext_backup=true

Votre application chiffre certaines colonnes avant insertion :

Flux de chiffrement Transit pour colonnes en base

Les clés de chiffrement n’existent que dans Vault.

Transit peut générer des signatures HMAC pour valider l’intégrité :

Fenêtre de terminal
vault write transit/hmac/my-app-key \
input=$(echo -n "données à signer" | base64)

Sortie :

Key Value
--- -----
hmac vault:v1:abc123...

Avec une clé RSA ou ECDSA :

Fenêtre de terminal
# Créer une clé de signature
vault write transit/keys/signing-key type=ecdsa-p256
# Signer
vault write transit/sign/signing-key \
input=$(echo -n "données à signer" | base64)
# Vérifier
vault write transit/verify/signing-key \
input=$(echo -n "données à signer" | base64) \
signature="vault:v1:..."

En production, intégrez Transit via l’API HTTP ou un SDK.

Fenêtre de terminal
curl -s \
--header "X-Vault-Token: $VAULT_TOKEN" \
--request POST \
--data '{"plaintext": "'$(echo -n "secret" | base64)'"}' \
$VAULT_ADDR/v1/transit/encrypt/my-app-key | jq
LangageSDK/Client
Gogithub.com/hashicorp/vault/api
JavaSpring Cloud Vault, vault-java-driver
Pythonhvac
Node.jsnode-vault
Rubyvault gem

Transit centralise la crypto mais augmente la dépendance applicative à Vault. À considérer :

AspectImpact
LatenceChaque opération = appel réseau à Vault
DébitVault devient un composant critique haute charge
DisponibilitéSi Vault down, pas de chiffrement/déchiffrement
QuotasVault supporte des rate limits par path
  • Batch : regroupez les opérations plutôt que des appels unitaires
  • Cache applicatif : pour les données déchiffrées fréquemment lues
  • Monitoring : surveillez les métriques Vault (latence, throughput)
  • HA : cluster Vault en haute disponibilité pour la résilience
SymptômeCause probableSolution
invalid ciphertextFormat incorrectVérifier le préfixe vault:v1:
ciphertext was not valid base64Données corrompuesVérifier l’intégrité du ciphertext
message authentication failedMauvaise clé ou données modifiéesVérifier le nom de clé
key version not availablemin_decryption_version trop élevéRewrap les données d’abord
context requiredClé derived=true sans contextFournir context= encodé base64
unsupported operationType de clé incompatibleVérifier les capacités du type
  1. Transit = chiffrement as a service, clés jamais exposées
  2. Toujours encoder en base64 avant d’envoyer à Vault
  3. Choisir le bon type de clé selon l’opération (chiffrement, signature…)
  4. Dérivation + context : isoler cryptographiquement sans multiplier les clés
  5. Rotation ≠ migration : rewrap nécessaire pour les données existantes
  6. Convergent encryption : déterministe mais révèle l’égalité des plaintexts
  7. Batch pour les performances, API/SDK pour la production
  8. Transit ne préserve pas le format — pour cela, voir Transform

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