4.3 KiB
4.3 KiB
Sicherheitsbericht — Ban Yaro
Erstellt: 01.05.2026 06:07
Übersicht implementierter Schutzmaßnahmen
1. Authentifizierung & Passwörter
- JWT (HS256) mit 30-Tage-Ablauf, HttpOnly + Secure + SameSite=lax Cookie
- Bcrypt-Passwort-Hashing mit automatischem Salt
- Mindestlänge 8 Zeichen, serverseitig erzwungen
- Passwort-Reset: kryptographisches Token, 2 Stunden Ablauf
2. Registrierung
- E-Mail-Verifikation zwingend vor dem ersten Login
- Verifikationslink läuft nach 7 Tagen ab
- Rate Limit: 5 Registrierungen / Stunde / IP
- Username-Blocklist: >200 reservierte und unangemessene Begriffe
- Keine Doppelanmeldung (E-Mail und Username unique)
3. Login-Schutz
- IP-Rate-Limit: 10 Versuche / 5 Minuten
- Email-Rate-Limit: 5 Versuche / 5 Minuten pro E-Mail-Adresse
- Account-Lockout: 5 Fehlversuche → 15 Minuten gesperrt (in-memory)
- Fehlerzähler wird bei erfolgreichem Login zurückgesetzt
- Gleiche Fehlermeldung bei falschem Passwort UND unbekannter E-Mail (kein User-Enumeration)
4. Forum-Schutz
- E-Mail-Verifikation Pflicht zum Posten
- Post-Cooldown: 30 Sekunden zwischen beliebigen Beiträgen
- Stunden-Limit Threads: max. 5 neue Threads / Stunde / User
- Stunden-Limit Antworten: max. 20 Antworten / Stunde / User
- Duplikat-Erkennung: gleicher Text in 5 Minuten → blockiert
- Content-Filter: Spam-Keywords, URL-Sperre für Accounts < 7 Tage, Sonderzeichen-Ratio
- Moderatoren können Threads sperren, Beiträge löschen (Soft-Delete)
- Report-System: User können Beiträge melden
5. HTTP-Security-Headers
| Header | Wert |
|---|---|
Strict-Transport-Security |
max-age=31536000; includeSubDomains |
Content-Security-Policy |
default-src 'self'; frame-ancestors 'none'; … |
X-Content-Type-Options |
nosniff |
Referrer-Policy |
strict-origin-when-cross-origin |
Permissions-Policy |
camera=(), microphone=(), geolocation=(self) |
6. Rate Limiting (alle Endpunkte)
| Endpunkt | Limit | Fenster |
|---|---|---|
| /auth/register | 5 Req | 60 Min |
| /auth/login (IP) | 10 Req | 5 Min |
| /auth/login (Email) | 5 Req | 5 Min |
| /auth/forgot-password | 3 Req | 60 Min |
| /auth/resend-verification | 3 Req | 60 Min / Email |
| /auth/reset-password | 5 Req | 60 Min |
| KI-Features | 10 Req | 60 Min |
| Poison-Reports | 3 Req | 60 Min |
| Wiki-Liste | 60 Req | 60 Sek |
| Wiki-Detail | 30 Req | 60 Sek |
7. Honeypot-Fallen
Folgende Pfade blockieren Scanner-IPs sofort für 24 Stunden:
/api/admin/users /api/v1/users /api/users /api/.env
/api/config /api/setup /api/install /api/phpinfo
/api/debug /api/actuator /api/swagger /api/graphql
/api/wiki/trap
8. Datei-Upload-Sicherheit
- Magic-Byte-Prüfung: JPEG, PNG, GIF, WebP, MP4, WebM
- Path-Traversal-Schutz: alle Pfade bleiben innerhalb
MEDIA_DIR - Größenbeschränkung: 20 MB globales Limit (Middleware)
- Automatische Konvertierung: HEIC→JPEG, MOV/AVI→MP4
- Max. 5 Fotos pro Forum-Thread
9. Admin & Moderation
- Admin-Endpoints per
require_adminDependency geschützt - Moderatoren-Rolle mit eingeschränkten Rechten
- User-Banning mit Sperrgrund, geprüft bei jedem Request
- Outreach-Mailing nur über Admin-Panel, vollständiges Log
Aktuelle Kennzahlen
| Metrik | Wert |
|---|---|
| Gesperrte Accounts | 0 |
| Unverifizierte Accounts | 4 |
| Gesendete Outreach-Mails | 9 |
Bekannte Einschränkungen
- Rate-Limit-Daten und IP-Blocklist sind in-memory → Reset bei Container-Neustart
- Kein CAPTCHA (bewusst: Nutzerfreundlichkeit vs. Bot-Schutz)
- Keine Refresh-Token-Rotation (JWT ist 30 Tage gültig)
- Analytics (Besucher) extern über Umami — kein Zugriff aus dem Container
Empfehlungen für nächste Überprüfung
- Prüfen ob IP-Blocklist-Persistenz via DB sinnvoll wäre
- CSP weiter verschärfen (nonce-basiert statt unsafe-inline)
- Login-Logs in DB schreiben (für Audit-Trail)
- Zwei-Faktor-Authentifizierung für Admin-Accounts evaluieren