Dokumentiert das gesamte Bypass-Pattern mit Optionen-Vergleich (Service-Account vs. langes JWT vs. ENV-Secret), Härtungsstrategie (prod-compose ignoriert ENV, Audit-Logging, wöchentliche Rotation) und Folgen für ADR 0005 (Keycloak Dev-Bypass). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
4.4 KiB
0012 — DEBUG_AUTH_TOKEN-Bypass für Diagnose-Sessions
| Status | accepted |
| Datum | 2026-05-06 |
| Refs | commit f8cfa42 (Bypass), d853101 (Logging+Rotation), MEMORY/reference_debug_auth_bypass.md |
Kontext
Bei UI-Bugs auf gwoe-dev.toppyr.de brauche ich (oder ein Diagnose-
Tool) Zugriff auf admin-only HTML-Pages und API-Endpoints. Der reguläre
Pfad ist Keycloak-Login mit User-Passwort — funktioniert für den User
selbst, aber nicht für headless Tests, die in CI oder im Background
laufen.
Vor Phase 11b war der einzige Weg: Browser-Console-Output vom User abfragen. Das ist langsam (User muss DevTools öffnen, Screenshot schicken, Kontext erklären) und unsicher (User muss erinnern, wo er geklickt hat).
Optionen
Option A — User-Passwort fest hinterlegen
Service-Account mit festem Passwort, in .env gespeichert. Test-
Skripte loggen sich darüber ein.
- Pro: funktioniert mit echtem Keycloak-Flow.
- Kontra: Service-Account ist ein vollwertiger User in Keycloak, Passwort-Rotation muss synchron mit Keycloak geschehen. Login-Flow ist langsam (3 HTTP-Roundtrips).
Option B — JWT mit langer Laufzeit pre-generieren
Keycloak-Admin-API generiert ein JWT mit z.B. 7 Tagen Laufzeit, in
.env ablegen. Tests senden es als Bearer-Header.
- Pro: kein Login-Flow nötig.
- Kontra: 7 Tage langes JWT widerspricht der Token-Lifecycle- Idee. Bei Leak: Keycloak kennt das Token nicht und kann es nicht invalidieren (außer durch Sessions-Revocation des Users).
Option C — Eigenes ENV-Secret als Bypass-Token
Eine zusätzliche Header-/Query-Pruefung im require_auth-Pfad: wenn
X-Debug-Token (oder ?__debug_token=) dem ENV-Secret entspricht,
wird ein Mock-Admin-User zurückgegeben.
- Pro: kein Keycloak-Roundtrip, einfach rotierbar (ENV-Update + Container-Recreate), inactive bei leerem ENV.
- Kontra: parallele Auth-Pfad neben Keycloak — Risiko bei Audit- Anfragen, ob das System tatsächlich nur über Keycloak authentifiziert.
Entscheidung
Option C umgesetzt mit folgender Härtung:
- ENV-binär:
DEBUG_AUTH_TOKEN=(leer) → Bypass komplett aus. Default indocker-compose.dev.ymlist${DEBUG_AUTH_TOKEN:-}→ wenn nicht in.env, kein Bypass. - Nur dev-compose reicht die ENV durch. Prod-
docker-compose.ymlreferenziert sie nicht, der Container sieht sie nicht — selbst wenn jemand sie auf vserver setzt. - Mock-User-Rollen:
["admin", "gwoe-admin"]— keine echten Keycloak-Rollen, sodass z.B.audit_logzwischen Bypass und regulärem Login unterscheiden kann (sub=debug-uservs. echte UUID). - Audit-Logging: jeder Use schreibt in
auth_bypass_uses(used_at,client_ip,path,user_agent) pluslogger.warning. Best-Effort, schlägt unter keinen Umständen den Request fehl. - Rotation:
scripts/rotate-debug-token.shläuft wöchentlich (Sonntag 04:00 Cron) und generiert ein neuessecrets.token_urlsafe(32)in.envmitdocker compose up -d --force-recreate. - Manuelle Rotation ist trivial:
NEW=$(python3 -c "import secrets; print(secrets.token_urlsafe(32))") ssh vserver "sed -i 's|^DEBUG_AUTH_TOKEN=.*|DEBUG_AUTH_TOKEN='$NEW'|' /opt/gwoe-antragspruefer-dev/.env"
Konsequenzen
Positiv
- Headless Smoketests (siehe
tests/e2e/test_smoke_browser.py) laufen ohne Keycloak-Setup. 9 Tests in 52 s gegen Live-System. - Diagnose-Sessions (Playwright + Console-Hook) sind möglich, ohne User-Passwort zu kennen oder zu erfragen.
- Bei Audit-Anfragen:
auth_bypass_uses-Tabelle liefert vollständige Use-Historie mit IP+Path.
Negativ
- Parallele Auth-Pfad. Wenn das ENV-Secret leakt, hat der Angreifer Admin-Zugang zu dev. Mitigation: nur dev, Rotation, Logging.
- Bypass-User hat keine echte Identität — manche Endpoints wie
Mail-Versand würden mit
email="debug@local"arbeiten. Keine echten Mails an reale Empfänger möglich (Tabu-Regel), aber defensives Coding nötig.
Folgen für andere ADRs
- 0005 Keycloak SSO mit Dev-Bypass-Fallback: das war der „kein-Keycloak-konfiguriert"-Bypass. ADR 0012 ergänzt einen zweiten Bypass für konfiguriertes Keycloak — beide sind orthogonal und nicht konkurrierend.
- Folge-Issue: wenn prod-Diagnose nötig wird, könnte ein separater prod-Bypass mit eigener Kontrollebene (z.B. HMAC-signierte Tokens, IP-Whitelist) sinnvoll sein.