Rate-Limit-Sperren: Admin-UI zum Freigeben

Bei zu vielen Login-Fehlversuchen war ohne Container-Restart kein Weg
zurück. Jetzt sehen Admins die aktiven Sperren und können einzeln
freigeben.

Backend:
- GET  /api/settings/rate-limits/active (settings:read)
  Liest SecurityEvent RATE_LIMIT_HIT der letzten 15 Min, gruppiert nach
  IP, liefert lastEmail/limiters/hitCount/lastHit.
- POST /api/settings/rate-limits/reset (settings:update)
  Body { ipAddress } → ruft loginRateLimiter.resetKey + passwordReset-
  RateLimiter.resetKey auf (express-rate-limit v7), audited als
  UPDATE auf resourceType=RateLimit.

Frontend:
- Neue Seite /settings/rate-limits: Tabelle mit IP/Email/Limiter/Hits/
  Letzter-Hit/Aktion. Auto-Refresh alle 15s. Freigeben-Button pro IP.
- Kachel in Settings-Übersicht (orange, ShieldOff-Icon, settings:read).

Live-verifiziert: 11 failed Logins → 429 ab dem 11.; Liste zeigt
IP + Email; POST /reset → 200; danach wieder 401 statt 429; Audit-Log
„Rate-Limit für IP 127.0.0.1 manuell freigegeben" angelegt.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-05-17 01:20:43 +02:00
parent 69b9a35674
commit 956bc394b8
7 changed files with 338 additions and 1 deletions
+24
View File
@@ -97,6 +97,30 @@ isolierte Instanz (keine Multi-Tenancy im Code), Provisioning + Abrechnung
## ✅ Erledigt
- [x] **🛠 Rate-Limit-Sperren: Admin-UI zum Freigeben**
- Bei einer Pentest-Runde hat der Tester sich selbst durch zu viele
Login-Versuche ausgesperrt → ohne Container-Restart kein Weg zurück.
Jetzt: Admin sieht die Sperren und kann sie einzeln aufheben.
- **Datenquelle für die Liste**: `SecurityEvent`-Tabelle filtert nach
`type = RATE_LIMIT_HIT` im 15-Min-Fenster (= Login-Window), gruppiert
nach IP. Pro Eintrag: IP, zuletzt versuchte E-Mail, Limiter-Typ
(Login / Passwort-Reset), Hit-Anzahl, Zeit seit letztem Hit.
- **Reset**: ruft `loginRateLimiter.resetKey(ip)` und
`passwordResetRateLimiter.resetKey(ip)` auf exposiert von
`express-rate-limit` v7. Idempotent, audited.
- **Backend**:
* `GET /api/settings/rate-limits/active` (`settings:read`)
* `POST /api/settings/rate-limits/reset` (`settings:update`) mit
Body `{ ipAddress }`
* neuer Controller `rateLimitAdmin.controller.ts`
- **Frontend**: neue Seite `/settings/rate-limits` mit Tabelle +
Freigeben-Button, 15s Auto-Refresh; Kachel in Settings-Übersicht
(orange, neben „Sicherheits-Monitoring").
- **Live-verifiziert (4 Schritte)**: 11 falsche Logins von
127.0.0.1 → 11. → 429; Liste zeigt IP + Email + Hits;
POST Reset → 200; nächster Login mit falschem PW → 401 statt
429 (Sperre weg); Audit-Log enthält Eintrag.
- [x] **🚨 Pentest Runde 7 Hit-List durchgegangen + kurzlebige Download-Tokens**
- **Credential-Endpoints** (Contracts password/internet/sip/simcard +
Stressfrei mailbox/send/reset-password): ALLE bereits durch