Partage de secrets éphémères intégré à Slack avec chiffrement Fernet et piste d'audit complète
Une intégration Slack en une commande pour partager identifiants, jetons et clés API — chiffrement Fernet AES-128, TTL au choix (15 min / 1 h / 4 h / 24 h), hachage SHA-256 du jeton d'accès pour qu'il ne soit jamais stocké en clair, destruction après lecture unique, modal interactif pour la sélection du destinataire, limitation de débit, verrouillage au niveau de la ligne de base de données pour éviter les conditions de course et journal d'audit à cinq événements avec masquage des champs sensibles.
Le problème
Les identifiants partagés par messages Slack ou courriel persistent indéfiniment, sont visibles dans l'historique des canaux et ne laissent aucune piste d'audit. L'équipe avait besoin d'un moyen de remettre des secrets qui expirent automatiquement et ne laissent aucune trace après livraison.
Approche
- Back-end FastAPI avec chiffrement symétrique Fernet (AES-128 + HMAC) ; les jetons d'accès sont hachés en SHA-256 avant stockage — le jeton en clair n'existe que dans le lien à usage unique livré par message direct
- Modal Slack interactif déclenché par `/sendsecret` — menu déroulant de sélection du destinataire, champ de saisie du secret, note optionnelle et sélecteur TTL (15 min, 1 h, 4 h, 24 h) ; vérification de signature HMAC-SHA256 avec protection contre les attaques par rejeu sur chaque requête Slack
- Livraison du secret par message direct Slack au destinataire sélectionné avec un lien HTTPS de révélation à usage unique ; la page de révélation exige une confirmation explicite avant le déchiffrement et affiche le texte clair exactement une fois
- Destruction après lecture unique — `viewed_at` et `destroyed_at` définis atomiquement sous un verrou de ligne de base de données à la première révélation ; contenu chiffré immédiatement effacé, empêchant toute lecture ultérieure
- Tâche de nettoyage en arrière-plan toutes les 10 minutes marquant les secrets expirés comme détruits et créant un événement d'audit `expired_destroyed` ; expiration également vérifiée à l'accès avant le flux de révélation
- Journal d'audit à cinq événements (créé, message direct échoué, consulté, déchiffrement échoué, expiré détruit) avec adresse IP, User-Agent, identifiants Slack expéditeur/destinataire et métadonnées assainies — les noms de clés sensibles sont automatiquement masqués
- Limitation de débit par IP (60 req / 60 s) appliquée globalement ; MySQL 8 pour le stockage persistant avec migrations Alembic ; déploiement Docker Compose derrière HTTPS sur le réseau partagé
Résultat
- Les identifiants ne persistent jamais dans l'historique Slack — le lien à usage unique brûle à la lecture ou à l'expiration, et le contenu chiffré est immédiatement effacé
- Adopté par l'équipe LEARN Québec comme pratique standard pour la remise d'identifiants — aucun changement de flux de travail au-delà de la saisie d'une commande slash
- Piste d'audit complète de chaque événement du cycle de vie du secret sans stocker de valeurs sensibles, offrant visibilité aux équipes de sécurité sans exposition
Un projet qui attend depuis trop longtemps?
Nous répondons à chaque demande dans la journée ouvrable. Pas d'entonnoir — juste une vraie conversation pour vérifier la compatibilité.