banyaro/reports/2026-05-01-sicherheit.md

128 lines
4.3 KiB
Markdown

# 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: HEICJPEG, MOV/AVIMP4
- Max. 5 Fotos pro Forum-Thread
### 9. Admin & Moderation
- Admin-Endpoints per `require_admin` Dependency 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