Files
harheimertc/DATENSCHUTZ_UEBERSICHT.md

16 KiB

Übersicht: Verschlüsselung personenbezogener Daten & Security-Informationen

📋 Inhaltsverzeichnis

  1. Verschlüsselte Daten
  2. Verschlüsselungstechnologie
  3. Authentifizierung & Autorisierung
  4. API-Endpunkte & Zugriffsschutz
  5. Rollen & Berechtigungen
  6. Session-Management
  7. Umgebungsvariablen
  8. Dateisystem-Struktur
  9. Externe Dependencies
  10. Sicherheitsrichtlinien

Verschlüsselte Daten

Kritische Dateien mit personenbezogenen Daten:

  1. users.json - Benutzerdaten

    • E-Mail-Adressen
    • Namen
    • Passwort-Hashes (bcrypt)
    • Rollen (Array)
    • Telefonnummern
    • Aktivierungsstatus
  2. members.json - Mitgliederdaten

    • Namen
    • E-Mail-Adressen
    • Telefonnummern
    • Adressen
    • Geburtsdaten
    • Notizen
  3. newsletter-posts.json - Newsletter-Posts

    • Empfängerlisten (E-Mail-Adressen)
    • Post-Inhalte
    • Metadaten
  4. newsletter-subscribers.json - Newsletter-Abonnenten

    • E-Mail-Adressen
    • Namen
    • Bestätigungsstatus
    • Abonnement-Gruppen
    • Tokens (Bestätigung, Abmeldung)
  5. sessions.json - Session-Tokens

    • User-IDs
    • JWT-Tokens
    • Erstellungs- und Ablaufzeiten
  6. membership-applications/*.json - Mitgliedschaftsanträge

    • Vollständige Antragsdaten (verschlüsselt als encryptedData)
    • Persönliche Informationen
    • Kontaktdaten

⚠️ Enthält personenbezogene Daten, aber weniger kritisch:

  1. config.json - Konfigurationsdatei
    • E-Mail-Adressen von Vorstand und Website-Verantwortlichem
    • Diese sind öffentliche Kontaktdaten, die auf der Website angezeigt werden
    • Könnte optional verschlüsselt werden, ist aber nicht kritisch

Keine personenbezogenen Daten:

  • news.json - Nur Autor-Name, keine E-Mail
  • newsletter-groups.json - Nur Metadaten (Gruppenname, Typ, etc.)
  • galerie-metadata.json - Keine personenbezogenen Daten
  • termine.json - Nur öffentliche Termine
  • mannschaften.csv - Öffentliche Mannschaftsinformationen

🔐 Verschlüsselungstechnologie

Algorithmus & Konfiguration:

  • Algorithmus: AES-256-CBC
  • Schlüsselableitung: PBKDF2 mit SHA-512
  • Iterationen: 100.000 Runden
  • Salt-Länge: 32 Bytes (zufällig pro Verschlüsselung)
  • IV-Länge: 16 Bytes (zufällig pro Verschlüsselung)
  • Format: Base64-kodiert (Salt + IV + verschlüsselter Text)

Verschlüsselungsschlüssel:

  • Umgebungsvariable: ENCRYPTION_KEY
  • Standardwert (Development): local_development_encryption_key_change_in_production
  • ⚠️ WICHTIG: Muss in Produktion geändert werden!
  • Speicherort: .env Datei (nicht in Git)

Verschlüsselungsfunktionen:

  • encrypt(text, password) - Verschlüsselt einen Text
  • decrypt(encryptedData, password) - Entschlüsselt einen Text
  • encryptObject(obj, password) - Verschlüsselt ein JSON-Objekt
  • decryptObject(encryptedData, password) - Entschlüsselt ein JSON-Objekt

Datei: server/utils/encryption.js


🔑 Authentifizierung & Autorisierung

Passwort-Hashing:

  • Algorithmus: bcrypt
  • Rounds: 10
  • Bibliothek: bcryptjs v2.4.3

JWT-Tokens:

  • Bibliothek: jsonwebtoken v9.0.2
  • Algorithmus: HS256 (HMAC SHA-256)
  • Secret: JWT_SECRET aus Umgebungsvariablen
  • Standardwert (Development): harheimertc-secret-key-change-in-production
  • Gültigkeitsdauer: 7 Tage
  • Payload: { id, email, roles }
  • Name: auth_token
  • HttpOnly: true (verhindert JavaScript-Zugriff)
  • Secure: false (in Production sollte dies true sein, wenn HTTPS verwendet wird)
  • SameSite: lax
  • MaxAge: 7 Tage (604.800 Sekunden)

Authentifizierungs-Endpunkte:

  • POST /api/auth/login - Login mit E-Mail/Passwort
  • POST /api/auth/logout - Logout (löscht Session)
  • POST /api/auth/register - Registrierung (erfordert Admin-Freischaltung)
  • POST /api/auth/reset-password - Passwort-Reset
  • GET /api/auth/status - Prüft aktuellen Auth-Status

🛡️ API-Endpunkte & Zugriffsschutz

Geschützte Routen:

  • /mitgliederbereich/* - Erfordert Authentifizierung
  • /cms/* - Erfordert Authentifizierung + spezifische Rollen

Middleware:

Datei: middleware/auth.js

  • Prüft Authentifizierung für geschützte Routen
  • Rollenbasierte Zugriffskontrolle für CMS-Bereich
  • Redirect zu /login bei fehlender Authentifizierung

API-Endpunkt-Kategorien:

Öffentliche Endpunkte (keine Authentifizierung):

  • GET /api/news-public - Öffentliche News
  • GET /api/termine - Öffentliche Termine
  • GET /api/spielplaene - Spielpläne
  • GET /api/galerie/list - Galerie-Liste (mit Zugriffskontrolle)
  • GET /api/galerie/[id] - Einzelbild (mit Zugriffskontrolle)
  • POST /api/newsletter/subscribe - Newsletter-Anmeldung
  • GET /api/newsletter/confirm - Newsletter-Bestätigung
  • GET /api/newsletter/unsubscribe - Newsletter-Abmeldung
  • POST /api/newsletter/unsubscribe-by-email - Abmeldung per E-Mail
  • GET /api/newsletter/groups/public-list - Öffentliche Newsletter-Gruppen
  • GET /api/newsletter/check-subscription - Prüft Abonnement-Status
  • POST /api/contact - Kontaktformular

Authentifizierte Endpunkte (erfordern Login):

Mitgliederbereich:

  • GET /api/members - Mitgliederliste (mit Rollenprüfung)
  • GET /api/profile - Eigenes Profil
  • PUT /api/profile - Profil bearbeiten
  • GET /api/news - Interne News
  • POST /api/news - News erstellen (admin/vorstand)
  • DELETE /api/news - News löschen (admin/vorstand)

CMS-Endpunkte (admin/vorstand):

  • GET /api/cms/users/list - Benutzerliste
  • POST /api/cms/users/approve - Benutzer freischalten
  • POST /api/cms/users/update-role - Rolle ändern
  • POST /api/cms/users/deactivate - Benutzer deaktivieren
  • POST /api/cms/users/reject - Registrierung ablehnen
  • PUT /api/config - Konfiguration bearbeiten
  • POST /api/cms/save-csv - CSV speichern
  • POST /api/cms/upload-spielplan-pdf - Spielplan hochladen
  • POST /api/cms/satzung-upload - Satzung hochladen
  • POST /api/members - Mitglied hinzufügen/bearbeiten
  • DELETE /api/members - Mitglied löschen
  • POST /api/members/bulk - Bulk-Import
  • POST /api/personen/upload - Personenbild hochladen
  • POST /api/galerie/upload - Galeriebild hochladen
  • DELETE /api/galerie/[id] - Galeriebild löschen
  • POST /api/termine-manage - Termin erstellen/bearbeiten
  • DELETE /api/termine-manage - Termin löschen
  • GET /api/termine-manage - Termine verwalten
  • GET /api/membership/applications - Mitgliedschaftsanträge
  • POST /api/membership/generate-pdf - PDF generieren
  • GET /api/membership/download/[id] - PDF herunterladen
  • PUT /api/membership/update-status - Status aktualisieren

Newsletter-Endpunkte (admin/vorstand/newsletter):

  • GET /api/newsletter/groups/list - Newsletter-Gruppen auflisten
  • POST /api/newsletter/groups/create - Gruppe erstellen
  • GET /api/newsletter/groups/[id]/posts/list - Posts auflisten
  • POST /api/newsletter/groups/[id]/posts/create - Post erstellen und versenden
  • GET /api/newsletter/groups/[id]/subscribers/list - Abonnenten auflisten
  • POST /api/newsletter/groups/[id]/subscribers/add - Abonnent hinzufügen
  • POST /api/newsletter/groups/[id]/subscribers/remove - Abonnent entfernen

Zugriffskontrolle:

  • Helper-Funktionen: hasRole(), hasAnyRole(), hasAllRoles() in server/utils/auth.js
  • Token-Validierung: getUserFromToken() prüft JWT und lädt Benutzer
  • Rollenprüfung: Alle geschützten Endpunkte prüfen Rollen vor Ausführung

👥 Rollen & Berechtigungen

Verfügbare Rollen:

  1. mitglied (Standard)

    • Zugriff auf Mitgliederbereich
    • Eigene Profilansicht und -bearbeitung
    • Mitgliederliste (ohne Kontaktdaten)
    • Interne News lesen
  2. vorstand

    • Alle Mitglieder-Berechtigungen
    • Zugriff auf Kontaktdaten in Mitgliederliste
    • CMS-Zugriff (außer Benutzerverwaltung)
    • News erstellen/bearbeiten/löschen
    • Mitglieder verwalten
    • Termine verwalten
    • Galerie verwalten
    • Newsletter verwalten
  3. admin

    • Alle Vorstand-Berechtigungen
    • Benutzerverwaltung
    • Rollenverwaltung
    • Konfiguration ändern
    • Mitgliedschaftsanträge verwalten
  4. newsletter

    • Newsletter-Verwaltung (Gruppen, Posts, Abonnenten)
    • Kein Zugriff auf andere CMS-Funktionen
    • Kein Zugriff auf Mitgliederbereich (außer über Newsletter-Seite)

Rollensystem:

  • Multi-Rollen-Support: Benutzer können mehrere Rollen haben
  • Datenstruktur: roles: string[] (Array von Rollen)
  • Migration: Alte role: string wird automatisch zu roles: [role] migriert
  • Rollenprüfung: hasAnyRole(user, 'admin', 'vorstand') prüft, ob Benutzer eine der Rollen hat

🔄 Session-Management

Session-Speicherung:

  • Datei: server/data/sessions.json (verschlüsselt)
  • Struktur:
    {
      "id": "session-id",
      "userId": "user-id",
      "token": "jwt-token",
      "createdAt": "ISO-timestamp",
      "expiresAt": "ISO-timestamp"
    }
    

Session-Lebensdauer:

  • Gültigkeit: 7 Tage
  • Ablauf: Automatische Bereinigung abgelaufener Sessions
  • Logout: Löscht Session aus Datei

Session-Funktionen:

  • createSession(userId, token) - Erstellt neue Session
  • deleteSession(token) - Löscht Session
  • cleanExpiredSessions() - Bereinigt abgelaufene Sessions

🌍 Umgebungsvariablen

Erforderliche Variablen:

Authentifizierung:

  • JWT_SECRET - Secret für JWT-Token-Signierung
    • Standard: harheimertc-secret-key-change-in-production
    • ⚠️ Muss in Produktion geändert werden!

Verschlüsselung:

  • ENCRYPTION_KEY - Schlüssel für Datenverschlüsselung
    • Standard: local_development_encryption_key_change_in_production
    • ⚠️ Muss in Produktion geändert werden!

E-Mail-Versand:

  • SMTP_HOST - SMTP-Server (Standard: smtp.gmail.com)
  • SMTP_PORT - SMTP-Port (Standard: 587)
  • SMTP_USER - SMTP-Benutzername
  • SMTP_PASS - SMTP-Passwort
  • SMTP_FROM - Absender-E-Mail (Standard: noreply@harheimertc.de)

Server-Konfiguration:

  • NODE_ENV - Umgebung (development/production)
  • PORT - Server-Port (Standard: 3100)
  • NUXT_PUBLIC_BASE_URL - Basis-URL der Anwendung

Konfigurationsdatei:

  • Datei: .env (nicht in Git)
  • Beispiel: env.example
  • ⚠️ WICHTIG: .env muss in .gitignore sein!

📁 Dateisystem-Struktur

Datenverzeichnis:

server/data/
├── users.json                    # Verschlüsselt: Benutzerdaten
├── members.json                  # Verschlüsselt: Mitgliederdaten
├── sessions.json                 # Verschlüsselt: Session-Tokens
├── newsletter-subscribers.json   # Verschlüsselt: Newsletter-Abonnenten
├── newsletter-posts.json        # Verschlüsselt: Newsletter-Posts mit Empfängerlisten
├── newsletter-groups.json       # Unverschlüsselt: Newsletter-Gruppen-Metadaten
├── news.json                     # Unverschlüsselt: News (nur Autor-Name)
├── config.json                   # Unverschlüsselt: Konfiguration (öffentliche Kontaktdaten)
├── termine.json                  # Unverschlüsselt: Öffentliche Termine
├── galerie-metadata.json         # Unverschlüsselt: Galerie-Metadaten
├── membership-applications/      # Verschlüsselt: Mitgliedschaftsanträge
│   └── *.json
├── galerie/                      # Nicht öffentlich zugänglich
│   ├── originals/                # Originalbilder
│   └── previews/                 # Vorschaubilder (150x150px)
└── personen/                     # Nicht öffentlich zugänglich
    └── *.jpg/png                 # Personenbilder

Upload-Verzeichnisse:

  • Galerie: server/data/galerie/originals/ und server/data/galerie/previews/
  • Personen: server/data/personen/
  • PDFs: server/data/spielplaene/, server/data/satzung/

Zugriffsschutz:

  • Upload-Verzeichnisse sind nicht direkt über Web-Server zugänglich
  • Zugriff nur über API-Endpunkte mit Authentifizierung

📦 Externe Dependencies

Sicherheitsrelevante Pakete:

Authentifizierung & Verschlüsselung:

  • bcryptjs v2.4.3 - Passwort-Hashing
  • jsonwebtoken v9.0.2 - JWT-Token-Generierung
  • crypto (Node.js built-in) - Verschlüsselung

E-Mail:

  • nodemailer v7.0.9 - E-Mail-Versand

Datei-Upload:

  • multer v2.0.2 - Multipart-Form-Daten-Verarbeitung
  • sharp v0.34.5 - Bildverarbeitung (Resize, EXIF-Korrektur)

PDF:

  • pdf-lib v1.17.1 - PDF-Generierung
  • pdf-parse v2.4.5 - PDF-Parsing

Framework:

  • nuxt v4.1.3 - Vue.js Framework
  • vue v3.5.22 - Frontend-Framework
  • pinia v3.0.3 - State Management

Sicherheits-Updates:

  • Regelmäßige Updates empfohlen
  • Prüfung auf bekannte Schwachstellen (npm audit)

🔒 Sicherheitsrichtlinien

Passwort-Richtlinien:

  • Minimale Länge: 6 Zeichen (empfohlen: mindestens 12)
  • Hashing: bcrypt mit 10 Runden
  • Speicherung: Nur Hash, niemals Klartext

Token-Sicherheit:

  • HttpOnly Cookies: Verhindert XSS-Angriffe
  • SameSite: lax verhindert CSRF-Angriffe
  • Ablaufzeit: 7 Tage (kann angepasst werden)

Datenverschlüsselung:

  • At-Rest-Verschlüsselung: Alle kritischen Daten verschlüsselt
  • Schlüsselverwaltung: Schlüssel nur in .env, niemals in Git
  • Schlüsselrotation: Regelmäßige Rotation empfohlen

API-Sicherheit:

  • Authentifizierung: Erforderlich für alle geschützten Endpunkte
  • Autorisierung: Rollenbasierte Zugriffskontrolle
  • Input-Validierung: Prüfung aller Eingaben
  • Rate Limiting: Nicht implementiert (empfohlen für Produktion)

Best Practices:

  • Passwörter werden niemals im Klartext gespeichert
  • Sensitive Daten sind verschlüsselt
  • JWT-Tokens haben Ablaufzeit
  • HttpOnly Cookies verhindern XSS
  • Rollenbasierte Zugriffskontrolle
  • ⚠️ Rate Limiting fehlt (empfohlen)
  • ⚠️ HTTPS sollte in Produktion verwendet werden
  • ⚠️ Secure-Flag für Cookies sollte in Production true sein

🧪 Test-Zugangsdaten

Standard-Admin-Account:

⚠️ NUR FÜR ENTWICKLUNG - MUSS IN PRODUKTION GEÄNDERT WERDEN!

  • E-Mail: admin@harheimertc.de
  • Passwort: admin123 (Standard, sollte geändert werden)
  • Rolle: admin

Passwort ändern:

node scripts/set-admin-password.js "neues-passwort"

Test-Umgebung:

  • Development-Port: 3100
  • Base-URL: http://localhost:3100
  • Standard-Secrets: Siehe env.example

📝 Hinweise für Security-Tests

Zu testende Bereiche:

  1. Authentifizierung

    • Login/Logout-Funktionalität
    • Token-Validierung
    • Session-Management
    • Passwort-Reset-Mechanismus
  2. Autorisierung

    • Rollenbasierte Zugriffskontrolle
    • API-Endpunkt-Zugriff
    • Frontend-Route-Zugriff
    • Multi-Rollen-Support
  3. Verschlüsselung

    • Datenverschlüsselung/Entschlüsselung
    • Schlüsselverwaltung
    • Verschlüsselte Dateien
  4. Input-Validierung

    • SQL-Injection (nicht relevant, keine DB)
    • XSS (Cross-Site-Scripting)
    • CSRF (Cross-Site-Request-Forgery)
    • File-Upload-Sicherheit
  5. Sensitive Daten

    • Passwort-Hashing
    • Token-Sicherheit
    • Cookie-Konfiguration
    • Logging von sensiblen Daten
  6. API-Sicherheit

    • Endpunkt-Zugriffskontrolle
    • Rate Limiting (fehlt)
    • Input-Sanitization
    • Error-Handling (keine sensiblen Informationen in Fehlermeldungen)

Bekannte Limitierungen:

  • ⚠️ Rate Limiting nicht implementiert
  • ⚠️ HTTPS sollte in Produktion verwendet werden
  • ⚠️ Secure-Flag für Cookies sollte in Production true sein
  • ⚠️ Standard-Secrets müssen in Produktion geändert werden

Letzte Aktualisierung: 2024 Verantwortlich: Entwicklungsteam Harheimer TC