Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
| Beide Seiten der vorigen RevisionVorhergehende Überarbeitung | |||
| de:int:wvdsshell:notes:01-auth-architecture:auth-gateway [2026/03/05 14:38] – [2. Gateway.Service — Auth-Erweiterungen für WvdS.Shell] Wolfgang van der Stille | de:int:wvdsshell:notes:01-auth-architecture:auth-gateway [Unbekanntes Datum] (aktuell) – gelöscht - Externe Bearbeitung (Unbekanntes Datum) 127.0.0.1 | ||
|---|---|---|---|
| Zeile 1: | Zeile 1: | ||
| - | ====== 3. Gateway.Service — Auth-Erweiterungen für WvdS.Shell ====== | ||
| - | |||
| - | //Stand: 2026-03-05// | ||
| - | |||
| - | Übergeordnet: | ||
| - | Verwandt: [[de: | ||
| - | |||
| - | ===== Ausgangslage ===== | ||
| - | |||
| - | Gateway.Service hat eine vollständige Middleware-Pipeline und ein Auth-Enum mit | ||
| - | allen benötigten Modi — jedoch ist nur ein Teil davon implementiert. | ||
| - | |||
| - | ==== Aktuell implementiert ==== | ||
| - | |||
| - | ^ Auth-Modus | ||
| - | | '' | ||
| - | | '' | ||
| - | | '' | ||
| - | | '' | ||
| - | | '' | ||
| - | | '' | ||
| - | |||
| - | ==== Benötigt für WvdS.Shell ==== | ||
| - | |||
| - | Für die Shell-Integration müssen folgende Komponenten neu implementiert werden: | ||
| - | |||
| - | - **PFX Install-ID Validierung** ('' | ||
| - | - **Kerberos/ | ||
| - | - **JWT Ausstellung und Validierung** ('' | ||
| - | - **TOTP Service** (neu — für externen MFA-Flow) | ||
| - | - **Refresh Token Management** (neu) | ||
| - | - **Feature-Flags Endpoint** (neu — ENIVERSASYS-Anbindung) | ||
| - | |||
| - | ===== Neue Endpoints ===== | ||
| - | |||
| - | Alle neuen Auth-Endpoints unter '' | ||
| - | Ein neuer Controller '' | ||
| - | |||
| - | ==== Übersicht ==== | ||
| - | |||
| - | ^ Verb ^ Route ^ Auth erforderlich | ||
| - | | POST | ''/ | ||
| - | | POST | ''/ | ||
| - | | POST | ''/ | ||
| - | | POST | ''/ | ||
| - | | GET | ''/ | ||
| - | | DELETE | ''/ | ||
| - | | GET | ''/ | ||
| - | |||
| - | ==== POST / | ||
| - | |||
| - | Kerberos Negotiate-Handshake (mehrstufig, | ||
| - | |||
| - | < | ||
| - | Request: | ||
| - | POST / | ||
| - | Authorization: | ||
| - | X-WvdS-Install-Id: | ||
| - | |||
| - | Response (ggf. mehrstufig): | ||
| - | HTTP 401 Authorization: | ||
| - | HTTP 200 { " | ||
| - | </ | ||
| - | |||
| - | ==== POST / | ||
| - | |||
| - | Erster Schritt des externen MFA-Flows. Gibt bei gültigem Username/ | ||
| - | eine '' | ||
| - | |||
| - | <code json> | ||
| - | Request: | ||
| - | { " | ||
| - | |||
| - | Response 200: | ||
| - | { " | ||
| - | |||
| - | Response 401: | ||
| - | { " | ||
| - | </ | ||
| - | |||
| - | Passwort wird nach Validierung sofort via '' | ||
| - | |||
| - | ==== POST / | ||
| - | |||
| - | Zweiter Schritt des externen MFA-Flows. Löst die '' | ||
| - | den TOTP-Code ein und gibt bei Erfolg die Token-Pair aus. | ||
| - | |||
| - | <code json> | ||
| - | Request: | ||
| - | { " | ||
| - | |||
| - | Response 200: | ||
| - | { " | ||
| - | |||
| - | Response 401: | ||
| - | { " | ||
| - | </ | ||
| - | |||
| - | ==== POST / | ||
| - | |||
| - | Silent Token Refresh. Refresh-Token wird im Request-Body oder als | ||
| - | '' | ||
| - | |||
| - | <code json> | ||
| - | Request: | ||
| - | { " | ||
| - | |||
| - | Response 200: | ||
| - | { " | ||
| - | |||
| - | Response 401: | ||
| - | { " | ||
| - | </ | ||
| - | |||
| - | ==== GET / | ||
| - | |||
| - | Lädt die Feature-Flags für den authentifizierten User/die Installation. | ||
| - | Liest aktuell aus ENIVERSCAFM ('' | ||
| - | |||
| - | <code json> | ||
| - | Response 200: | ||
| - | { " | ||
| - | </ | ||
| - | |||
| - | ===== JWT — Ausstellung und Validierung ===== | ||
| - | |||
| - | ==== Signaturalgorithmus ==== | ||
| - | |||
| - | JWT wird mit **ML-DSA-65** signiert — die Bibliothek ist im Gateway bereits | ||
| - | vorhanden ('' | ||
| - | |||
| - | Standard-Header: | ||
| - | |||
| - | ==== Payload-Struktur ==== | ||
| - | |||
| - | <code json> | ||
| - | { | ||
| - | " | ||
| - | " | ||
| - | " | ||
| - | " | ||
| - | " | ||
| - | " | ||
| - | " | ||
| - | } | ||
| - | </ | ||
| - | |||
| - | Feature-Flags werden **nicht** im JWT mitgeführt — sie werden bei Bedarf | ||
| - | frisch vom ''/ | ||
| - | ändern ohne dass ein neues Token ausgestellt werden muss. | ||
| - | |||
| - | ==== Token-Lebensdauer ==== | ||
| - | |||
| - | ^ Token ^ Lebensdauer ^ Speicherort (Client) | ||
| - | | Access Token | 15 Minuten | ||
| - | | Refresh Token | 30 Tage | DPAPI SecretStorage | ||
| - | | TOTP Challenge | 5 Minuten | ||
| - | |||
| - | ==== Validierung in Middleware ==== | ||
| - | |||
| - | '' | ||
| - | extrahiert, ML-DSA-Signatur geprüft, '' | ||
| - | gegen die PFX-Registrierung abgeglichen. | ||
| - | |||
| - | ===== TOTP Service ===== | ||
| - | |||
| - | ==== Zuständigkeit ==== | ||
| - | |||
| - | Die gesamte TOTP-Logik liegt im Gateway — die Shell liefert nur den Code | ||
| - | (6 Ziffern). Details: [[de: | ||
| - | |||
| - | ==== Implementierungsdetails ==== | ||
| - | |||
| - | **Algorithmus: | ||
| - | |||
| - | **Shared Secret Speicherung: | ||
| - | * Pro User ein Base32-kodiertes Secret | ||
| - | * Gespeichert AES-256-GCM-verschlüsselt in der Gateway-Datenbank (CWE-256) | ||
| - | * Kein Plaintext auf Disk | ||
| - | |||
| - | **Validierungsfenster: | ||
| - | |||
| - | **Lockout-Policy: | ||
| - | Nach 5 Fehlversuchen: | ||
| - | |||
| - | **Challenge-Lifetime: | ||
| - | |||
| - | ==== Enrollment Flow ==== | ||
| - | |||
| - | < | ||
| - | Admin-seitig: | ||
| - | GET / | ||
| - | → { " | ||
| - | → Admin zeigt QR dem User (oder schickt URI per E-Mail) | ||
| - | |||
| - | Self-Service (Shell öffnet WebView): | ||
| - | Shell navigiert zu: https:// | ||
| - | → Gateway zeigt HTML-Seite mit QR-Code | ||
| - | → User scannt mit MS Authenticator | ||
| - | → Enrollment-Bestätigung (User gibt ersten Code ein zum Verifizieren) | ||
| - | </ | ||
| - | |||
| - | ===== PFX Install-ID Validierung ===== | ||
| - | |||
| - | Das Gateway prüft bei jedem Auth-Request ob die '' | ||
| - | PFX registriert und aktiv ist. | ||
| - | |||
| - | ==== Header-Konvention ==== | ||
| - | |||
| - | < | ||
| - | X-WvdS-Install-Id: | ||
| - | </ | ||
| - | |||
| - | Dieser Header wird von der Shell bei **jedem** Request mitgesendet — nicht nur beim Auth-Request. | ||
| - | |||
| - | ==== Validierungslogik ==== | ||
| - | |||
| - | < | ||
| - | 1. X-WvdS-Install-Id Header vorhanden? | ||
| - | 2. install_id in Deployment-Tabelle (DB) vorhanden und aktiv? | ||
| - | 3. Zugehöriges Ablaufdatum noch nicht überschritten? | ||
| - | 4. → Validierung OK: weiter mit Auth-Flow | ||
| - | 5. → Validierung FAIL: HTTP 403 " | ||
| - | </ | ||
| - | |||
| - | Eine neue Tabelle (z. B. '' | ||
| - | |||
| - | ^ Spalte | ||
| - | | '' | ||
| - | | '' | ||
| - | | '' | ||
| - | | '' | ||
| - | | '' | ||
| - | | '' | ||
| - | |||
| - | ===== Kerberos/ | ||
| - | |||
| - | ==== Standalone-Modus ==== | ||
| - | |||
| - | Wenn Gateway als Windows Service läuft (nicht hinter IIS/NGINX): | ||
| - | * '' | ||
| - | * HTTP '' | ||
| - | * Nach Erfolg: Identität via '' | ||
| - | * → JWT für diese Identität ausstellen | ||
| - | |||
| - | ==== FastCGI-Modus (hinter IIS) ==== | ||
| - | |||
| - | IIS übernimmt Windows Auth vollständig: | ||
| - | * IIS sendet '' | ||
| - | * Gateway-FastCGI-Adapter ('' | ||
| - | * Kein '' | ||
| - | * Direkt JWT ausstellen | ||
| - | |||
| - | > **Empfehlung: | ||
| - | > Standalone SSPI für Self-hosted Szenarien (kleinere Installationen). | ||
| - | |||
| - | ===== Middleware-Änderungen ===== | ||
| - | |||
| - | ==== Bestehende Pipeline (9 Stufen) ==== | ||
| - | |||
| - | < | ||
| - | 1. TWvdSMetricsMiddleware | ||
| - | 2. TWvdSLoggingMiddleware | ||
| - | 3. TWvdSHttpsEnforcementMiddleware | ||
| - | 4. TWvdSRequestSizeMiddleware | ||
| - | 5. TWvdSRateLimitMiddleware | ||
| - | 6. TWvdSGatewayAuthHandler | ||
| - | 7. TWvdSPayloadEncryptionMiddleware | ||
| - | 8. TWvdSCompressionMiddleware | ||
| - | 9. MapControllers | ||
| - | </ | ||
| - | |||
| - | ==== Geplante Erweiterungen ==== | ||
| - | |||
| - | ^ Stufe ^ Komponente | ||
| - | | 3.5 | '' | ||
| - | | 6 | '' | ||
| - | | 6 | '' | ||
| - | |||
| - | '' | ||
| - | gültige Install-ID wird mit HTTP 403 abgelehnt, bevor Credentials geprüft werden. | ||
| - | |||
| - | ===== Neue Units ===== | ||
| - | |||
| - | < | ||
| - | src/ | ||
| - | controllers/ | ||
| - | WvdS.Data.Gateway.Controller.Auth.pas | ||
| - | core/ | ||
| - | WvdS.Data.Gateway.Auth.JwtService.pas | ||
| - | WvdS.Data.Gateway.Auth.TotpService.pas | ||
| - | WvdS.Data.Gateway.Auth.KerberosHandler.pas | ||
| - | WvdS.Data.Gateway.Auth.CertValidator.pas | ||
| - | WvdS.Data.Gateway.Auth.RefreshStore.pas | ||
| - | middleware/ | ||
| - | WvdS.Data.Gateway.Middleware.InstallId.pas | ||
| - | </ | ||
| - | |||
| - | Alle neuen Units im '' | ||
| - | bestehenden Schichtenstruktur. | ||
| - | |||
| - | ===== Security — CWE-Ergänzungen ===== | ||
| - | |||
| - | Zusätzlich zu den bestehenden 22 CWEs kommen durch die Auth-Erweiterung: | ||
| - | |||
| - | ^ CWE ^ Beschreibung | ||
| - | | CWE-287 | Improper Authentication | ||
| - | | CWE-290 | Token Spoofing | ||
| - | | CWE-613 | Insufficient Session Expiration | Refresh Token: 30 Tage, serverseitig revokierbar | ||
| - | | CWE-620 | Unverified Password Change | ||
| - | | CWE-384 | Session Fixation | ||
| - | |||
| - | ===== Design-Entscheidungen (protokolliert) ===== | ||
| - | |||
| - | ^ Thema ^ Entscheidung | ||
| - | | JWT-Signatur | ||
| - | | TOTP-Crypto | ||
| - | | Kerberos Standalone | ||
| - | | Install-ID Transport | ||
| - | | Feature-Flags | ||
| - | | Refresh Token Storage | ||
| - | | TOTP Enrollment | ||
Zuletzt geändert: den 05.03.2026 um 14:38