From 04b1b84da7eba21f1fcddf07ab24b34c4a3d28da Mon Sep 17 00:00:00 2001 From: Thore Cimbal Date: Fri, 21 Aug 2026 12:00:00 +0000 Subject: [PATCH] docs: Gate 1 for closing the outbound traffic (#0088), taken in progress Assigned by sorb. Size L: fifteen workloads, a real decision per service, and mistakes land in production. The acceptance criteria are counted in the running cluster rather than read off the manifests - that distinction is what produced this undertaking in the first place, since the issue's own remaining list was a week out of date. Zero workloads without an egress rule, every exception naming where and why with evidence that the service fails without it, a pre-agreed smoke list, and a demonstration from inside a pod that a forbidden target actually fails. Non-goals name the temptations: no ingress changes, no new model or tool, and no switching a feature off to save a rule. Synapse needs broad egress for URL previews and already has the right control in url_preview_ip_range_blacklist; disabling the feature would be the wrong lever, as the issue has said since the 20th. flux-system is excluded too - it pulls from the network and is the thing that rolls this change out, so cutting its ground is a separate act with its own fallback. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01F2Q4Ri8NGwyTZzScvKnWFM --- STATUS.md | 8 +- docs/design/2026-08-21-egress-vollstaendig.md | 83 +++++++++++++++++++ ...kpolicy-ausgehender-verkehr-ist-unbesch.md | 2 +- docs/ledger/2026-08-21-egress-vollstaendig.md | 31 +++++++ 4 files changed, 120 insertions(+), 4 deletions(-) create mode 100644 docs/design/2026-08-21-egress-vollstaendig.md create mode 100644 docs/ledger/2026-08-21-egress-vollstaendig.md diff --git a/STATUS.md b/STATUS.md index 7aae691..44f87e0 100644 --- a/STATUS.md +++ b/STATUS.md @@ -14,7 +14,7 @@ Bedeutung der Meilensteine: siehe [roadmap.md](roadmap.md). |---|---|---|---| | [0056](docs/issues/0056-gitops-9-external-postgresql-migration-cloudnativepg-o.md) | high | open | External PostgreSQL Migration: CloudNativePG or Hetzner | | [0078](docs/issues/0078-gitops-45-cve-meldeweg-v2-metriken-grafana-dashboard-al.md) | medium | open | CVE-Meldeweg v2: Metriken, Grafana-Dashboard, Alerts in eigenen Matrix-Raum | -| [0088](docs/issues/0088-gitops-56-networkpolicy-ausgehender-verkehr-ist-unbesch.md) | medium | open | NetworkPolicy: 15 Arbeitslasten haben noch freien Ausgang, zwei Namespaces ganz | +| [0088](docs/issues/0088-gitops-56-networkpolicy-ausgehender-verkehr-ist-unbesch.md) | medium | in-progress | NetworkPolicy: 15 Arbeitslasten haben noch freien Ausgang, zwei Namespaces ganz | | [0004](docs/issues/0004-overmind-02-e1000e-nic-hang-beobachtung-nach.md) | low | waiting | OVERMIND-02: e1000e-NIC-Hang — Beobachtung nach EEE-Fix + Firmware-Update | | [0072](docs/issues/0072-gitops-34-dsgvo-datenschutz-compliance-konkretisieren.md) | low | open | DSGVO/Datenschutz-Compliance konkretisieren | @@ -85,9 +85,11 @@ Bedeutung der Meilensteine: siehe [roadmap.md](roadmap.md). | [0090](docs/issues/0090-gitops-59-kein-kubernetes-audit-log-zugriffe-an-der-api.md) | low | open | Kein Kubernetes-Audit-Log — Zugriffe an der API werden nicht protokolliert | -## Active design docs (0) +## Active design docs (1) -_none active_ +| Design | Gate | Title | +|---|---|---| +| [2026-08-21-egress-vollstaendig](docs/design/2026-08-21-egress-vollstaendig.md) | gate-1 | Design: Den ausgehenden Verkehr zu Ende schließen (#0088) | ## ADRs (24) diff --git a/docs/design/2026-08-21-egress-vollstaendig.md b/docs/design/2026-08-21-egress-vollstaendig.md new file mode 100644 index 0000000..e1349a0 --- /dev/null +++ b/docs/design/2026-08-21-egress-vollstaendig.md @@ -0,0 +1,83 @@ +--- +type: design +status: gate-1 +date: 2026-08-21 +size: L +related: + - "docs/issues/0088-gitops-56-networkpolicy-ausgehender-verkehr-ist-unbesch.md" +--- + +# Design: Den ausgehenden Verkehr zu Ende schließen (#0088) + +## Gate 1 — Product + +**Problem.** Eingehend ist der Cluster dicht — 13 Ingress-Regeln, dazu +`default-deny-ingress` in beiden Namespaces. Ausgehend ist er es nicht. +Gemessen am 2026-08-21: + +| | | +|---|---| +| auf internen Verkehr eingeschränkt | **10** Arbeitslasten in `matrix` | +| weiterhin freier Ausgang, laufend | **7** — `synapse-main`, `matrix-authentication-service`, `matrix-rtc-sfu`, `matrix-rtc-authorisation-service`, `coturn`, `clamav`, `wikijs` | +| weiterhin freier Ausgang, Job-artig | **8** — `synapse-backup`, `wikijs-backup`, `wikijs-config`, `turn-secret-rotation`, `init-secrets`, `synapse-check-config`, `deployment-markers-pre`/`-post` | +| Namespaces ohne jede Ausgangsregel außer der Metadaten-Sperre | **2** — `authentik`, `monitoring` | + +Die Job-artigen sind nicht harmloser, nur seltener: Ihr Ausgang gilt beim +nächsten Lauf. Und `wikijs` ist unbeschränkt, während seine Datenbank und +seine Gruppenprüfung es nicht sind — das war nicht beabsichtigt und stand +nirgends. + +Warum das mehr ist als Hygiene: Ein Dienst mit freiem Ausgang kann nach +einer Kompromittierung nachladen, abfließen lassen und sich melden. Die +Ingress-Härtung schützt gegen den Einstieg, nicht gegen das, was danach +kommt. Der Metadaten-Dienst ist seit dem 2026-08-20 gesperrt — das war der +schärfste Einzelfall, nicht das Ende der Aufgabe. + +**Acceptance criterion.** Zählbar, im laufenden Cluster gemessen, nicht am +Manifest gelesen: + +1. **Null Arbeitslasten ohne Ausgangsregel.** In `matrix`, `authentik` und + `monitoring` ist jede Arbeitslast von genau einer Egress-Policy erfasst; + die Zahl derer, für die nur `egress-block-metadata` gilt, ist **0**. + Nachgewiesen mit demselben Skript wie die Bestandsaufnahme, nach + `status.phase` getrennt. +2. **Jede Ausnahme ist benannt und begründet.** Wo ein Dienst nach draußen + darf, steht im Manifest **wohin und warum** — nicht „braucht Internet". + Für jede Ausnahme existiert der Beleg, dass der Dienst ohne sie + scheitert. +3. **Kein Dienstausfall.** Eine vorab festgelegte Abnahmeliste läuft nach + dem Umbau durch: Föderation, Anmeldung über Authentik, ein Call, ein + Backup-Lauf, ClamAV-Signaturen, Wiki-Zugriff. Jede Zeile mit Messung, + nicht mit „sieht gut aus". +4. **Die Sperre ist gegengeprüft.** Für mindestens eine eingeschränkte + Arbeitslast wird gezeigt, dass ein Ziel außerhalb der Erlaubnis + **tatsächlich** scheitert — aus dem Pod heraus, mit einem Werkzeug, das + im Container existiert. + +**Non-goals.** + +- **Keine Ingress-Änderungen.** Eingehend ist dicht; daran wird nicht + gerührt. +- **Kein Umbau des Modells.** Es bleibt bei Policies je Namespace im + bestehenden Stil — kein Service-Mesh, keine Cilium-Policies, kein neues + Werkzeug. +- **Kein Abschalten von Funktionen**, um eine Regel zu sparen. Bei Synapse + ist die URL-Vorschau der Grund für breiten Ausgang, und sie hat mit + `url_preview_ip_range_blacklist` bereits die richtige Kontrolle — sie + abzuschalten wäre der falsche Hebel, das steht seit dem 20.08. im Issue. +- **Nicht `game-operating`, `gameserver`, Homelab.** Außerhalb des Umfangs. +- **Keine Egress-Regeln für `flux-system`.** Flux zieht aus dem Netz und + ist die Instanz, die diese Änderung ausrollt; sich selbst den Boden + wegzuziehen ist ein eigener Vorgang mit eigener Rückfallebene. + +**Announcement.** Der Cluster ist eingehend seit Monaten dicht und +ausgehend offen — jeder Dienst darf ins Internet, in fremde Namespaces und +zu beliebigen Zielen. Diese Etappe schließt das für die verbliebenen +fünfzehn Arbeitslasten und die zwei bisher gar nicht erfassten Namespaces. +Danach hat jeder Dienst genau die Ausgänge, die er nachweislich braucht, +jede Ausnahme trägt ihren Grund im Manifest, und dass die Sperre wirkt, ist +aus einem Pod heraus gezeigt statt aus dem Manifest geschlossen. + +**Mockups.** Keine Oberfläche beteiligt. + +> **STOP — Freigabe für Gate 1.** diff --git a/docs/issues/0088-gitops-56-networkpolicy-ausgehender-verkehr-ist-unbesch.md b/docs/issues/0088-gitops-56-networkpolicy-ausgehender-verkehr-ist-unbesch.md index bb74861..da7e1b6 100644 --- a/docs/issues/0088-gitops-56-networkpolicy-ausgehender-verkehr-ist-unbesch.md +++ b/docs/issues/0088-gitops-56-networkpolicy-ausgehender-verkehr-ist-unbesch.md @@ -1,7 +1,7 @@ --- type: issue id: "0088" -status: open +status: in-progress created: 2026-08-06 milestone: M1 priority: medium diff --git a/docs/ledger/2026-08-21-egress-vollstaendig.md b/docs/ledger/2026-08-21-egress-vollstaendig.md new file mode 100644 index 0000000..4e3478a --- /dev/null +++ b/docs/ledger/2026-08-21-egress-vollstaendig.md @@ -0,0 +1,31 @@ +--- +type: ledger +date: 2026-08-21 +size: L +status: open +related: + - "docs/design/2026-08-21-egress-vollstaendig.md" + - "docs/issues/0088-gitops-56-networkpolicy-ausgehender-verkehr-ist-unbesch.md" +--- + +# Ledger: Den ausgehenden Verkehr zu Ende schliessen (#0088) + +## Gates + +| gate | commit | approval | status | note | +|---|---|---|---|---| + +## Ladder + +| searched | found | outcome | commit | +|---|---|---|---| +| `apps/production/networkpolicy.yaml` und die beiden anderen Namespaces, bevor ein Modell entworfen wird | 18 Policies, davon drei Egress; `authentik` und `monitoring` haben je eine eigene Datei mit nur der Metadaten-Sperre | reused: bestehender Stil je Namespace, kein neues Modell und kein Werkzeug | | +| die Bestandsaufnahme aus der Vormessung, statt neu zu zaehlen | 10 eingeschraenkt, 7 laufend offen, 8 Job-artig offen, 2 Namespaces gar nicht erfasst | reused: die Zahlen aus #0088 vom selben Tag, samt Methodik | | + +## Notes + +**Der Zustand ist gemessen, nicht aus den Manifesten gelesen.** Beim +Nachmessen fielen zwei Dinge auf, die in keinem Manifest stehen: `wikijs` +ist unbeschraenkt, waehrend seine Datenbank und seine Gruppenpruefung es +nicht sind, und die Namespaces `authentik` und `monitoring` kamen im Issue +ueberhaupt nicht vor.