Admin-Rescue: PW-Reset direkt in DB + Rate-Limit-Reset
Use Case: Admin sperrt sich aus (admin@admin.com ist keine echte Mailadresse, Passwort-vergessen-Flow kann keine Mail liefern) oder Brute-Force-Lockout will sich nicht von selbst auflösen. backend/prisma/reset-admin-password.ts: - Findet User per Email, hasht neues PW mit bcrypt cost 12 - Schreibt direkt in user.password, setzt tokenInvalidatedAt=now() (kickt alle bestehenden Sessions), löscht Reset-Tokens - Eigenes PW: Komplexitäts-Check 25 Zeichen - Kein PW-Argument: 28-char Zufallspasswort (alle 4 Klassen garantiert), wird einmal in stdout ausgegeben scripts/admin-rescue.sh: - password <email> [pw] → docker exec npx tsx … reset-admin-password - unlock → docker restart opencrm-app (leert In-Memory-Rate-Limit-Store) - all <email> [pw] → beides Live-verifiziert: random-Modus, schwaches PW → klare Fehlerliste, langes eigenes PW → akzeptiert, unbekannter User → exit 2, bash -n syntax-check ok. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -97,6 +97,27 @@ isolierte Instanz (keine Multi-Tenancy im Code), Provisioning + Abrechnung
|
||||
|
||||
## ✅ Erledigt
|
||||
|
||||
- [x] **🛟 Admin-Rescue-Script (PW-Reset direkt in DB + Rate-Limit-Reset)**
|
||||
- Use Case: Admin sperrt sich aus (z.B. `admin@admin.com` ist
|
||||
keine echte E-Mail → Passwort-vergessen-Flow kann keine Mail
|
||||
senden) oder Brute-Force-Lockout will sich nicht auflösen.
|
||||
- **Node-Script** `backend/prisma/reset-admin-password.ts`:
|
||||
findet User per Email, hasht PW mit bcrypt cost 12, schreibt
|
||||
direkt in `user.password`, setzt `tokenInvalidatedAt = now()`
|
||||
(kickt alle bestehenden Sessions), löscht ggf. anhängende
|
||||
Reset-Tokens. Mit oder ohne PW-Argument (random 28-char wenn
|
||||
leer), Komplexitäts-Check 25 Zeichen für eigene PWs.
|
||||
- **Bash-Wrapper** `scripts/admin-rescue.sh`:
|
||||
* `password <email> [pw]` – PW-Reset im laufenden Container
|
||||
via `docker exec opencrm-app npx tsx prisma/reset-admin-…`
|
||||
* `unlock` – Container-Restart leert den In-Memory-Rate-Limit-
|
||||
Store komplett (alle IPs frei)
|
||||
* `all <email> [pw]` – beides
|
||||
- **Live-verifiziert**: random-Modus liefert 28-char PW, schwaches
|
||||
eigenes PW wird mit allen Defizit-Punkten abgelehnt, langes
|
||||
eigenes PW akzeptiert, unbekannter User → klarer Fehler,
|
||||
bash-Syntax-Check ok.
|
||||
|
||||
- [x] **🔐 Mitarbeiter-Passwörter auf 25 Zeichen (BSI-Empfehlung)**
|
||||
- 12 Zeichen sind heute der untere akzeptable Rand. NIST/OWASP/BSI
|
||||
empfehlen 14-25+ Zeichen. Mitarbeiter/Admin nutzen Passwort-Manager
|
||||
|
||||
Reference in New Issue
Block a user