Files
harheimertc/DATENSCHUTZ_UEBERSICHT.md

511 lines
16 KiB
Markdown

# Übersicht: Verschlüsselung personenbezogener Daten & Security-Informationen
## 📋 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)
---
## ✅ 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 }`
### 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