sorb chose C, fully disabling federation at the edge. Building it showed that would have killed group calls: lk-jwt-service verifies OpenID tokens through /_matrix/federation/v1/openid/userinfo and reaches it over the public name, so a path block on /_matrix/federation is the mrtc outage again with a different cause. C was dropped and B implemented. The ADR records the measurement the decision rests on - zero destinations, zero remote users, zero rooms with outside participation in four months - and the trap, so nobody completes C later as a quick follow-up. Doing that safely means binding the auth service to Synapse in-cluster first, which is its own undertaking with a call acceptance. Also recorded because it nearly slipped through: Flux applied the ConfigMap while Synapse kept running its old config from 2026-08-01. The config is rendered at pod start, so the change was inert until a restart - the same class as #0044. Verified afterwards inside the running process rather than in the ConfigMap, with the client API and the OpenID endpoint still answering.
82 lines
3.8 KiB
Markdown
82 lines
3.8 KiB
Markdown
---
|
|
type: adr
|
|
id: "0021"
|
|
status: accepted
|
|
date: 2026-08-19
|
|
supersedes: null
|
|
superseded_by: null
|
|
related:
|
|
- "docs/issues/0060-gitops-17-federation-allowlist-or-closed-federation-dec.md"
|
|
- "docs/issues/0088-gitops-56-networkpolicy-ausgehender-verkehr-ist-unbesch.md"
|
|
---
|
|
|
|
# ADR-0021: Föderation wird geschlossen — leere Whitelist statt offener Tür
|
|
|
|
## Kontext
|
|
|
|
Die Frage stand seit dem 2026-07-28 offen, weil niemand wusste, was eine Schließung
|
|
kosten würde. Am 2026-08-19 wurde sie gemessen statt geschätzt.
|
|
|
|
**Föderation war offen und öffentlich erreichbar.** In `synapse-values.yaml` stand zu
|
|
Föderation nichts, es galten die Synapse-Vorgaben; `/_matrix/federation/v1/version` und
|
|
`/_matrix/key/v2/server` antworteten von außen mit HTTP 200. Dass Port 8448 zu ist,
|
|
änderte daran nichts: Die Delegation in `/.well-known/matrix/server` führt die
|
|
Föderation über `matrix.axion1337.chat:443`, denselben Port wie den Client-Verkehr.
|
|
|
|
**Benutzt wurde sie nie.** Über die gesamte Betriebszeit seit dem 2026-04-21, aus der
|
|
Synapse-Datenbank: **0** Einträge in `destinations`, **0** je erfolgreich kontaktierte
|
|
Server, **0** fremde Nutzer in den 31 eigenen Räumen, **0** Räume mit fremder
|
|
Beteiligung. Nicht „wenig", sondern null.
|
|
|
|
Damit ist der Handel nicht „Reichweite gegen Sicherheit", sondern **eine ungenutzte
|
|
Fähigkeit gegen die größte fremdzugewandte Angriffsfläche, die Synapse hat** — und
|
|
historisch die, in der seine CVEs sitzen.
|
|
|
|
## Optionen
|
|
|
|
**A: offen lassen.** Kein Aufwand; dauerhaft Angriffsfläche für null nachgewiesenen
|
|
Bedarf.
|
|
|
|
**B: `federation_domain_whitelist: []`.** Föderation nur mit ausdrücklich genannten
|
|
Servern, leer also mit keinem. Eine Zeile, versioniert, in Minuten umkehrbar.
|
|
Die Endpunkte antworten weiterhin — der Server wird unbeteiligt, nicht unsichtbar.
|
|
|
|
**C: Föderations-Endpunkte am Rand sperren.** Zunächst als „kleinste Fläche" gewählt,
|
|
dann **verworfen** — beim Umsetzen zeigte sich, dass es die Gruppen-Calls zerstört
|
|
hätte (siehe unten).
|
|
|
|
## Entscheidung
|
|
|
|
**Option B.** `federation_domain_whitelist: []` in
|
|
`gitops:apps/production/custom-configs/synapse-values.yaml`.
|
|
|
|
## Warum C verworfen wurde — der Teil, der nicht offensichtlich ist
|
|
|
|
Der MatrixRTC-Authorisation-Service (`lk-jwt-service`) prüft OpenID-Tokens über
|
|
**`/_matrix/federation/v1/openid/userinfo`** — einen Föderations-Pfad. Und er ruft ihn
|
|
über den **öffentlichen** Namen auf: Das Deployment trägt keine `hostAliases` und
|
|
`dnsPolicy: ClusterFirst`, `matrix.axion1337.chat` löst also auf die öffentliche IP auf
|
|
und der Verkehr läuft über Traefik.
|
|
|
|
Wer `/_matrix/federation/` am Ingress sperrt, kappt damit die Token-Prüfung für
|
|
Gruppen-Calls — **derselbe Ausfall wie beim gelöschten `mrtc`-Record, nur mit anderer
|
|
Ursache.** Ein Pfad-Block sieht dabei korrekter aus als die Whitelist, weshalb dieser
|
|
Zusammenhang im Konfigurations-Kommentar festgehalten ist und nicht nur hier.
|
|
|
|
Synapse bedient diesen Endpunkt ohne X-Matrix-Signatur (`REQUIRE_AUTH = False`); die
|
|
Whitelist greift dort also nicht und darf es auch nicht.
|
|
|
|
## Konsequenzen
|
|
|
|
- Fremde Server können weder beitreten noch Ereignisse einliefern. Bestehende Räume und
|
|
Nutzer sind nicht betroffen — es gab keine fremde Beteiligung, die enden könnte.
|
|
- **Die Fähigkeit ist eine Zeile entfernt**, nicht verloren: Ein Domain-Eintrag öffnet
|
|
gezielt für einen Partner. Das war der Grund, B gegenüber einem harten Rückbau
|
|
vorzuziehen.
|
|
- Die Endpunkte antworten weiterhin von außen. Wer das ändern will, muss **zuerst** den
|
|
Auth-Service clusterintern an Synapse binden — sonst siehe oben. Das ist ein eigenes
|
|
Vorhaben mit Call-Abnahme, kein Nebenschritt.
|
|
- Eine Port-Sperre bei Hetzner kann diese Trennung **nicht** leisten: Föderation und
|
|
Client-Verkehr teilen sich 443. Die Konfiguration ist die einzige Stelle, an der sie
|
|
überhaupt trennbar sind.
|