ajoute le relais TURN sur 443 pour la visio (ADR 0006), avec coturn et le routage Nginx par nom
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
parent
ee079ddffb
commit
45f8a69e26
19 changed files with 457 additions and 14 deletions
58
docs/postmortems/2026-10-13-secret-turn-affiche.md
Normal file
58
docs/postmortems/2026-10-13-secret-turn-affiche.md
Normal file
|
|
@ -0,0 +1,58 @@
|
|||
# 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 dans `docs/runbooks/turn.md`.
|
||||
- Règle ajoutée au runbook : ne jamais lancer deux `ansible-playbook` en
|
||||
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.
|
||||
Loading…
Add table
Add a link
Reference in a new issue