From b33773e2140bc0c2bf2549d11edcd182bb7ce9a7 Mon Sep 17 00:00:00 2001 From: "Torsten Schulz (local)" Date: Fri, 19 Dec 2025 09:57:56 +0100 Subject: [PATCH] Update DATENSCHUTZ_UEBERSICHT.md to enhance data protection overview with a comprehensive table of contents, detailed descriptions of encrypted and non-encrypted data, and security policies. Include sections on encryption technology, authentication, authorization, API access control, roles and permissions, session management, environment variables, file system structure, external dependencies, and security guidelines. --- DATENSCHUTZ_UEBERSICHT.md | 510 ++++++++++++++++++++++++++++++++++++-- 1 file changed, 496 insertions(+), 14 deletions(-) diff --git a/DATENSCHUTZ_UEBERSICHT.md b/DATENSCHUTZ_UEBERSICHT.md index 03d9490..929abe9 100644 --- a/DATENSCHUTZ_UEBERSICHT.md +++ b/DATENSCHUTZ_UEBERSICHT.md @@ -1,28 +1,510 @@ -# Übersicht: Verschlüsselung personenbezogener Daten +# Übersicht: Verschlüsselung personenbezogener Daten & Security-Informationen -## ✅ Verschlüsselt: +## 📋 Inhaltsverzeichnis +1. [Verschlüsselte Daten](#verschlüsselte-daten) +2. [Verschlüsselungstechnologie](#verschlüsselungstechnologie) +3. [Authentifizierung & Autorisierung](#authentifizierung--autorisierung) +4. [API-Endpunkte & Zugriffsschutz](#api-endpunkte--zugriffsschutz) +5. [Rollen & Berechtigungen](#rollen--berechtigungen) +6. [Session-Management](#session-management) +7. [Umgebungsvariablen](#umgebungsvariablen) +8. [Dateisystem-Struktur](#dateisystem-struktur) +9. [Externe Dependencies](#externe-dependencies) +10. [Sicherheitsrichtlinien](#sicherheitsrichtlinien) -1. **users.json** - Benutzerdaten (E-Mail, Name, Passwort-Hash) -2. **members.json** - Mitgliederdaten (Name, E-Mail, Telefon, Adresse, Geburtsdatum) -3. **newsletter-posts.json** - Newsletter-Posts mit Empfängerlisten (E-Mail-Adressen) -4. **newsletter-subscribers.json** - Newsletter-Abonnenten (E-Mail, Name) ✅ JETZT VERSCHLÜSSELT -5. **sessions.json** - Session-Tokens mit E-Mail-Adressen ✅ JETZT VERSCHLÜSSELT -6. **membership-applications/*.json** - Mitgliedschaftsanträge (verschlüsselt als `encryptedData`) +--- -## ⚠️ Enthält personenbezogene Daten, aber weniger kritisch: +## ✅ Verschlüsselte Daten -1. **config.json** - E-Mail-Adressen von Vorstand und Website-Verantwortlichem (öffentliche Kontaktdaten) +### 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: +### ✅ 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 -## 📝 Hinweise: +--- -- Alle kritischen Dateien mit personenbezogenen Daten sind verschlüsselt -- Verschlüsselungsschlüssel: `ENCRYPTION_KEY` aus `.env` Datei +## 🔐 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 }` + +### Cookie-Konfiguration: + +- **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**: + ```json + { + "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: + +```bash +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