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:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user