From 23a6975a67f98b91edc605da5ea8ec18bc31ef2d Mon Sep 17 00:00:00 2001 From: Micha Date: Tue, 23 Jun 2026 11:03:26 +0200 Subject: [PATCH] Restrict Vaultwarden /admin to trusted networks (Tailscale + LAN) Audit 2026-06-23 (P1): /admin was publicly reachable (200). Add a higher-priority Traefik router scoped to PathPrefix(/admin) with an ipallowlist middleware (Tailnet 100.64.0.0/10 + LAN 192.168.178.0/24); the main router stays native for browser and mobile clients. Documented in docs/DECISIONS.md. Co-Authored-By: Claude Opus 4.8 --- docs/DECISIONS.md | 33 +++++++++++++++++++++++++ security/vaultwarden/docker-compose.yml | 11 +++++++++ 2 files changed, 44 insertions(+) diff --git a/docs/DECISIONS.md b/docs/DECISIONS.md index 7aebdba..b6034b4 100644 --- a/docs/DECISIONS.md +++ b/docs/DECISIONS.md @@ -11,6 +11,39 @@ in `HOMELAB_ARCHITECTURE_MASTER_V2.md` ยง13, `docs/MASTER_TODO.md` (Geparkt), --- +## 2026-06-23 - Vaultwarden /admin nur aus vertrauenswuerdigen Netzen (IP-Allowlist) + +**Entscheidung:** Das Vaultwarden-Admin-Panel `/admin` bekommt einen zweiten, +hoeher priorisierten Traefik-Router `vaultwarden-admin` (Regel Host + +PathPrefix `/admin`, `priority=100`) mit einer Label-definierten +`ipallowlist`-Middleware auf Tailnet `100.64.0.0/10` + LAN `192.168.178.0/24`. +Der Hauptrouter bleibt unveraendert nativ (Browser-Extension, Mobile-Clients, +WebSocket `/notifications/hub`), damit normale Vault-Nutzung von ueberall +funktioniert. Public-Zugriff auf `/admin` liefert kuenftig `403`. + +**Kontext:** Empirischer Audit 2026-06-23 (P1): `/admin` antwortete public mit +`200`, obwohl `SIGNUPS_ALLOWED=false`, `INVITATIONS_ALLOWED=false` und +`ADMIN_TOKEN_FILE` gesetzt sind. Der Admin-Token bleibt damit oeffentlich brute- +und CVE-exponiert. Gleiche Logik wie AdGuard-Admin (Entscheidung 2026-05-26, +Tailscale-only), hier aber pfadbasiert ueber Traefik statt Host-Port-Bind, weil +Vaultwarden nur einen Container-Port hat. Definition als Docker-Label (nicht +File-Provider), damit Komodo die Middleware mitdeployed. + +**Alternativen:** (a) Authelia `two_factor` auf `/admin` โ€” verworfen als +Primaerloesung, weil der Endpunkt dann public erreichbar bliebe; bleibt Fallback, +falls die Quelle-IP ueber den Operator-Zugriffspfad nicht zuverlaessig im +Allowlist-Bereich landet. (b) Reines Tailscale-only ohne LAN โ€” strenger, aber +LAN bewusst als Break-glass behalten (im Bedrohungsmodell vertrauenswuerdig), +um Self-Lockout zu vermeiden. + +**Abhaengigkeit / Review-Trigger:** Wirkt nur, wenn `/admin`-Zugriff mit einer +Quelle aus `100.64.0.0/10` oder `192.168.178.0/24` an Traefik ankommt โ€” vor +finaler Abnahme per Traefik-Access-Log und `curl` aus public + Tailscale/LAN +verifizieren. Review bei Aenderung an Vault-Routing, Tailnet-CIDR oder Umstieg +auf reines Tailscale-only. + +--- + ## 2026-06-16 - Immich ML bekommt dediziertes Egress-Netz (Modell-Download) **Entscheidung:** `immich_machine_learning` haengt zusaetzlich zu `immich_default` diff --git a/security/vaultwarden/docker-compose.yml b/security/vaultwarden/docker-compose.yml index ce26470..7f72bcf 100644 --- a/security/vaultwarden/docker-compose.yml +++ b/security/vaultwarden/docker-compose.yml @@ -52,6 +52,17 @@ services: - traefik.http.routers.vaultwarden.tls=true - traefik.http.routers.vaultwarden.tls.certresolver=le - traefik.http.services.vaultwarden.loadbalancer.server.port=80 + # Audit 2026-06-23 (P1): /admin war public mit 200 erreichbar. Zweiter, hoeher + # priorisierter Router scoped auf /admin und laesst nur Tailnet + LAN durch (sonst 403). + # Hauptrouter oben bleibt nativ, damit Browser-/Mobile-Clients von ueberall funktionieren. + - traefik.http.routers.vaultwarden-admin.rule=Host(`vault.kaleschke.info`) && PathPrefix(`/admin`) + - traefik.http.routers.vaultwarden-admin.entrypoints=websecure + - traefik.http.routers.vaultwarden-admin.tls=true + - traefik.http.routers.vaultwarden-admin.tls.certresolver=le + - traefik.http.routers.vaultwarden-admin.service=vaultwarden + - traefik.http.routers.vaultwarden-admin.priority=100 + - traefik.http.routers.vaultwarden-admin.middlewares=vaultwarden-admin-allowlist@docker + - traefik.http.middlewares.vaultwarden-admin-allowlist.ipallowlist.sourcerange=100.64.0.0/10,192.168.178.0/24 networks: frontend_net: