Files
sshkeyvault/docs/issues/004-anmeldung-rollen.md
T
florian.wildeandClaude Opus 5.5 d1ba822a4a feat(auth): Anmeldeseiten, TOTP-Einrichtung und Bestaetigung (#004)
Anmeldung, Einrichtung des zweiten Faktors fuer den Notfall-Admin,
erneute Bestaetigung vor kritischen Aktionen und die Seite fuer
fehlende Rechte. Die Huelle zeigt jetzt den echten Benutzer, und jede
Seite prueft die Sitzung selbst; ein struktureller Test haelt das fest.

Die Ablaeufe sind im gebauten Stand gegen den Mock-OIDC geprueft
(pnpm test:e2e): Admin, Konto ohne Gruppe, Notfall-Admin mit TOTP.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-12 09:28:51 +02:00

38 lines
2.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# #004 Anmeldung, Rollen und erneute Bestätigung
**Status:** erledigt
**Meilenstein:** v0.1.0
**Labels:** sicherheit
**Geschätzt:** 5 h **Tatsächlich:** 0 h 45 min
## Ziel
Anmeldung per OIDC (authentik, in der Entwicklung Mock-Anbieter) und lokaler Notfall-Admin mit Passwort + TOTP. Rollen Admin/Operator/Leser, Re-Auth für kritische Aktionen.
## Aufgaben
- [x] Sitzungs-Cookie (`jose`), OIDC mit PKCE (`openid-client`)
- [x] Rollen aus authentik-Gruppen, bei jeder Anmeldung neu
- [x] Notfall-Admin: argon2id + TOTP (Pflicht), Einrichtung beim ersten Login
- [x] Re-Auth: OIDC `prompt=login`/`max_age=0` + `auth_time`, Notfall-Admin Passwort + TOTP; Gültigkeit 5 min
- [x] Rechtetabelle `darf()`, jede Seite/Route prüft selbst; struktureller Test
- [x] Rate-Limit für Anmeldung und Re-Auth
- [x] Mock-OIDC-Anbieter in `docker-compose.dev.yml`
- [x] Proxy mit CSP-Nonce und Sicherheits-Kopfzeilen
## Akzeptanzkriterien
- [x] Ohne Anmeldung keine Seite erreichbar
- [x] Operator sieht keine Private-Key-Funktionen
- [x] Re-Auth älter als 5 min wird abgelehnt
## Abhängigkeiten
#003
## Notizen / Entscheidungen
- **Kein Auth.js**, sondern Sitzung (`jose`) und OIDC (`openid-client`) aus Laufzettel übernommen und angepasst.
- **Ohne sshkv-Gruppe kein Zugang** – auch kein Lesezugriff (Abweichung von Laufzettel, das LESER vergibt).
- **TOTP selbst implementiert** (RFC 6238, Testvektoren aus Anhang B); jeder Code gilt einmal (`totpLetzterSchritt`).
- **TOTP-Einrichtung:** Das Geheimnis lebt bis zur Bestätigung nur in einem signierten httpOnly-Cookie (Pfad `/anmelden`, 10 min); gespeichert wird es erst nach passendem Code, verschlüsselt mit `SSHKV_APP_SECRET`.
- **Re-Auth bei OIDC:** `prompt=login`, `max_age=0`, Prüfung von `auth_time` gegen den Startzeitpunkt (30 s Toleranz). Gültigkeit 5 min, gespeichert in `Benutzer.bestaetigtAm` – serverseitig, nicht im Cookie.
- **Sitzungsdauer 8 h** statt 12 h.
- **Mock-OIDC über http** nur mit `SSHKV_OIDC_HTTP_ERLAUBT=1` (openid-client verweigert http zu Recht).
- Struktureller Test `tests/zugang.test.ts`: jede `page.tsx`/`route.ts` prüft selbst oder steht namentlich in den Ausnahmen.
- E2E (`pnpm test:e2e`, gebauter Stand): OIDC-Admin, OIDC ohne Gruppe, Notfall-Admin mit TOTP-Einrichtung und Re-Auth – 4/4 grün.