Reports 2026-05-01 — Quartalsbericht
This commit is contained in:
parent
f3e4a51178
commit
c1bb728153
7 changed files with 746 additions and 0 deletions
128
reports/2026-05-01-sicherheit.md
Normal file
128
reports/2026-05-01-sicherheit.md
Normal file
|
|
@ -0,0 +1,128 @@
|
|||
# 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
|
||||
Loading…
Add table
Add a link
Reference in a new issue