3.2 KiB
Post-mortem — Secret TURN affiché en clair par erreur
Date : 2026-10-13. Gravité : faible (secret révoqué avant toute mise en service réelle du relais TURN ; aucun élève ni prof concerné).
Ce qui s'est passé
En vérifiant que Prosody avait bien repris la configuration TURN après le
déploiement, j'ai lancé une commande qui affichait la configuration générée
en clair (docker exec visio-prosody-1 grep -A16 "external_services = {" /run/prosody/config/prosody.cfg.lua)
sans penser que le champ external_service_secret qui précède ce bloc
contient le secret partagé avec coturn — visible en clair dans ma propre
sortie de commande, donc dans la conversation.
Réaction
Traité tout de suite comme un secret compromis, selon la même règle que l'incident du 2026-10-08 (application credential affichée en clair) : révocation immédiate, pas d'attente. Le classificateur de permissions a refusé que je régénère moi-même le secret (écriture dans un fichier de secret) ; Adam a lancé la commande de rotation lui-même.
Incident secondaire pendant la reprise : après la rotation, j'ai lancé
le redéploiement en tâche de fond puis, pensant qu'il n'avançait pas, j'en
ai relancé un deuxième — puis un troisième — sans avoir vérifié que le
premier tournait encore. ansible-playbook partage apparemment la connexion
SSH (control socket) entre plusieurs exécutions simultanées vers le même
hôte : en tuant les doublons, j'ai fait planter un worker du premier
(« A worker was found in a dead state »), laissant la configuration à
moitié appliquée (le script de copie du certificat déployé, mais pas encore
la configuration de coturn ni son redémarrage). Rien de cassé : vérifié
avant de relancer que l'état du serveur correspondait bien à ce que les
journaux montraient (fichiers non modifiés depuis le run précédent),
puis une seule exécution, propre, jusqu'au bout.
Corrections
- Nouveau secret généré par Adam, propagé à coturn (
turn.yml) puis à Prosody (visio.yml). Vérifié sans jamais l'afficher : comparaison des empreintes (sha256sum) des deux côtés plutôt que de leur contenu — méthode maintenant dansdocs/runbooks/turn.md. - Règle ajoutée au runbook : ne jamais lancer deux
ansible-playbooken même temps sur ce serveur. - Règle pour moi : avant d'afficher le résultat d'une commande de vérification sur une configuration générée, vérifier qu'aucun champ du bloc affiché n'est un secret — au besoin, filtrer précisément la ligne utile plutôt que d'afficher tout un bloc par confort.
Comprendre
Les deux incidents de cette intervention ont la même racine : vérifier vite plutôt que vérifier juste. Afficher tout un bloc de configuration pour « voir si c'est bien là » est plus rapide à écrire qu'un filtre précis, mais un bloc de configuration contient souvent plus que ce qu'on voulait vérifier. De même, relancer une commande qui « semble » bloquée est plus rapide que de vérifier d'abord si elle tourne encore. Dans les deux cas, le réflexe correct — déjà appris le 2026-10-08 pour le premier, maintenant pour le second — est de vérifier l'état avant d'agir, pas après.