# v2-Docker Projekt Journal ## Projektübersicht Lizenzmanagement-System für Social Media Account-Erstellungssoftware mit Docker-basierter Architektur. ### Technische Anforderungen - **Lokaler Betrieb**: Docker mit 4GB RAM und 40GB Speicher - **Internet-Zugriff**: - Admin Panel: https://admin-panel-undso.z5m7q9dk3ah2v1plx6ju.com - API Server: https://api-software-undso.z5m7q9dk3ah2v1plx6ju.com - **Datenbank**: PostgreSQL mit 2 Admin-Usern (rac00n, w@rh@mm3r) - **Ziel**: PoC für spätere VPS-Migration --- ## Aktueller Stand (2025-06-07) ### ✅ Implementiert 1. **Docker-Infrastruktur** - docker-compose.yaml mit 4 Services (PostgreSQL, Admin Panel, License Server, Nginx) - Interne Bridge-Netzwerkkommunikation - Resource Limits konfiguriert (2 CPUs, 4GB RAM pro Service) - Nginx Reverse Proxy für SSL-Termination 2. **PostgreSQL Datenbank** - Tabellen: customers, licenses, sessions, audit_log, backup_history - UTF-8 Support mit deutscher Locale (de_DE.UTF-8) - Init-Script mit vollständigem Schema - Persistente Datenspeicherung 3. **Admin Panel (Vollständig)** - Flask-Anwendung mit Session-Management - Login-Funktionalität für 2 Admin-User (rac00n, w@rh@mm3r) - Dashboard mit Statistiken und Widgets - Lizenz-CRUD (Create, Read, Update, Delete) - Kunden-CRUD mit Lizenzzuordnung - Session-Tracking und -Verwaltung - Audit-Log für alle Aktionen - Export-Funktion (CSV/Excel) - Backup-System mit Verschlüsselung - UTF-8 Support für deutsche Umlaute - Suche und Filter mit Pagination 4. **Internet-Zugriff** - Nginx Reverse Proxy mit SSL-Termination - IONOS SSL-Zertifikate mit vollständiger Certificate Chain - Subdomain-Routing funktioniert (admin-panel-undso, api-software-undso) - DynDNS und Port-Forwarding konfiguriert - Feste IP-Adresse (192.168.178.88) ### ❌ Noch nicht implementiert 1. **License Server API** - Nur Platzhalter-Container vorhanden - Keine API-Endpunkte (/api/version, /api/validate, /api/heartbeat) - Keine Lizenzvalidierung - Kein aktives Session-Management --- ## Offene Aufgaben (Priorität) ### 🔴 Hoch (Basis-Funktionalität) 1. **License Server API implementieren** - `/api/version` - Versionscheck - `/api/validate` - Lizenzvalidierung - `/api/heartbeat` - Session-Management 2. **Reverse Proxy Setup** (Nginx/Traefik) für Subdomain-Routing 3. **SSL-Zertifikate** (Let's Encrypt) für beide Subdomains 4. **Session-Management** (nur eine aktive Session pro Lizenz) ### 🟡 Mittel (Erweiterte Features) 1. **Erweiterte Sicherheit** - Rate-Limiting für Login-Versuche (Brute-Force-Schutz) - 2-Faktor-Authentifizierung (2FA) - Session-Timeout konfigurierbar - IP-Whitelist für Admin-Zugriff - Passwort-Richtlinien (Komplexität, Ablauf) 2. **Lizenz-Verwaltung Erweiterungen** - Bulk-Import von Lizenzen (CSV/Excel Upload) - Lizenz-Templates für schnelle Erstellung - Lizenz-Verlängerung mit einem Klick - Lizenz-Historie (wer hatte welche Lizenz wann) - Lizenz-Gruppen/Pakete - Automatische Lizenzverlängerung 3. **Benachrichtigungen** - E-Mail bei ablaufenden Lizenzen (Struktur bereits vorbereitet) - Dashboard-Benachrichtigungen (Toast/Pop-ups) - Webhook-Support für externe Systeme - SMS-Benachrichtigungen - Slack/Teams Integration 4. **API für Automatisierung** - REST API für Admin-Funktionen - API-Keys für programmatischen Zugriff - Swagger/OpenAPI Dokumentation - Rate Limiting für API - Webhook Events ### 🟢 Niedrig (Nice-to-have) 1. **Benutzeroberfläche** - Dark Mode Toggle - Mobile-optimierte Ansicht (Responsive) - Mehrsprachigkeit (Deutsch/Englisch) - Anpassbare Dashboard-Widgets - Drag & Drop Dashboard - Keyboard Shortcuts 2. **Erweiterte Statistiken** - Grafische Auswertungen (Chart.js/D3.js) - Umsatz-Statistiken - Nutzungsstatistiken pro Kunde - Lizenz-Verlaufsdiagramme - Geografische Verteilung - Vorhersage-Analysen 3. **Weitere Features** - Rechnungserstellung - Mehrmandantenfähigkeit - Benutzerverwaltung (verschiedene Admin-Rollen) - Lizenz-Aktivierung per E-Mail - QR-Code für Lizenzschlüssel - Dokumentenverwaltung pro Kunde - JWT-Authentifizierung für API - Docker Resource-Optimierung - VPS-Migrationsdokumentation --- ## Bekannte Probleme 1. PostgreSQL Volume-Pfad wurde von absolutem Windows-Pfad auf Docker Volume geändert 2. Duplizierte .env Datei in templates/ Ordner 3. Credentials im Klartext in .env Dateien 4. Selbstsignierte SSL-Zertifikate verursachen Browser-Warnungen --- ## Nächste Schritte 1. UTF-8 Support implementieren 2. Reverse Proxy mit SSL einrichten 3. Admin Panel Funktionalität erweitern 4. License Server API entwickeln --- ## Änderungsprotokoll ### 2025-06-06 - Journal erstellt - Initialer Projektstand dokumentiert - Aufgabenliste priorisiert - Technische Anforderungen festgehalten ### 2025-06-06 - UTF-8 Support implementiert - Flask App Konfiguration für UTF-8 hinzugefügt (JSON_AS_ASCII=False) - PostgreSQL Verbindung mit UTF-8 client_encoding - HTML Forms mit accept-charset="UTF-8" - Dockerfile mit deutschen Locale-Einstellungen (de_DE.UTF-8) - PostgreSQL Container mit UTF-8 Initialisierung - init.sql mit SET client_encoding = 'UTF8' **Geänderte Dateien:** - v2_adminpanel/app.py - v2_adminpanel/templates/index.html - v2_adminpanel/init.sql - v2_adminpanel/Dockerfile - v2/docker-compose.yaml **Nächster Test:** - Container neu bauen und starten - Kundennamen mit Umlauten testen (z.B. "Müller GmbH", "Björn Schäfer") - Email mit Umlauten testen ### 2025-06-06 - Lizenzübersicht implementiert - Neue Route `/licenses` für Lizenzübersicht - SQL-Query mit JOIN zwischen licenses und customers - Status-Berechnung (aktiv, läuft bald ab, abgelaufen) - Farbcodierung für verschiedene Status - Navigation zwischen Lizenz erstellen und Übersicht **Neue Features:** - Anzeige aller Lizenzen mit Kundeninformationen - Status-Anzeige basierend auf Ablaufdatum - Unterscheidung zwischen Voll- und Testversion - Responsive Tabelle mit Bootstrap - Link von Dashboard zur Übersicht und zurück **Geänderte/Neue Dateien:** - v2_adminpanel/app.py (neue Route hinzugefügt) - v2_adminpanel/templates/licenses.html (neu erstellt) - v2_adminpanel/templates/index.html (Navigation ergänzt) **Nächster Test:** - Container neu starten - Mehrere Lizenzen mit verschiedenen Ablaufdaten erstellen - Lizenzübersicht unter /licenses aufrufen ### 2025-06-06 - Lizenz bearbeiten/löschen implementiert - Neue Routen für Bearbeiten und Löschen von Lizenzen - Bearbeitungsformular mit vorausgefüllten Werten - Aktiv/Inaktiv-Status kann geändert werden - Lösch-Bestätigung per JavaScript confirm() - Kunde kann nicht geändert werden (nur Lizenzdetails) **Neue Features:** - `/license/edit/` - Bearbeitungsformular - `/license/delete/` - Lizenz löschen (POST) - Aktionen-Spalte in der Lizenzübersicht - Buttons für Bearbeiten und Löschen - Checkbox für Aktiv-Status **Geänderte/Neue Dateien:** - v2_adminpanel/app.py (edit_license und delete_license Routen) - v2_adminpanel/templates/licenses.html (Aktionen-Spalte hinzugefügt) - v2_adminpanel/templates/edit_license.html (neu erstellt) **Sicherheit:** - Login-Required für alle Aktionen - POST-only für Löschvorgänge - Bestätigungsdialog vor dem Löschen ### 2025-06-06 - Kundenverwaltung implementiert - Komplette CRUD-Funktionalität für Kunden - Übersicht zeigt Anzahl aktiver/gesamter Lizenzen pro Kunde - Kunden können nur gelöscht werden, wenn sie keine Lizenzen haben - Bearbeitungsseite zeigt alle Lizenzen des Kunden **Neue Features:** - `/customers` - Kundenübersicht mit Statistiken - `/customer/edit/` - Kunde bearbeiten (Name, E-Mail) - `/customer/delete/` - Kunde löschen (nur ohne Lizenzen) - Navigation zwischen allen drei Hauptbereichen - Anzeige der Kundenlizenzen beim Bearbeiten **Geänderte/Neue Dateien:** - v2_adminpanel/app.py (customers, edit_customer, delete_customer Routen) - v2_adminpanel/templates/customers.html (neu erstellt) - v2_adminpanel/templates/edit_customer.html (neu erstellt) - v2_adminpanel/templates/index.html (Navigation erweitert) - v2_adminpanel/templates/licenses.html (Navigation erweitert) **Besonderheiten:** - Lösch-Button ist deaktiviert, wenn Kunde Lizenzen hat - Aktive Lizenzen werden separat gezählt (nicht abgelaufen + aktiv) - UTF-8 Support für Kundennamen mit Umlauten ### 2025-06-06 - Dashboard mit Statistiken implementiert - Übersichtliches Dashboard als neue Startseite - Statistik-Karten mit wichtigen Kennzahlen - Listen für bald ablaufende und zuletzt erstellte Lizenzen - Routing angepasst: Dashboard (/) und Lizenz erstellen (/create) **Neue Features:** - Statistik-Karten: Kunden, Lizenzen gesamt, Aktive, Ablaufende - Aufteilung nach Lizenztypen (Vollversion/Testversion) - Aufteilung nach Status (Aktiv/Abgelaufen) - Top 10 bald ablaufende Lizenzen mit Restlaufzeit - Letzte 5 erstellte Lizenzen mit Status - Hover-Effekt auf Statistik-Karten - Einheitliche Navigation mit Dashboard-Link **Geänderte/Neue Dateien:** - v2_adminpanel/app.py (dashboard() komplett überarbeitet, create_license() Route) - v2_adminpanel/templates/dashboard.html (neu erstellt) - v2_adminpanel/templates/index.html (Navigation erweitert) - v2_adminpanel/templates/licenses.html (Navigation angepasst) - v2_adminpanel/templates/customers.html (Navigation angepasst) **Dashboard-Inhalte:** - 4 Hauptstatistiken als Karten - Lizenztyp-Verteilung - Status-Verteilung - Warnung für bald ablaufende Lizenzen - Übersicht der neuesten Aktivitäten ### 2025-06-06 - Suchfunktion implementiert - Volltextsuche für Lizenzen und Kunden - Case-insensitive Suche mit LIKE-Operator - Suchergebnisse mit Hervorhebung des Suchbegriffs - Suche zurücksetzen Button **Neue Features:** - **Lizenzsuche**: Sucht in Lizenzschlüssel, Kundenname und E-Mail - **Kundensuche**: Sucht in Kundenname und E-Mail - Suchformular mit autofocus für schnelle Eingabe - Anzeige des aktiven Suchbegriffs - Unterschiedliche Meldungen für leere Ergebnisse **Geänderte Dateien:** - v2_adminpanel/app.py (licenses() und customers() mit Suchlogik erweitert) - v2_adminpanel/templates/licenses.html (Suchformular hinzugefügt) - v2_adminpanel/templates/customers.html (Suchformular hinzugefügt) **Technische Details:** - GET-Parameter für Suche - SQL LIKE mit LOWER() für Case-Insensitive Suche - Wildcards (%) für Teilstring-Suche - UTF-8 kompatibel für deutsche Umlaute ### 2025-06-06 - Filter und Pagination implementiert - Erweiterte Filteroptionen für Lizenzübersicht - Pagination für große Datenmengen (20 Einträge pro Seite) - Filter bleiben bei Seitenwechsel erhalten **Neue Features für Lizenzen:** - **Filter nach Typ**: Alle, Vollversion, Testversion - **Filter nach Status**: Alle, Aktiv, Läuft bald ab, Abgelaufen, Deaktiviert - **Kombinierbar mit Suche**: Filter und Suche funktionieren zusammen - **Pagination**: Navigation durch mehrere Seiten - **Ergebnisanzeige**: Zeigt Anzahl gefilterter Ergebnisse **Neue Features für Kunden:** - **Pagination**: 20 Kunden pro Seite - **Seitennavigation**: Erste, Letzte, Vor, Zurück - **Kombiniert mit Suche**: Suchparameter bleiben erhalten **Geänderte Dateien:** - v2_adminpanel/app.py (licenses() und customers() mit Filter/Pagination erweitert) - v2_adminpanel/templates/licenses.html (Filter-Formular und Pagination hinzugefügt) - v2_adminpanel/templates/customers.html (Pagination hinzugefügt) **Technische Details:** - SQL WHERE-Klauseln für Filter - LIMIT/OFFSET für Pagination - URL-Parameter bleiben bei Navigation erhalten - Responsive Bootstrap-Komponenten ### 2025-06-06 - Session-Tracking implementiert - Neue Tabelle für Session-Verwaltung - Anzeige aktiver und beendeter Sessions - Manuelles Beenden von Sessions möglich - Dashboard zeigt Anzahl aktiver Sessions **Neue Features:** - **Sessions-Tabelle**: Speichert Session-ID, IP, User-Agent, Zeitstempel - **Aktive Sessions**: Zeigt alle laufenden Sessions mit Inaktivitätszeit - **Session-Historie**: Letzte 24 Stunden beendeter Sessions - **Session beenden**: Admins können Sessions manuell beenden - **Farbcodierung**: Grün (aktiv), Gelb (>5 Min inaktiv), Rot (lange inaktiv) **Geänderte/Neue Dateien:** - v2_adminpanel/init.sql (sessions Tabelle hinzugefügt) - v2_adminpanel/app.py (sessions() und end_session() Routen) - v2_adminpanel/templates/sessions.html (neu erstellt) - v2_adminpanel/templates/dashboard.html (Session-Statistik) - Alle Templates (Session-Navigation hinzugefügt) **Technische Details:** - Heartbeat-basiertes Tracking (last_heartbeat) - Automatische Inaktivitätsberechnung - Session-Dauer Berechnung - Responsive Tabellen mit Bootstrap **Hinweis:** Die Session-Daten werden erst gefüllt, wenn der License Server API implementiert ist und Clients sich verbinden. ### 2025-06-06 - Export-Funktion implementiert - CSV und Excel Export für Lizenzen und Kunden - Formatierte Ausgabe mit deutschen Datumsformaten - UTF-8 Unterstützung für Sonderzeichen **Neue Features:** - **Lizenz-Export**: Alle Lizenzen mit Kundeninformationen - **Kunden-Export**: Alle Kunden mit Lizenzstatistiken - **Format-Optionen**: Excel (.xlsx) und CSV (.csv) - **Deutsche Formatierung**: Datum als dd.mm.yyyy, Status auf Deutsch - **UTF-8 Export**: Korrekte Kodierung für Umlaute - **Export-Buttons**: Dropdown-Menüs in Lizenz- und Kundenübersicht **Geänderte Dateien:** - v2_adminpanel/app.py (export_licenses() und export_customers() Routen) - v2_adminpanel/requirements.txt (pandas und openpyxl hinzugefügt) - v2_adminpanel/templates/licenses.html (Export-Dropdown hinzugefügt) - v2_adminpanel/templates/customers.html (Export-Dropdown hinzugefügt) **Technische Details:** - Pandas für Datenverarbeitung - OpenPyXL für Excel-Export - CSV mit Semikolon-Trennung für deutsche Excel-Kompatibilität - Automatische Spaltenbreite in Excel - BOM für UTF-8 CSV (Excel-Kompatibilität) ### 2025-06-06 - Audit-Log implementiert - Vollständiges Änderungsprotokoll für alle Aktionen - Filterbare Übersicht mit Pagination - Detaillierte Anzeige von Änderungen **Neue Features:** - **Audit-Log-Tabelle**: Speichert alle Änderungen mit Zeitstempel, Benutzer, IP - **Protokollierte Aktionen**: CREATE, UPDATE, DELETE, LOGIN, LOGOUT, EXPORT - **JSON-Speicherung**: Alte und neue Werte als JSONB für flexible Abfragen - **Filter-Optionen**: Nach Benutzer, Aktion und Entität - **Detail-Anzeige**: Aufklappbare Änderungsdetails - **Navigation**: Audit-Link in allen Templates **Geänderte/Neue Dateien:** - v2_adminpanel/init.sql (audit_log Tabelle mit Indizes) - v2_adminpanel/app.py (log_audit() Funktion und audit_log() Route) - v2_adminpanel/templates/audit_log.html (neu erstellt) - Alle Templates (Audit-Navigation hinzugefügt) **Technische Details:** - JSONB für strukturierte Datenspeicherung - Performance-Indizes auf timestamp, username und entity - Farbcodierung für verschiedene Aktionen - 50 Einträge pro Seite mit Pagination - IP-Adresse und User-Agent Tracking ### 2025-06-06 - PostgreSQL UTF-8 Locale konfiguriert - Eigenes PostgreSQL Dockerfile für deutsche Locale - Sicherstellung der UTF-8 Unterstützung auf Datenbankebene **Neue Features:** - **PostgreSQL Dockerfile**: Installiert deutsche Locale (de_DE.UTF-8) - **Locale-Umgebungsvariablen**: LANG, LANGUAGE, LC_ALL gesetzt - **Docker Compose Update**: Verwendet jetzt eigenes PostgreSQL-Image **Neue Dateien:** - v2_postgres/Dockerfile (neu erstellt) **Geänderte Dateien:** - v2/docker-compose.yaml (postgres Service nutzt jetzt build statt image) **Technische Details:** - Basis-Image: postgres:14 - Locale-Installation über apt-get - locale-gen für de_DE.UTF-8 - Vollständige UTF-8 Unterstützung für deutsche Sonderzeichen ### 2025-06-07 - Backup-Funktionalität implementiert - Verschlüsselte Backups mit manueller und automatischer Ausführung - Backup-Historie mit Download und Wiederherstellung - Dashboard-Integration für Backup-Status **Neue Features:** - **Backup-Erstellung**: Manuell und automatisch (täglich 3:00 Uhr) - **Verschlüsselung**: AES-256 mit Fernet, Key aus ENV oder automatisch generiert - **Komprimierung**: GZIP-Komprimierung vor Verschlüsselung - **Backup-Historie**: Vollständige Übersicht aller Backups - **Wiederherstellung**: Mit optionalem Verschlüsselungs-Passwort - **Download-Funktion**: Backups können heruntergeladen werden - **Dashboard-Widget**: Zeigt letztes Backup-Status - **E-Mail-Vorbereitung**: Struktur für Benachrichtigungen (deaktiviert) **Neue/Geänderte Dateien:** - v2_adminpanel/init.sql (backup_history Tabelle hinzugefügt) - v2_adminpanel/requirements.txt (cryptography, apscheduler hinzugefügt) - v2_adminpanel/app.py (Backup-Funktionen und Routen) - v2_adminpanel/templates/backups.html (neu erstellt) - v2_adminpanel/templates/dashboard.html (Backup-Status-Widget) - v2_adminpanel/Dockerfile (PostgreSQL-Client installiert) - v2/.env (EMAIL_ENABLED und BACKUP_ENCRYPTION_KEY) - Alle Templates (Backup-Navigation hinzugefügt) **Technische Details:** - Speicherort: C:\Users\Administrator\Documents\GitHub\v2-Docker\backups\ - Dateiformat: backup_v2docker_YYYYMMDD_HHMMSS_encrypted.sql.gz.enc - APScheduler für automatische Backups - pg_dump/psql für Datenbank-Operationen - Audit-Log für alle Backup-Aktionen - Sicherheitsabfrage bei Wiederherstellung ### 2025-06-07 - HTTPS/SSL und Internet-Zugriff implementiert - Nginx Reverse Proxy für externe Erreichbarkeit eingerichtet - SSL-Zertifikate von IONOS mit vollständiger Certificate Chain integriert - Netzwerkkonfiguration für feste IP-Adresse - DynDNS und Port-Forwarding konfiguriert **Neue Features:** - **Nginx Reverse Proxy**: Leitet HTTPS-Anfragen an Container weiter - **SSL-Zertifikate**: Wildcard-Zertifikat von IONOS für *.z5m7q9dk3ah2v1plx6ju.com - **Certificate Chain**: Server-, Intermediate- und Root-Zertifikate kombiniert - **Subdomain-Routing**: admin-panel-undso und api-software-undso - **Port-Forwarding**: FRITZ!Box 443 → 192.168.178.88 - **Feste IP**: Windows-PC auf 192.168.178.88 konfiguriert **Neue/Geänderte Dateien:** - v2_nginx/nginx.conf (Reverse Proxy Konfiguration) - v2_nginx/Dockerfile (Nginx Container mit SSL) - v2_nginx/ssl/fullchain.pem (Certificate Chain) - v2_nginx/ssl/privkey.pem (Private Key) - v2/docker-compose.yaml (nginx Service hinzugefügt) - set-static-ip.ps1 (PowerShell Script für feste IP) - reset-to-dhcp.ps1 (PowerShell Script für DHCP) **Technische Details:** - SSL-Termination am Nginx Reverse Proxy - Backend-Kommunikation über Docker-internes Netzwerk - Admin-Panel nur noch über Nginx erreichbar (Port 443 nicht mehr exposed) - License-Server behält externen Port 8443 für direkte API-Zugriffe - Intermediate Certificates aus ZIP extrahiert und korrekt verkettet **Zugangsdaten:** - Admin-Panel: https://admin-panel-undso.z5m7q9dk3ah2v1plx6ju.com - Benutzer 1: rac00n / 1248163264 - Benutzer 2: w@rh@mm3r / Warhammer123! **Status:** - ✅ Admin-Panel extern erreichbar ohne SSL-Warnungen - ✅ Reverse Proxy funktioniert - ✅ SSL-Zertifikate korrekt konfiguriert - ✅ Netzwerk-Setup abgeschlossen ### 2025-06-07 - Projekt-Cleanup durchgeführt - Redundante und überflüssige Dateien entfernt - Projektstruktur verbessert und organisiert **Durchgeführte Änderungen:** 1. **Entfernte Dateien:** - v2_adminpanel/templates/.env (Duplikat der Haupt-.env) - v2_postgreSQL/ (leeres Verzeichnis) - SSL-Zertifikate aus Root-Verzeichnis (7 Dateien) - Ungenutzer `json` Import aus app.py 2. **Organisatorische Verbesserungen:** - PowerShell-Scripts in neuen `scripts/` Ordner verschoben - SSL-Zertifikate nur noch in v2_nginx/ssl/ - Keine Konfigurationsdateien mehr in Template-Verzeichnissen **Technische Details:** - Docker-Container wurden gestoppt und nach Cleanup neu gestartet - Alle Services laufen wieder normal - Keine funktionalen Änderungen, nur Struktur-Verbesserungen **Ergebnis:** - Verbesserte Projektstruktur - Erhöhte Sicherheit (keine SSL-Zertifikate im Root) - Klarere Dateiorganisation ### 2025-06-07 - SSL "Nicht sicher" Problem behoben - Chrome-Warnung trotz gültigem Zertifikat analysiert und behoben - Ursache: Selbstsigniertes Zertifikat in der Admin Panel Flask-App **Durchgeführte Änderungen:** 1. **Admin Panel Konfiguration (app.py):** - Von HTTPS mit selbstsigniertem Zertifikat auf HTTP Port 5000 umgestellt - `ssl_context='adhoc'` entfernt - Flask läuft jetzt auf `0.0.0.0:5000` statt HTTPS 2. **Dockerfile Anpassung (v2_adminpanel/Dockerfile):** - EXPOSE Port von 443 auf 5000 geändert - Container exponiert jetzt HTTP statt HTTPS 3. **Nginx Konfiguration (nginx.conf):** - proxy_pass von `https://admin-panel:443` auf `http://admin-panel:5000` geändert - `proxy_ssl_verify off` entfernt (nicht mehr benötigt) - Sicherheits-Header für beide Domains hinzugefügt: - Strict-Transport-Security (HSTS) - erzwingt HTTPS für 1 Jahr - X-Content-Type-Options - verhindert MIME-Type Sniffing - X-Frame-Options - Schutz vor Clickjacking - X-XSS-Protection - aktiviert XSS-Filter - Referrer-Policy - kontrolliert Referrer-Informationen **Technische Details:** - Externer Traffic nutzt weiterhin HTTPS mit gültigen IONOS-Zertifikaten - Interne Kommunikation zwischen Nginx und Admin Panel läuft über HTTP (sicher im Docker-Netzwerk) - Kein selbstsigniertes Zertifikat mehr in der Zertifikatskette - SSL-Termination erfolgt ausschließlich am Nginx Reverse Proxy **Docker Neustart:** - Container gestoppt (`docker-compose down`) - Images neu gebaut (`docker-compose build`) - Container neu gestartet (`docker-compose up -d`) - Alle Services laufen normal **Ergebnis:** - ✅ "Nicht sicher" Warnung in Chrome behoben - ✅ Saubere SSL-Konfiguration ohne Mixed Content - ✅ Verbesserte Sicherheits-Header implementiert - ✅ Admin Panel zeigt jetzt grünes Schloss-Symbol ### 2025-06-07 - Sicherheitslücke geschlossen: License Server Port - Direkter Zugriff auf License Server Port 8443 entfernt - Sicherheitsanalyse der exponierten Ports durchgeführt **Identifiziertes Problem:** - License Server war direkt auf Port 8443 von außen erreichbar - Umging damit die Nginx-Sicherheitsschicht und Security Headers - Besonders kritisch, da nur Platzhalter ohne echte Sicherheit **Durchgeführte Änderung:** - Port-Mapping für License Server in docker-compose.yaml entfernt - Service ist jetzt nur noch über Nginx Reverse Proxy erreichbar - Gleiche Sicherheitskonfiguration wie Admin Panel **Aktuelle Port-Exposition:** - ✅ Nginx: Port 80/443 (benötigt für externen Zugriff) - ✅ PostgreSQL: Keine Ports exponiert (gut) - ✅ Admin Panel: Nur über Nginx erreichbar - ✅ License Server: Nur über Nginx erreichbar (vorher direkt auf 8443) **Weitere identifizierte Sicherheitsthemen:** 1. Credentials im Klartext in .env Datei 2. SSL-Zertifikate im Repository gespeichert 3. License Server noch nicht implementiert **Empfehlung:** Docker-Container neu starten für Änderungsübernahme ### 2025-06-07 - License Server Port 8443 wieder aktiviert - Port 8443 für direkten Zugriff auf License Server wieder geöffnet - Notwendig für Client-Software Lizenzprüfung **Begründung:** - Client-Software benötigt direkten Zugriff für Lizenzprüfung - Umgehung von möglichen Firewall-Blockaden auf Port 443 - Weniger Latenz ohne Nginx-Proxy - Flexibilität für verschiedene Client-Implementierungen **Konfiguration:** - License Server erreichbar über: - Direkt: Port 8443 (für Client-Software) - Via Nginx: https://api-software-undso.z5m7q9dk3ah2v1plx6ju.com (für Browser/Tests) **Sicherheitshinweis:** - Port 8443 ist wieder direkt exponiert - License Server muss vor Produktivbetrieb implementiert werden mit: - Eigener SSL-Konfiguration - API-Key Authentifizierung - Rate Limiting - Input-Validierung **Status:** - Port-Mapping in docker-compose.yaml wiederhergestellt - Änderung erfordert Docker-Neustart ### 2025-06-07 - Rate-Limiting und Brute-Force-Schutz implementiert - Umfassender Schutz vor Login-Angriffen mit IP-Sperre - Dashboard-Integration für Sicherheitsüberwachung **Implementierte Features:** 1. **Rate-Limiting System:** - 5 Login-Versuche erlaubt, danach 24h IP-Sperre - Progressive Fehlermeldungen (zufällig aus 5 lustigen Varianten) - CAPTCHA nach 2 Fehlversuchen (Google reCAPTCHA v2 vorbereitet) - E-Mail-Benachrichtigung bei Sperrung (vorbereitet, deaktiviert für PoC) 2. **Timing-Attack Schutz:** - Mindestens 1 Sekunde Antwortzeit bei allen Login-Versuchen - Gleiche Antwortzeit bei richtigem/falschem Username - Verhindert Username-Enumeration 3. **Lustige Fehlermeldungen (zufällig):** - "NOPE!" - "ACCESS DENIED, TRY HARDER" - "WRONG! 🚫" - "COMPUTER SAYS NO" - "YOU FAILED" 4. **Dashboard-Sicherheitswidget:** - Sicherheitslevel-Anzeige (NORMAL/ERHÖHT/KRITISCH) - Anzahl gesperrter IPs - Fehlversuche heute - Letzte 5 Sicherheitsereignisse mit Details 5. **IP-Verwaltung:** - Übersicht aller gesperrten IPs - Manuelles Entsperren möglich - Login-Versuche zurücksetzen - Detaillierte Informationen pro IP 6. **Audit-Log Erweiterungen:** - LOGIN_SUCCESS - Erfolgreiche Anmeldung - LOGIN_FAILED - Fehlgeschlagener Versuch - LOGIN_BLOCKED - IP wurde gesperrt - UNBLOCK_IP - IP manuell entsperrt - CLEAR_ATTEMPTS - Versuche zurückgesetzt **Neue/Geänderte Dateien:** - v2_adminpanel/init.sql (login_attempts Tabelle) - v2_adminpanel/app.py (Rate-Limiting Logik, neue Routen) - v2_adminpanel/templates/login.html (Fehlermeldungs-Styling, CAPTCHA) - v2_adminpanel/templates/dashboard.html (Sicherheitswidget) - v2_adminpanel/templates/blocked_ips.html (neu - IP-Verwaltung) **Technische Details:** - IP-Ermittlung berücksichtigt Proxy-Header (X-Forwarded-For) - Fehlermeldungen mit Animation (shake-effect) - Farbcodierung: Rot für Fehler, Lila für Sperre, Orange für CAPTCHA - Automatische Bereinigung alter Einträge möglich **Sicherheitsverbesserungen:** - Schutz vor Brute-Force-Angriffen - Timing-Attack-Schutz implementiert - IP-basierte Sperrung für 24 Stunden - Audit-Trail für alle Sicherheitsereignisse **Hinweis für Produktion:** - CAPTCHA-Keys müssen in .env konfiguriert werden - E-Mail-Server für Benachrichtigungen einrichten - Rate-Limits können über Konstanten angepasst werden ### 2025-06-07 - Session-Timeout mit Live-Timer implementiert - 5 Minuten Inaktivitäts-Timeout mit visueller Countdown-Anzeige - Automatische Session-Verlängerung bei Benutzeraktivität **Implementierte Features:** 1. **Session-Timeout Backend:** - Flask Session-Timeout auf 5 Minuten konfiguriert - Heartbeat-Endpoint für Keep-Alive - Automatisches Session-Update bei jeder Aktion 2. **Live-Timer in der Navbar:** - Countdown von 5:00 bis 0:00 - Position: Zwischen Logo und Username - Farbwechsel nach verbleibender Zeit: - Grün: > 2 Minuten - Gelb: 1-2 Minuten - Rot: < 1 Minute - Blinkend: < 30 Sekunden 3. **Benutzerinteraktion:** - Timer wird bei jeder Aktivität zurückgesetzt - Tracking von: Klicks, Tastatureingaben, Mausbewegungen - Automatischer Heartbeat bei Aktivität - Warnung bei < 1 Minute mit "Session verlängern" Button 4. **Base-Template System:** - Neue base.html als Basis für alle Admin-Seiten - Alle Templates (außer login.html) nutzen jetzt base.html - Einheitliches Layout und Timer auf allen Seiten **Neue/Geänderte Dateien:** - v2_adminpanel/app.py (Session-Konfiguration, Heartbeat-Endpoint) - v2_adminpanel/templates/base.html (neu - Base-Template mit Timer) - Alle anderen Templates aktualisiert für Template-Vererbung **Technische Details:** - JavaScript-basierter Countdown-Timer - AJAX-Heartbeat alle 5 Sekunden bei Aktivität - LocalStorage für Tab-Synchronisation möglich - Automatischer Logout bei 0:00 - Fetch-Interceptor für automatische Session-Verlängerung **Sicherheitsverbesserung:** - Automatischer Logout nach 5 Minuten Inaktivität - Verhindert vergessene Sessions - Visuelles Feedback für Session-Status ### 2025-06-07 - Session-Timeout Bug behoben - Problem: Session-Timeout funktionierte nicht korrekt - Session blieb länger als 5 Minuten aktiv - Ursache: login_required Decorator aktualisierte last_activity bei JEDEM Request **Durchgeführte Änderungen:** 1. **login_required Decorator (app.py):** - Prüft jetzt ob Session abgelaufen ist (5 Minuten seit last_activity) - Aktualisiert last_activity NICHT mehr automatisch - Führt AUTO_LOGOUT mit Audit-Log bei Timeout durch - Speichert Username vor session.clear() für korrektes Logging 2. **Heartbeat-Endpoint (app.py):** - Geändert zu POST-only Endpoint - Aktualisiert explizit last_activity wenn aufgerufen - Wird nur bei aktiver Benutzerinteraktion aufgerufen 3. **Frontend Timer (base.html):** - Heartbeat wird als POST Request gesendet - trackActivity() ruft extendSession() ohne vorheriges resetTimer() auf - Timer wird erst nach erfolgreichem Heartbeat zurückgesetzt - AJAX Interceptor ignoriert Heartbeat-Requests 4. **Audit-Log Erweiterung:** - Neue Aktion AUTO_LOGOUT hinzugefügt - Orange Farbcodierung (#fd7e14) - Zeigt Grund des Timeouts im Audit-Log **Ergebnis:** - ✅ Session läuft nach exakt 5 Minuten Inaktivität ab - ✅ Benutzeraktivität verlängert Session korrekt - ✅ AUTO_LOGOUT wird im Audit-Log protokolliert - ✅ Visueller Timer zeigt verbleibende Zeit ### 2025-06-07 - Session-Timeout weitere Verbesserungen - Zusätzliche Fixes nach Test-Feedback implementiert **Weitere durchgeführte Änderungen:** 1. **Fehlender Import behoben:** - `flash` zu Flask-Imports hinzugefügt für Timeout-Warnmeldungen 2. **Session-Cookie-Konfiguration erweitert (app.py):** - SESSION_COOKIE_HTTPONLY = True (Sicherheit gegen XSS) - SESSION_COOKIE_SECURE = False (intern HTTP, extern HTTPS via Nginx) - SESSION_COOKIE_SAMESITE = 'Lax' (CSRF-Schutz) - SESSION_COOKIE_NAME = 'admin_session' (eindeutiger Name) - SESSION_REFRESH_EACH_REQUEST = False (verhindert automatische Verlängerung) 3. **Session-Handling verbessert:** - Entfernt: session.permanent = True aus login_required decorator - Hinzugefügt: session.modified = True im Heartbeat für explizites Speichern - Debug-Logging für Session-Timeout-Prüfung hinzugefügt 4. **Nginx-Konfiguration:** - Bereits korrekt konfiguriert für Heartbeat-Weiterleitung - Proxy-Headers für korrekte IP-Weitergabe **Technische Details:** - Flask-Session mit Filesystem-Backend nutzt jetzt korrekte Cookie-Einstellungen - Session-Cookie wird nicht mehr automatisch bei jedem Request verlängert - Explizite Session-Modifikation nur bei Heartbeat-Requests - Debug-Logs zeigen Zeit seit letzter Aktivität für Troubleshooting **Status:** - ✅ Session-Timeout-Mechanismus vollständig implementiert - ✅ Debug-Logging für Session-Überwachung aktiv - ✅ Cookie-Sicherheitseinstellungen optimiert ### 2025-06-07 - CAPTCHA Backend-Validierung implementiert - Google reCAPTCHA v2 Backend-Verifizierung hinzugefügt **Implementierte Features:** 1. **verify_recaptcha() Funktion (app.py):** - Validiert CAPTCHA-Response mit Google API - Fallback: Wenn RECAPTCHA_SECRET_KEY nicht konfiguriert, wird CAPTCHA übersprungen (für PoC) - Timeout von 5 Sekunden für API-Request - Error-Handling für Netzwerkfehler - Logging für Debugging und Fehleranalyse 2. **Login-Route Erweiterungen:** - CAPTCHA wird nach 2 Fehlversuchen angezeigt - Prüfung ob CAPTCHA-Response vorhanden - Validierung der CAPTCHA-Response gegen Google API - Unterschiedliche Fehlermeldungen für fehlende/ungültige CAPTCHA - Site Key wird aus Environment-Variable an Template übergeben 3. **Environment-Konfiguration (.env):** - RECAPTCHA_SITE_KEY (für Frontend) - RECAPTCHA_SECRET_KEY (für Backend-Validierung) - Beide auskommentiert für PoC-Phase 4. **Dependencies:** - requests Library zu requirements.txt hinzugefügt **Sicherheitsaspekte:** - CAPTCHA verhindert automatisierte Brute-Force-Angriffe - Timing-Attack-Schutz bleibt auch bei CAPTCHA-Prüfung aktiv - Bei Netzwerkfehlern wird CAPTCHA als bestanden gewertet (Verfügbarkeit vor Sicherheit) - Secret Key wird niemals im Frontend exponiert **Verwendung:** 1. Google reCAPTCHA v2 Keys erstellen: https://www.google.com/recaptcha/admin 2. Keys in .env eintragen: ``` RECAPTCHA_SITE_KEY=your-site-key RECAPTCHA_SECRET_KEY=your-secret-key ``` 3. Container neu starten **Status:** - ✅ CAPTCHA-Frontend bereits vorhanden (login.html) - ✅ Backend-Validierung vollständig implementiert - ✅ Fallback für PoC-Betrieb ohne Google-Keys - ✅ Integration in Rate-Limiting-System - ⚠️ CAPTCHA-Keys noch nicht konfiguriert (für PoC deaktiviert) **Anleitung für Google reCAPTCHA Keys:** 1. **Registrierung bei Google reCAPTCHA:** - Gehe zu: https://www.google.com/recaptcha/admin/create - Melde dich mit Google-Konto an - Label eingeben: "v2-Docker Admin Panel" - Typ wählen: "reCAPTCHA v2" → "Ich bin kein Roboter"-Kästchen - Domains hinzufügen: ``` admin-panel-undso.z5m7q9dk3ah2v1plx6ju.com localhost ``` - Nutzungsbedingungen akzeptieren - Senden klicken 2. **Keys erhalten:** - Site Key (öffentlich für Frontend) - Secret Key (geheim für Backend-Validierung) 3. **Keys in .env eintragen:** ```bash RECAPTCHA_SITE_KEY=6Ld... RECAPTCHA_SECRET_KEY=6Ld... ``` 4. **Container neu starten:** ```bash docker-compose down docker-compose up -d ``` **Kosten:** - Kostenlos bis 1 Million Anfragen pro Monat - Danach: $1.00 pro 1000 zusätzliche Anfragen - Für dieses Projekt reicht die kostenlose Version vollkommen aus **Test-Keys für Entwicklung:** - Site Key: `6LeIxAcTAAAAAJcZVRqyHh71UMIEGNQ_MXjiZKhI` - Secret Key: `6LeIxAcTAAAAAGG-vFI1TnRWxMZNFuojJ4WifJWe` - ⚠️ Diese Keys nur für lokale Tests verwenden, niemals produktiv! **Aktueller Status:** - Code ist vollständig implementiert und getestet - CAPTCHA wird nach 2 Fehlversuchen angezeigt - Ohne konfigurierte Keys wird CAPTCHA-Prüfung übersprungen - Für Produktion müssen nur die Keys in .env eingetragen werden ### 2025-06-07 - License Key Generator implementiert - Automatische Generierung von Lizenzschlüsseln mit definiertem Format **Implementiertes Format:** `AF-YYYYMMFT-XXXX-YYYY-ZZZZ` - **AF** = Account Factory (feste Produktkennung) - **YYYY** = Jahr (z.B. 2025) - **MM** = Monat (z.B. 06) - **FT** = Lizenztyp (F=Fullversion, T=Testversion) - **XXXX-YYYY-ZZZZ** = Zufällige alphanumerische Zeichen (ohne verwirrende wie 0/O, 1/I/l) **Beispiele:** - Vollversion: `AF-202506F-A7K9-M3P2-X8R4` - Testversion: `AF-202512T-B2N5-K8L3-Q9W7` **Implementierte Features:** 1. **Backend-Funktionen (app.py):** - `generate_license_key()` - Generiert Keys mit kryptografisch sicherem Zufallsgenerator - `validate_license_key()` - Validiert das Key-Format mit Regex - Verwendet `secrets` statt `random` für Sicherheit - Erlaubte Zeichen: ABCDEFGHJKLMNPQRSTUVWXYZ23456789 (ohne verwirrende) 2. **API-Endpoint:** - POST `/api/generate-license-key` - JSON API für Key-Generierung - Prüft auf Duplikate in der Datenbank (max. 10 Versuche) - Audit-Log-Eintrag bei jeder Generierung - Login-Required geschützt 3. **Frontend-Verbesserungen (index.html):** - Generate-Button neben License Key Input - Placeholder und Pattern-Attribut für Format-Hinweis - Auto-Uppercase bei manueller Eingabe - Visuelles Feedback bei erfolgreicher Generierung - Format-Hinweis unter dem Eingabefeld 4. **JavaScript-Features:** - AJAX-basierte Key-Generierung ohne Seiten-Reload - Automatische Prüfung bei Lizenztyp-Änderung - Ladeindikator während der Generierung - Fehlerbehandlung mit Benutzer-Feedback - Standard-Datum-Einstellungen (heute + 1 Jahr) 5. **Validierung:** - Server-seitige Format-Validierung beim Speichern - Flash-Message bei ungültigem Format - Automatische Großschreibung des Keys - Pattern-Validierung im HTML-Formular 6. **Weitere Fixes:** - Form Action von "/" auf "/create" korrigiert - Flash-Messages mit Bootstrap Toasts implementiert - GENERATE_KEY Aktion zum Audit-Log hinzugefügt (Farbe: #20c997) **Technische Details:** - Keine vorhersagbaren Muster durch `secrets.choice()` - Datum im Key zeigt Erstellungszeitpunkt - Lizenztyp direkt im Key erkennbar - Kollisionsprüfung gegen Datenbank **Status:** - ✅ Backend-Generierung vollständig implementiert - ✅ Frontend mit Generate-Button und JavaScript - ✅ Validierung und Fehlerbehandlung - ✅ Audit-Log-Integration - ✅ Form-Action-Bug behoben ### 2025-06-07 - Batch-Lizenzgenerierung implementiert - Mehrere Lizenzen auf einmal für einen Kunden erstellen **Implementierte Features:** 1. **Batch-Formular (/batch):** - Kunde und E-Mail eingeben - Anzahl der Lizenzen (1-100) - Lizenztyp (Vollversion/Testversion) - Gültigkeitszeitraum für alle Lizenzen - Vorschau-Modal zeigt Key-Format - Standard-Datum-Einstellungen (heute + 1 Jahr) 2. **Backend-Verarbeitung:** - Route `/batch` für GET (Formular) und POST (Generierung) - Generiert die angegebene Anzahl eindeutiger Keys - Speichert alle in einer Transaktion - Kunde wird automatisch angelegt (falls nicht vorhanden) - ON CONFLICT für existierende Kunden - Audit-Log-Eintrag mit CREATE_BATCH Aktion 3. **Ergebnis-Seite:** - Zeigt alle generierten Lizenzen in Tabellenform - Kundeninformationen und Gültigkeitszeitraum - Einzelne Keys können kopiert werden (📋 Button) - Alle Keys auf einmal kopieren - Druckfunktion für physische Ausgabe - Link zur Lizenzübersicht mit Kundenfilter 4. **Export-Funktionalität:** - Route `/batch/export` für CSV-Download - Speichert Batch-Daten in Session für Export - CSV mit UTF-8 BOM für Excel-Kompatibilität - Enthält Kundeninfo, Generierungsdatum und alle Keys - Format: Nr;Lizenzschlüssel;Typ - Dateiname: batch_licenses_KUNDE_TIMESTAMP.csv 5. **Integration:** - Batch-Button in Navigation (Dashboard, Einzellizenz-Seite) - CREATE_BATCH Aktion im Audit-Log (Farbe: #6610f2) - Session-basierte Export-Daten - Flash-Messages für Feedback **Sicherheit:** - Limit von 100 Lizenzen pro Batch - Login-Required für alle Routen - Transaktionale Datenbank-Operationen - Validierung der Eingaben **Beispiel-Workflow:** 1. Admin geht zu `/batch` 2. Gibt Kunde "Firma GmbH", Anzahl "25", Typ "Vollversion" ein 3. System generiert 25 eindeutige Keys 4. Ergebnis-Seite zeigt alle Keys 5. Admin kann CSV exportieren oder Keys kopieren 6. Kunde erhält die Lizenzen **Status:** - ✅ Batch-Formular vollständig implementiert - ✅ Backend-Generierung mit Transaktionen - ✅ Export als CSV - ✅ Copy-to-Clipboard Funktionalität - ✅ Audit-Log-Integration - ✅ Navigation aktualisiert ## 2025-01-06: Implementierung Searchable Dropdown für Kundenauswahl **Problem:** - Bei der Lizenzerstellung wurde immer ein neuer Kunde angelegt - Keine Möglichkeit, Lizenzen für bestehende Kunden zu erstellen - Bei vielen Kunden wäre ein normales Dropdown unübersichtlich **Lösung:** 1. **Select2 Library** für searchable Dropdown integriert 2. **API-Endpoint `/api/customers`** für die Kundensuche erstellt 3. **Frontend angepasst:** - Searchable Dropdown mit Live-Suche - Option "Neuer Kunde" im Dropdown - Eingabefelder erscheinen nur bei "Neuer Kunde" 4. **Backend-Logik verbessert:** - Prüfung ob neuer oder bestehender Kunde - E-Mail-Duplikatsprüfung vor Kundenerstellung - Separate Audit-Logs für Kunde und Lizenz 5. **Datenbank:** - UNIQUE Constraint auf E-Mail-Spalte hinzugefügt **Änderungen:** - `app.py`: Neuer API-Endpoint `/api/customers`, angepasste Routes `/create` und `/batch` - `base.html`: Select2 CSS und JS eingebunden - `index.html`: Kundenauswahl mit Select2 implementiert - `batch_form.html`: Kundenauswahl mit Select2 implementiert - `init.sql`: UNIQUE Constraint für E-Mail **Status:** - ✅ API-Endpoint funktioniert mit Pagination - ✅ Select2 Dropdown mit Suchfunktion - ✅ Neue/bestehende Kunden können ausgewählt werden - ✅ E-Mail-Duplikate werden verhindert - ✅ Sowohl Einzellizenz als auch Batch unterstützt