16 KiB
Übersicht: Verschlüsselung personenbezogener Daten & Security-Informationen
📋 Inhaltsverzeichnis
- Verschlüsselte Daten
- Verschlüsselungstechnologie
- Authentifizierung & Autorisierung
- API-Endpunkte & Zugriffsschutz
- Rollen & Berechtigungen
- Session-Management
- Umgebungsvariablen
- Dateisystem-Struktur
- Externe Dependencies
- Sicherheitsrichtlinien
✅ Verschlüsselte Daten
Kritische Dateien mit personenbezogenen Daten:
-
users.json - Benutzerdaten
- E-Mail-Adressen
- Namen
- Passwort-Hashes (bcrypt)
- Rollen (Array)
- Telefonnummern
- Aktivierungsstatus
-
members.json - Mitgliederdaten
- Namen
- E-Mail-Adressen
- Telefonnummern
- Adressen
- Geburtsdaten
- Notizen
-
newsletter-posts.json - Newsletter-Posts
- Empfängerlisten (E-Mail-Adressen)
- Post-Inhalte
- Metadaten
-
newsletter-subscribers.json - Newsletter-Abonnenten
- E-Mail-Adressen
- Namen
- Bestätigungsstatus
- Abonnement-Gruppen
- Tokens (Bestätigung, Abmeldung)
-
sessions.json - Session-Tokens
- User-IDs
- JWT-Tokens
- Erstellungs- und Ablaufzeiten
-
membership-applications/*.json - Mitgliedschaftsanträge
- Vollständige Antragsdaten (verschlüsselt als
encryptedData) - Persönliche Informationen
- Kontaktdaten
- Vollständige Antragsdaten (verschlüsselt als
⚠️ Enthält personenbezogene Daten, aber weniger kritisch:
- 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:
.envDatei (nicht in Git)
Verschlüsselungsfunktionen:
encrypt(text, password)- Verschlüsselt einen Textdecrypt(encryptedData, password)- Entschlüsselt einen TextencryptObject(obj, password)- Verschlüsselt ein JSON-ObjektdecryptObject(encryptedData, password)- Entschlüsselt ein JSON-Objekt
Datei: server/utils/encryption.js
🔑 Authentifizierung & Autorisierung
Passwort-Hashing:
- Algorithmus: bcrypt
- Rounds: 10
- Bibliothek:
bcryptjsv2.4.3
JWT-Tokens:
- Bibliothek:
jsonwebtokenv9.0.2 - Algorithmus: HS256 (HMAC SHA-256)
- Secret:
JWT_SECRETaus Umgebungsvariablen - Standardwert (Development):
harheimertc-secret-key-change-in-production - Gültigkeitsdauer: 7 Tage
- Payload:
{ id, email, roles }
Cookie-Konfiguration:
- Name:
auth_token - HttpOnly:
true(verhindert JavaScript-Zugriff) - Secure:
false(in Production sollte diestruesein, wenn HTTPS verwendet wird) - SameSite:
lax - MaxAge: 7 Tage (604.800 Sekunden)
Authentifizierungs-Endpunkte:
POST /api/auth/login- Login mit E-Mail/PasswortPOST /api/auth/logout- Logout (löscht Session)POST /api/auth/register- Registrierung (erfordert Admin-Freischaltung)POST /api/auth/reset-password- Passwort-ResetGET /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
/loginbei fehlender Authentifizierung
API-Endpunkt-Kategorien:
Öffentliche Endpunkte (keine Authentifizierung):
GET /api/news-public- Öffentliche NewsGET /api/termine- Öffentliche TermineGET /api/spielplaene- SpielpläneGET /api/galerie/list- Galerie-Liste (mit Zugriffskontrolle)GET /api/galerie/[id]- Einzelbild (mit Zugriffskontrolle)POST /api/newsletter/subscribe- Newsletter-AnmeldungGET /api/newsletter/confirm- Newsletter-BestätigungGET /api/newsletter/unsubscribe- Newsletter-AbmeldungPOST /api/newsletter/unsubscribe-by-email- Abmeldung per E-MailGET /api/newsletter/groups/public-list- Öffentliche Newsletter-GruppenGET /api/newsletter/check-subscription- Prüft Abonnement-StatusPOST /api/contact- Kontaktformular
Authentifizierte Endpunkte (erfordern Login):
Mitgliederbereich:
GET /api/members- Mitgliederliste (mit Rollenprüfung)GET /api/profile- Eigenes ProfilPUT /api/profile- Profil bearbeitenGET /api/news- Interne NewsPOST /api/news- News erstellen (admin/vorstand)DELETE /api/news- News löschen (admin/vorstand)
CMS-Endpunkte (admin/vorstand):
GET /api/cms/users/list- BenutzerlistePOST /api/cms/users/approve- Benutzer freischaltenPOST /api/cms/users/update-role- Rolle ändernPOST /api/cms/users/deactivate- Benutzer deaktivierenPOST /api/cms/users/reject- Registrierung ablehnenPUT /api/config- Konfiguration bearbeitenPOST /api/cms/save-csv- CSV speichernPOST /api/cms/upload-spielplan-pdf- Spielplan hochladenPOST /api/cms/satzung-upload- Satzung hochladenPOST /api/members- Mitglied hinzufügen/bearbeitenDELETE /api/members- Mitglied löschenPOST /api/members/bulk- Bulk-ImportPOST /api/personen/upload- Personenbild hochladenPOST /api/galerie/upload- Galeriebild hochladenDELETE /api/galerie/[id]- Galeriebild löschenPOST /api/termine-manage- Termin erstellen/bearbeitenDELETE /api/termine-manage- Termin löschenGET /api/termine-manage- Termine verwaltenGET /api/membership/applications- MitgliedschaftsanträgePOST /api/membership/generate-pdf- PDF generierenGET /api/membership/download/[id]- PDF herunterladenPUT /api/membership/update-status- Status aktualisieren
Newsletter-Endpunkte (admin/vorstand/newsletter):
GET /api/newsletter/groups/list- Newsletter-Gruppen auflistenPOST /api/newsletter/groups/create- Gruppe erstellenGET /api/newsletter/groups/[id]/posts/list- Posts auflistenPOST /api/newsletter/groups/[id]/posts/create- Post erstellen und versendenGET /api/newsletter/groups/[id]/subscribers/list- Abonnenten auflistenPOST /api/newsletter/groups/[id]/subscribers/add- Abonnent hinzufügenPOST /api/newsletter/groups/[id]/subscribers/remove- Abonnent entfernen
Zugriffskontrolle:
- Helper-Funktionen:
hasRole(),hasAnyRole(),hasAllRoles()inserver/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:
-
mitglied (Standard)
- Zugriff auf Mitgliederbereich
- Eigene Profilansicht und -bearbeitung
- Mitgliederliste (ohne Kontaktdaten)
- Interne News lesen
-
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
-
admin
- Alle Vorstand-Berechtigungen
- Benutzerverwaltung
- Rollenverwaltung
- Konfiguration ändern
- Mitgliedschaftsanträge verwalten
-
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: stringwird automatisch zuroles: [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 SessiondeleteSession(token)- Löscht SessioncleanExpiredSessions()- 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!
- Standard:
Verschlüsselung:
ENCRYPTION_KEY- Schlüssel für Datenverschlüsselung- Standard:
local_development_encryption_key_change_in_production - ⚠️ Muss in Produktion geändert werden!
- Standard:
E-Mail-Versand:
SMTP_HOST- SMTP-Server (Standard:smtp.gmail.com)SMTP_PORT- SMTP-Port (Standard:587)SMTP_USER- SMTP-BenutzernameSMTP_PASS- SMTP-PasswortSMTP_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:
.envmuss in.gitignoresein!
📁 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/undserver/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:
bcryptjsv2.4.3 - Passwort-Hashingjsonwebtokenv9.0.2 - JWT-Token-Generierungcrypto(Node.js built-in) - Verschlüsselung
E-Mail:
nodemailerv7.0.9 - E-Mail-Versand
Datei-Upload:
multerv2.0.2 - Multipart-Form-Daten-Verarbeitungsharpv0.34.5 - Bildverarbeitung (Resize, EXIF-Korrektur)
PDF:
pdf-libv1.17.1 - PDF-Generierungpdf-parsev2.4.5 - PDF-Parsing
Framework:
nuxtv4.1.3 - Vue.js Frameworkvuev3.5.22 - Frontend-Frameworkpiniav3.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:
laxverhindert 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
truesein
🧪 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:
-
Authentifizierung
- Login/Logout-Funktionalität
- Token-Validierung
- Session-Management
- Passwort-Reset-Mechanismus
-
Autorisierung
- Rollenbasierte Zugriffskontrolle
- API-Endpunkt-Zugriff
- Frontend-Route-Zugriff
- Multi-Rollen-Support
-
Verschlüsselung
- Datenverschlüsselung/Entschlüsselung
- Schlüsselverwaltung
- Verschlüsselte Dateien
-
Input-Validierung
- SQL-Injection (nicht relevant, keine DB)
- XSS (Cross-Site-Scripting)
- CSRF (Cross-Site-Request-Forgery)
- File-Upload-Sicherheit
-
Sensitive Daten
- Passwort-Hashing
- Token-Sicherheit
- Cookie-Konfiguration
- Logging von sensiblen Daten
-
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
truesein - ⚠️ Standard-Secrets müssen in Produktion geändert werden
Letzte Aktualisierung: 2024 Verantwortlich: Entwicklungsteam Harheimer TC