Documentation Index
Fetch the complete documentation index at: https://snakysec.mintlify.app/llms.txt
Use this file to discover all available pages before exploring further.
Runbook — Vault Transit migration for ClientSecret rows
Owner: Plateforme · Audience: MSSP_ADMIN avec accès Vault root + Postgres Statut: V1 (avril 2026) · Niveau de risque: moyen (déchiffrement de tous lesClientSecret puis ré-écriture)
Contexte
Avant le 2026-04, chaqueClientSecret était chiffré en AES-256-GCM avec une clé ENCRYPTION_KEY injectée dans process.env du conteneur applicatif. La clé n’était pas dans .env, mais elle était lisible via /proc/<node-pid>/environ par tout root du conteneur ou tout opérateur capable d’un docker exec.
Vault Transit (cryptography-as-a-service) déplace la clé maître dans Vault. L’app appelle transit/encrypt/mssp-clients et transit/decrypt/mssp-clients en HTTP, ne détient jamais la clé, et obtient en plus la rotation, le rewrap et l’audit centralisés.
Le code applicatif (src/lib/crypto.ts) supporte les deux formats simultanément :
- legacy AES —
ClientSecret.iv+authTagnon NULL → déchiffrement local. - Transit —
encryptedValuepréfixévault:v1:…,ivetauthTagà NULL → appel HTTP Vault.
Pré-requis
- Vault déployé, descellé, secrets engine
transit/activé avec les clésmssp-platformetmssp-clients. Vérification : - La policy
mssp-appaccordeupdatesurtransit/encrypt/mssp-clientsettransit/decrypt/mssp-clients(déjà appliqué parplatform/docker/vault/init.sh). - Postgres up, schéma à jour (
ClientSecret.ivetClientSecret.authTagnullable). Vérification : - Variables d’environnement disponibles à l’opérateur :
DATABASE_URL,VAULT_ADDR,VAULT_TOKEN(token avec capabilityupdatesurtransit/encrypt/mssp-clients),ENCRYPTION_KEY(l’ancienne clé AES, lue depuis Vaultmssp/data/platform).
Procédure
1 — Inventaire pré-migration
2 — Dry-run (aucune écriture, valide la chaîne complète decrypt→re-encrypt)
"would rewrap" par row, puis "done" avec ok = N, failed = 0, dryRun = true.
Si failed > 0 : interrompre. Soit la clé AES n’est pas la bonne (mauvais ENCRYPTION_KEY), soit une row a été corrompue. Ne pas continuer avant d’avoir résolu.
3 — Application
iv IS NOT NULL).
4 — Vérification post-migration
5 — Smoke-test applicatif
Côté UI, ouvrir un client ayant des secrets, déclencher une action qui nécessitedecrypt (ex : test de connexion onboarding). Si la lecture passe sans erreur, la migration est validée.
6 — Audit log
N par le compte effectif et <MSSP_ADMIN_USER_ID> par l’opérateur. Le log audit est scellé Ed25519 par les anchors.
Garde-fous
- Le script refuse de tourner contre un
DATABASE_URLnon-localhost sans--confirm-prod. Ce flag est volontairement explicite : ne pas l’ajouter par réflexe. - Le script utilise des transactions par row — pas de blast radius transactionnel. En cas d’échec partiel, les rows OK sont déjà migrées et le rerun reprend là où l’arrêt a eu lieu.
ENCRYPTION_KEYreste nécessaire tant que toutes les rows n’ont pas été rewrappées. Elle peut être retirée demssp/data/platformUNIQUEMENT après confirmation queCOUNT(*) WHERE iv IS NOT NULL = 0.
Rollback
Aucun rollback automatique. Si la migration produit des rows inutilisables :- Vault Transit ne fait JAMAIS de purge — toutes les opérations sont sur des clés versionnées. Donc même si la clé
mssp-clientsest rotée, les ciphertextsvault:v1:…restent déchiffrables. - Si malgré tout un rollback est nécessaire : restaurer la table
ClientSecretdepuis le dernier backup Postgres (cf. docs/dr/).
Post-migration
Une fois la totalité des clients migrés et validés :- Retirer
ENCRYPTION_KEYdemssp/data/platformdans Vault. - Retirer la lecture de
ENCRYPTION_KEYdansinstrumentation.ts(mappingencryption_key→ENCRYPTION_KEY) et dans le mapping requis prod du même fichier. - Supprimer le code
decryptLegacyAes()desrc/lib/crypto.ts(laisser une note dans le commit avec un lien vers ce runbook pour traçabilité).
iv NOT NULL. Calendrier suggéré : Q3 2026 (après 2 mois de stabilité Transit).