From 96d9015867c954f8a7f9922fb3a3451c69305a82 Mon Sep 17 00:00:00 2001 From: Micha Date: Fri, 17 Apr 2026 07:56:29 +0200 Subject: [PATCH] Harden code-server and move Redis password to secret file Harden code-server and move Redis password to secret file --- HOMELAB_ARCHITECTURE_MASTER_V2.md | 20 ++++++++++++++------ README.md | 2 ++ docs/SECRETS_MAP.md | 2 ++ docs/WORKFLOW.md | 22 ++++++++++++++++++++++ infra/redis/docker-compose.yml | 12 +++++++++--- ops/code-server/docker-compose.yml | 1 + 6 files changed, 50 insertions(+), 9 deletions(-) diff --git a/HOMELAB_ARCHITECTURE_MASTER_V2.md b/HOMELAB_ARCHITECTURE_MASTER_V2.md index 45bb86d..908805a 100644 --- a/HOMELAB_ARCHITECTURE_MASTER_V2.md +++ b/HOMELAB_ARCHITECTURE_MASTER_V2.md @@ -60,7 +60,7 @@ Es gibt **keine künstlichen globalen Zusatznetze** wie `admin_net`, `monitoring Postgres, Redis und ähnliche Dienste laufen ausschließlich in `backend_net` oder einem eigenen internen Compose-Netz. ### P4 — Admin-UIs sind nicht öffentlich -Komodo, filebrowser, scrutiny, UptimeKuma, code-server, Traefik-Dashboard, backrest und borg-ui sind standardmäßig **Tailscale-only** oder hinter Traefik **mit zentraler Middleware** abgesichert. +filebrowser, scrutiny, UptimeKuma, code-server, Traefik-Dashboard, backrest und borg-ui sind standardmaessig **Tailscale-only** oder hinter Traefik **mit zentraler Middleware** abgesichert. `Komodo` ist die dokumentierte Ausnahme und bleibt bewusst bei nativer Authentifizierung ohne pauschal vorgeschaltete ForwardAuth-Middleware. ### P5 — Compose-first Alle produktiven Container werden als Compose verwaltet. Bestehende Dockerman-/Ad-hoc-Container werden schrittweise migriert. @@ -100,7 +100,8 @@ traefik (80/443) │ └── frontend_net ├── öffentliche Apps (vaultwarden, mealie, paperless, immich, gitea, ntfy, homepage) - ├── Admin-UIs mit Middleware (komodo, uptime-kuma, filebrowser, scrutiny, code-server, backrest, borg-ui) + ├── Admin-UIs mit Middleware (uptime-kuma, filebrowser, scrutiny, code-server, backrest, borg-ui) + ├── Admin-UI mit nativer Auth (komodo) └── Hybrid-Dienste mit Internetbedarf (mail-archiver, ddns-updater) backend_net (internal: true) @@ -141,7 +142,7 @@ Diese Dienste sind über echte `*.kaleschke.info`-Domains erreichbar: ### 4.2 Nicht öffentlich / nur Tailscale oder Traefik + Middleware Diese Dienste sind **keine Public Apps**: -- `Komodo` — komodo.kaleschke.info (Middleware) +- `Komodo` — komodo.kaleschke.info (Traefik, aber bewusst ohne zentrale Middleware; native Auth bleibt aktiv) - `UptimeKuma` — uptime.kaleschke.info (Middleware) - `filebrowser` — files.kaleschke.info (Middleware) - `scrutiny` — scrutiny.kaleschke.info (Middleware) @@ -158,6 +159,8 @@ Wenn ein Dienst im `frontend_net` hängt, heißt das **nicht automatisch öffent - keine direkten Host-Ports bestehen - Zugriff durch Tailscale bzw. Auth begrenzt ist +`Komodo` ist hiervon die dokumentierte Ausnahme: Traefik ja, aber keine pauschale ForwardAuth-Middleware, damit Webhooks, API und Periphery-Kommunikation nicht versehentlich beeintraechtigt werden. + --- ## 5. Globale Sicherheitsregeln @@ -259,7 +262,7 @@ Legende Status: | Container | Status | Soll-Netz(e) | Finaler Zugang | Finaler Sollzustand | Offene Punkte | |---|---|---|---|---|---| -| `komodo` | ✅ | `frontend_net` | Traefik + Middleware | primärer GitOps-Stack-Manager | — | +| `komodo` | ✅ | `frontend_net` | Traefik, native Auth | primaerer GitOps-Stack-Manager | bewusste Ausnahme: keine pauschale ForwardAuth-Middleware vor UI/API/Webhooks/Periphery | | `code-server` | ✅ | `frontend_net` | Traefik + Middleware | `PASSWORD_FILE` aktiv | — | | `PortainerCE` | ❌ entfernt | - | - | 2026-03-29 abgeschaltet | historisch; nicht mehr deployen | | `filebrowser` | ✅ | `frontend_net` | Traefik + Middleware | aktiv via `files.kaleschke.info` | Mounts einschränken (Block F) | @@ -316,7 +319,7 @@ labels: - traefik.http.services..loadbalancer.server.port= ``` -### Zusatz für Admin-Dienste +### Zusatz fuer Admin-Dienste (Standard) ```yaml - traefik.http.routers..middlewares=dashboard-auth@file,secure-headers@file ``` @@ -327,8 +330,9 @@ labels: - certresolver immer `le` - `tls=true` immer explizit setzen - wenn Traefik aktiv ist, werden direkte Host-Ports entfernt -- Admin-Dienste niemals ohne Middleware veröffentlichen +- Admin-Dienste standardmaessig nicht ohne Middleware veroeffentlichen - **File-Provider nur noch für:** `middlewares.yml`, `tls.yml`, `dashboards.yml` — keine Service-Routen mehr via File-Provider +- dokumentierte Ausnahmen muessen in Abschnitt 10 begruendet werden --- @@ -361,9 +365,11 @@ Für den laufenden Betrieb gilt stattdessen: | `Plex-Media-Server` | `host` | Discovery / mDNS / Plex GDM | | `scrutiny` | `privileged: true` | SMART-Datenzugriff auf Laufwerke | | `Komodo` | Docker-Socket Zugriff | Stack-Deployments benötigen Socket | +| `Komodo` | keine pauschale zentrale Middleware | Webhooks (`/listener`), API und Periphery-WebSocket (`/ws/periphery`) sollen nicht durch vorgeschaltete ForwardAuth gebrochen werden | | `gitea` | SSH-Port 222 direkt gebunden | Git-SSH-Zugang; kein HTTP-Proxy für SSH möglich | | `ddns-updater` | bleibt in `frontend_net` statt `backend_net` | braucht Cloudflare-API-Zugang; `backend_net` ist `internal: true` | | `mail-archiver` | `frontend_net` + `backend_net` | braucht Internetzugang für IMAP-Abruf (GMX, Gmail) und DB-Zugang | +| `traefik/dynamic/*` | manueller Host-Sync trotz GitOps | File-Provider bleibt bewusst fuer `middlewares.yml`, `tls.yml` und `dashboards.yml`; Komodo deployed diese Dateien nicht automatisch | --- @@ -439,6 +445,8 @@ Komodo ist nun der primäre GitOps-Stack-Manager: **Betriebsregel:** Alle Stack-Änderungen laufen über Git; Komodo konsumiert nur den Stand aus Gitea. +**Zugangsregel:** Komodo bleibt bewusst bei nativer Authentifizierung ohne pauschal vorgeschaltete ForwardAuth-Middleware vor dem gesamten Router. Hintergrund sind die gemischten UI-, API-, Webhook- und Periphery-Endpunkte unter derselben Domain. + ### AdGuard Home — Ablösung von Pi-hole (2026-03-28) `binhex-official-pihole` wurde entfernt und durch `AdGuard Home` + `unbound` ersetzt: - AdGuard läuft als Git-Stack (`host-services/Adguard/docker-compose.yml`) diff --git a/README.md b/README.md index daf24f5..0776ecc 100644 --- a/README.md +++ b/README.md @@ -52,6 +52,8 @@ Vor jeder Aenderung lesen: ## Status - Komodo ist der primaere und einzige produktive Stack-Manager. +- Komodo bleibt bewusst bei nativer Authentifizierung; zentrale Traefik-Auth wird dort nicht pauschal vorgeschaltet. - Portainer CE ist abgeschaltet und kein Teil des aktiven Betriebs mehr. - Homepage ist das aktive produktive Frontend / Start-Dashboard. +- Traefik `dynamic/` bleibt eine dokumentierte manuelle Host-Sync-Ausnahme ausserhalb des normalen Komodo-Deployments. - Der verbindliche Detailablauf steht in `docs/WORKFLOW.md`. diff --git a/docs/SECRETS_MAP.md b/docs/SECRETS_MAP.md index 500c24b..306f130 100644 --- a/docs/SECRETS_MAP.md +++ b/docs/SECRETS_MAP.md @@ -17,6 +17,7 @@ Dieses Dokument listet sensible Daten, deren Ablageorte und die vorgesehene Einb |---|---|---|---| | Vaultwarden | ADMIN_TOKEN | `vaultwarden_admin_token.txt` -> `ADMIN_TOKEN_FILE` | aktiv | | PostgreSQL 17 | DB Password | `postgres_password.txt` -> `POSTGRES_PASSWORD_FILE` | aktiv | +| Redis | Passwort | `redis_password.txt` -> Datei-Mount in `infra/redis/docker-compose.yml` | aktiv | | Mealie | DB Password | Stack ENV `${MEALIE_DB_PASSWORD}` | aktiv | | mealie-postgres | DB Password | Stack ENV `${POSTGRES_PASSWORD}` | aktiv | | Paperless-ngx | DB Password | Stack ENV `${PAPERLESS_DBPASS}` | aktiv | @@ -43,6 +44,7 @@ Dieses Dokument listet sensible Daten, deren Ablageorte und die vorgesehene Einb /mnt/user/appdata/secrets/ |-- vaultwarden_admin_token.txt |-- postgres_password.txt +|-- redis_password.txt |-- code_server_password.txt `-- immich_db.txt ``` diff --git a/docs/WORKFLOW.md b/docs/WORKFLOW.md index d180632..48956e1 100644 --- a/docs/WORKFLOW.md +++ b/docs/WORKFLOW.md @@ -112,6 +112,26 @@ Komodo ist in diesem Setup: - Pushes koennen automatisch einen Komodo-Deploy ausloesen - wenn Komodo und Git voneinander abweichen, gewinnt Git +### Ausnahme: Komodo-Zugangsmodell + +Komodo bleibt **bewusst** ohne zentrale Traefik-ForwardAuth-Middleware. + +Grund: + +- Komodo hat eigene Authentifizierung +- Komodo nutzt REST- und WebSocket-Endpunkte +- Webhooks laufen ueber `/listener/...` +- Periphery nutzt den speziellen WebSocket-Pfad `/ws/periphery` + +Deshalb wird Komodo aktuell nur ueber Traefik veroeffentlicht, aber **nicht** pauschal mit `authelia@file` vorgeschaltet. + +**Regel:** Aenderungen an Komodo-Auth, Komodo-Routing oder vorgeschalteter Middleware nur nach expliziter Wirkungspruefung auf: + +- UI-Login +- Gitea-Webhooks +- Periphery-Verbindung +- API-/Automationszugriffe + --- ## Verbotene Arbeitsweise @@ -191,6 +211,8 @@ Manchmal ist ein Live-Hotfix noetig. Das ist erlaubt, aber nur unter diesen Bedi Komodo deployed ausschliesslich `docker-compose.yml`-Dateien. Die Traefik-Konfigurationsdateien unter `traefik/dynamic/` im Git-Repo werden **nicht** automatisch auf den Host uebertragen. +Diese Ausnahme bleibt bewusst bestehen. Der File-Provider wird weiterhin nur fuer zentrale Middlewares, TLS und Dashboard-Konfiguration genutzt, waehrend Service-Routing ueber Docker-Labels laeuft. + ### Betroffene Dateien | Git-Pfad | Host-Pfad (NAS) | diff --git a/infra/redis/docker-compose.yml b/infra/redis/docker-compose.yml index d357f74..8842206 100644 --- a/infra/redis/docker-compose.yml +++ b/infra/redis/docker-compose.yml @@ -3,15 +3,21 @@ services: image: redis:7-alpine container_name: Redis restart: unless-stopped - - command: redis-server --appendonly yes --requirepass kuchen098765 + command: + - sh + - -c + - exec redis-server --appendonly yes --requirepass "$$(cat /run/secrets/redis_password)" volumes: - /mnt/user/appdata/redis:/data + - /mnt/user/appdata/secrets/redis_password.txt:/run/secrets/redis_password:ro networks: - backend_net + security_opt: + - no-new-privileges:true + networks: backend_net: - external: true \ No newline at end of file + external: true diff --git a/ops/code-server/docker-compose.yml b/ops/code-server/docker-compose.yml index 43b5ff9..9f8902f 100644 --- a/ops/code-server/docker-compose.yml +++ b/ops/code-server/docker-compose.yml @@ -31,6 +31,7 @@ services: - traefik.http.routers.code-server.entrypoints=websecure - traefik.http.routers.code-server.tls=true - traefik.http.routers.code-server.tls.certresolver=le + - traefik.http.routers.code-server.middlewares=authelia@file,secure-headers@file - traefik.http.services.code-server.loadbalancer.server.port=8443 networks: