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 <noreply@anthropic.com>
This commit is contained in:
@@ -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`
|
||||
|
||||
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user