Files
sshkeyvault/docs/issues/004-anmeldung-rollen.md
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

2.2 KiB
Raw Permalink Blame History

#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

  • Sitzungs-Cookie (jose), OIDC mit PKCE (openid-client)
  • Rollen aus authentik-Gruppen, bei jeder Anmeldung neu
  • Notfall-Admin: argon2id + TOTP (Pflicht), Einrichtung beim ersten Login
  • Re-Auth: OIDC prompt=login/max_age=0 + auth_time, Notfall-Admin Passwort + TOTP; Gültigkeit 5 min
  • Rechtetabelle darf(), jede Seite/Route prüft selbst; struktureller Test
  • Rate-Limit für Anmeldung und Re-Auth
  • Mock-OIDC-Anbieter in docker-compose.dev.yml
  • Proxy mit CSP-Nonce und Sicherheits-Kopfzeilen

Akzeptanzkriterien

  • Ohne Anmeldung keine Seite erreichbar
  • Operator sieht keine Private-Key-Funktionen
  • 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.