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

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_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