128 lines
4.3 KiB
Markdown
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: HEIC→JPEG, MOV/AVI→MP4
|
|
- 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
|