[MEDIUM] coturn Shared-Secret Rotationspolitik klaeren #38

Closed
opened 2026-07-28 15:01:27 +00:00 by sorb · 2 comments
Owner

coturn nutzt HMAC-Auth mit einem statischen Shared Secret (siehe apps/production/coturn-secret.yaml, SOPS-verschluesselt). Bisher nie thematisiert, ob/wie oft dieses Secret rotiert werden sollte, und was der Rotationsprozess waere (Secret aendern -> coturn neu deployen -> alte Clients mit gecachten Tokens? TURN-Tokens sind idR kurzlebig, sollte unkritisch sein, aber noch nicht durchdacht/entschieden). Braucht noch ein Gespraech, keine fertige Entscheidung.

coturn nutzt HMAC-Auth mit einem statischen Shared Secret (siehe `apps/production/coturn-secret.yaml`, SOPS-verschluesselt). Bisher nie thematisiert, ob/wie oft dieses Secret rotiert werden sollte, und was der Rotationsprozess waere (Secret aendern -> coturn neu deployen -> alte Clients mit gecachten Tokens? TURN-Tokens sind idR kurzlebig, sollte unkritisch sein, aber noch nicht durchdacht/entschieden). Braucht noch ein Gespraech, keine fertige Entscheidung.
sorb added the priority:mediumarea:security labels 2026-07-28 15:01:27 +00:00
Author
Owner

Vollstaendig umgesetzt und live end-to-end verifiziert.

Architektur-Fix (0242238, 62b05c5, d24dbf8, e53896e): TURN-Secret war dupliziert - korrekt SOPS-verschluesselt in coturn-secret.yaml, aber zusaetzlich im Klartext in synapse-values.yaml (git-Historie!). Ausgelagert in eine eigene synapse-turn-secret.yaml (SOPS), Wert rotiert. Nebenbei gefunden+gefixt: coturns hostNetwork-Deployment nutzte RollingUpdate, was auf Single-Node nie schedulen kann (neuer Pod braucht dieselben Ports wie der alte) - auf Recreate umgestellt.

Automatisierung (947eaab, c1c189d, 62d4bf6): Monatlicher CronJob (rohana.axion1337.de/sorb/axion-secret-rotation:v1), rotiert das Secret, committet/pusht mit einem dedizierten, gescopten age-Key (nur diese zwei Dateien entschluesselbar, nicht das Repo-Master-Secret) auf einen neuen Branch und oeffnet eine PR statt direkt nach main zu pushen - Mensch merged bewusst.

Live-Test (PR #42, gemerged):

  • Job lief durch, PR mit exakt den 4 erwarteten Dateien geoeffnet, Diff sauber (nur Secret-Werte + Checksums)
  • Nach Merge: coturn restartete schnell (Kustomization-Ebene), Synapse aber verzoegert - Helm-Controller (eigenes Reconcile-Intervall, war 5m) braucht separat laenger als die Kustomization (1m) um das geaenderte Secret zu bemerken. Kurzes Fenster, in dem coturn+Synapse unterschiedliche Secrets haben (Anrufe waeren in dem Fenster fehlgeschlagen). Selbstheilend (keine manuelle Aktion noetig), aber verkuerzt: HelmRelease-Intervall auf 1m reduziert (22299b6), passend zu production-apps.
  • Danach: echter Call getestet, funktioniert.

Unterwegs gefunden+gefixt: Netzwerk-Erreichbarkeit zum Gitea-Host von Pods aus war zeitweise down (siehe #41) - hostAliases auf den Rotation-Job ergaenzt, damit er ueber das private Hetzner-Netz laeuft statt vom oeffentlichen Firewall-Status abhaengig zu sein.

Vollstaendig umgesetzt und live end-to-end verifiziert. **Architektur-Fix (0242238, 62b05c5, d24dbf8, e53896e):** TURN-Secret war dupliziert - korrekt SOPS-verschluesselt in `coturn-secret.yaml`, aber zusaetzlich im Klartext in `synapse-values.yaml` (git-Historie!). Ausgelagert in eine eigene `synapse-turn-secret.yaml` (SOPS), Wert rotiert. Nebenbei gefunden+gefixt: coturns `hostNetwork`-Deployment nutzte `RollingUpdate`, was auf Single-Node nie schedulen kann (neuer Pod braucht dieselben Ports wie der alte) - auf `Recreate` umgestellt. **Automatisierung (947eaab, c1c189d, 62d4bf6):** Monatlicher CronJob (`rohana.axion1337.de/sorb/axion-secret-rotation:v1`), rotiert das Secret, committet/pusht mit einem **dedizierten, gescopten age-Key** (nur diese zwei Dateien entschluesselbar, nicht das Repo-Master-Secret) auf einen neuen Branch und **oeffnet eine PR** statt direkt nach main zu pushen - Mensch merged bewusst. **Live-Test (PR #42, gemerged):** - Job lief durch, PR mit exakt den 4 erwarteten Dateien geoeffnet, Diff sauber (nur Secret-Werte + Checksums) - Nach Merge: coturn restartete schnell (Kustomization-Ebene), **Synapse aber verzoegert** - Helm-Controller (eigenes Reconcile-Intervall, war 5m) braucht separat laenger als die Kustomization (1m) um das geaenderte Secret zu bemerken. Kurzes Fenster, in dem coturn+Synapse unterschiedliche Secrets haben (Anrufe waeren in dem Fenster fehlgeschlagen). Selbstheilend (keine manuelle Aktion noetig), aber verkuerzt: HelmRelease-Intervall auf 1m reduziert (22299b6), passend zu production-apps. - Danach: echter Call getestet, funktioniert. **Unterwegs gefunden+gefixt:** Netzwerk-Erreichbarkeit zum Gitea-Host von Pods aus war zeitweise down (siehe #41) - `hostAliases` auf den Rotation-Job ergaenzt, damit er ueber das private Hetzner-Netz laeuft statt vom oeffentlichen Firewall-Status abhaengig zu sein.
sorb closed this issue 2026-07-28 19:41:32 +00:00
Author
Owner

Migriert nach git.lab: axion1337.chat/axion1337.chat-gitops#38 (nur im Lab bzw. via VPN erreichbar — das Lab ist seit 2026-08-01 die Quelle der Wahrheit, siehe gitops#48). Weiterarbeit dort; dieses Gitea-Issue bleibt als Verweis stehen.

**Migriert nach git.lab**: [axion1337.chat/axion1337.chat-gitops#38](https://git.lab/axion1337.chat/axion1337.chat-gitops/-/issues/38) (nur im Lab bzw. via VPN erreichbar — das Lab ist seit 2026-08-01 die Quelle der Wahrheit, siehe gitops#48). Weiterarbeit dort; dieses Gitea-Issue bleibt als Verweis stehen.
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: sorb/axion1337.chat-gitops#38