diff --git a/docs/AUTH_MATRIX.md b/docs/AUTH_MATRIX.md index 0539b22..c0e3be5 100644 --- a/docs/AUTH_MATRIX.md +++ b/docs/AUTH_MATRIX.md @@ -40,7 +40,7 @@ buendelt das an **einem** Ort und **verlinkt** auf die Quellen statt zu kopieren | `vault.kaleschke.info/admin` | **IP-Allowlist** (Tailnet `100.64.0.0/10` + LAN `192.168.178.0/24`), sonst 403 | Traefik `ipallowlist` (Label) | DECISIONS 2026-06-23 (Audit-P1) | | `files.kaleschke.info`, `scrutiny.kaleschke.info` | **two_factor** (explizit) | `authelia@file` | `configuration.yml`; scrutiny zusaetzlich privileged | | uebrige `*.kaleschke.info` mit Middleware (monitoring/grafana, glances, glance, speedtest, bentopdf, mail-archiver, paperless-gpt, hermes, super-productivity, borg-ui, code-server) | **two_factor** (Catch-all) | `authelia@file` Catch-all | `configuration.yml`; Haertung 2026-06-06 | -| `komodo.kaleschke.info` | **Keine Authelia** (native) | bewusste Ausnahme, keine ForwardAuth (Webhooks/`/ws/periphery`) | DECISIONS 2026-04; **Audit-P1: public + RW-Docker-Socket → Tailscale-only geplant (Task #5)** | +| `komodo.kaleschke.info` | **IP-Allowlist** (Tailnet + LAN), sonst 403; native (keine Authelia) | Traefik `ipallowlist` (Label) + native Komodo-Auth | DECISIONS 2026-06-23; Webhooks/Periphery laufen intern, nicht ueber Traefik | | `nextcloud` | Keine Authelia (native) | WebDAV/CardDAV/Client-Flows | DECISIONS 2026-04 / Ausnahmen-Tabelle | | `n8n.kaleschke.info` | Keine pauschale Authelia (native) | Webhook-Endpunkte `/webhook/*` | Ausnahmen-Tabelle; ⚠ Middleware-Abweichung lt. policy-check | | `plex.kaleschke.info` | Keine Authelia (native Plex) | File-Provider-Route; WAN-Port 32400 + Remote Access aus | DECISIONS 2026-05-28 | @@ -50,9 +50,9 @@ buendelt das an **einem** Ort und **verlinkt** auf die Quellen statt zu kopieren ## Review-Gaps (Audit 2026-06-23) -- **Komodo** ist die kritischste offene Position: public erreichbar + RW-Docker- - Socket. Plan: Tailscale-only (Task #5), interner Gitea→Komodo-Webhook bereits - als erreichbar bestaetigt (Task #4). +- **Komodo**: beschlossen IP-Allowlist (Tailnet + LAN) statt public (DECISIONS + 2026-06-23). Self-Stack ist inline in Komodo verwaltet → Labels via Komodo-UI + setzen (Task #6), dann verifizieren (#7). - **Bypass-Liste bewusst ohne 2FA**: Bei App-CVE oder Account-Kompromiss greift davor kein Authelia. Akzeptiert fuer Public-Apps mit eigenen Clients; Review- Trigger = neue sensible App in der Liste oder veraendertes Risikoprofil. diff --git a/docs/DECISIONS.md b/docs/DECISIONS.md index b6034b4..067ed3f 100644 --- a/docs/DECISIONS.md +++ b/docs/DECISIONS.md @@ -11,6 +11,38 @@ in `HOMELAB_ARCHITECTURE_MASTER_V2.md` §13, `docs/MASTER_TODO.md` (Geparkt), --- +## 2026-06-23 - Komodo nur aus vertrauenswuerdigen Netzen (IP-Allowlist statt public) + +**Entscheidung:** Der Komodo-Router (`komodo.kaleschke.info`) bekommt eine +Label-definierte `ipallowlist`-Middleware auf Tailnet `100.64.0.0/10` + LAN +`192.168.178.0/24`; public-Zugriff liefert kuenftig `403`. KEINE ForwardAuth +(die bewusste Komodo-Ausnahme bleibt), `KOMODO_HOST` bleibt +`https://komodo.kaleschke.info`. Der GANZE Router wird begrenzt, kein +pfadbasierter Public-Bypass. + +**Kontext:** Audit 2026-06-23 (P1): Komodo war public mit `200` erreichbar und +koppelt ueber den RW-Docker-Socket der Periphery an Host-root-aehnliche Macht +(Core -> Periphery -> `docker.sock` -> jeder Container/Datenpfad). Read-only +gemessen: Gitea→Komodo-Webhooks (`/listener`) und Periphery (`/ws/periphery`) +laufen INTERN ueber `komodo-core:9120`, NICHT ueber Traefik. Der public Router +hat damit keine legitimen externen Consumer; eine Allowlist auf dem ganzen Router +schliesst die Public-Flaeche, ohne Automation zu brechen. + +**Umsetzung / Ausnahme:** Der Komodo-Self-Stack ist inline in Komodo verwaltet +(`repo=""`, `files_on_host=false`, `webhook_enabled=false`, vgl. 2026-05-04), +KEIN GitOps-Push-Stack. Die Labels werden in der Komodo-UI am Inline-Compose +gesetzt; `ops/komodo/docker-compose.yml` ist nur Spiegel/Doku und wird zur +Paritaet nachgezogen. + +**Alternativen:** Reines Tailscale-only (Route + public DNS-Record raus, +`KOMODO_HOST` auf Tailscale-Host) — strenger (kein 403-Endpunkt, keine +Hostname-Disclosure), aber mehr Aufwand und geaenderter Operator-Zugriff; +verworfen zugunsten des bewaehrten, minimalen Allowlist-Musters (analog Vault +/admin). **Review-Trigger:** Wunsch nach vollstaendiger Unsichtbarkeit von aussen +oder Aenderung am Komodo-Zugriffspfad. + +--- + ## 2026-06-23 - Vaultwarden /admin nur aus vertrauenswuerdigen Netzen (IP-Allowlist) **Entscheidung:** Das Vaultwarden-Admin-Panel `/admin` bekommt einen zweiten, diff --git a/ops/komodo/docker-compose.yml b/ops/komodo/docker-compose.yml index a287ac4..4d5ad89 100644 --- a/ops/komodo/docker-compose.yml +++ b/ops/komodo/docker-compose.yml @@ -74,7 +74,14 @@ services: - traefik.http.routers.komodo.tls=true - traefik.http.routers.komodo.tls.certresolver=le - traefik.http.services.komodo.loadbalancer.server.port=9120 - + # Audit 2026-06-23 (P1): Komodo war public mit 200 erreichbar + RW-Docker-Socket-Kette. + # IP-Allowlist begrenzt den GANZEN Router auf Tailnet + LAN (public -> 403). KEINE ForwardAuth + # (Webhooks/Periphery laufen intern ueber komodo-core:9120, nicht ueber Traefik). + # ACHTUNG: Self-Stack ist inline in Komodo verwaltet -> diese Labels muessen in der Komodo-UI + # am Inline-Compose gesetzt werden; diese Datei ist nur Spiegel. + - traefik.http.routers.komodo.middlewares=komodo-allowlist@docker + - traefik.http.middlewares.komodo-allowlist.ipallowlist.sourcerange=100.64.0.0/10,192.168.178.0/24 + security_opt: - no-new-privileges:true