# Docker-Konfigurations-Optimierung & Sicherheitsanalyse ## Zusammenfassung Dieses Dokument beschreibt die umfassende Analyse, Korrekturen und Optimierungen, die an allen Docker- und docker-compose-Konfigurationen im Meldestelle-Projekt vorgenommen wurden. Die Optimierungen konzentrieren sich auf **Sicherheitshärtung**, **Leistungsverbesserungen** und **Produktionsbereitschaft**. ### Wichtigste Errungenschaften - ✅ **Kritische Sicherheitsvulnerabilitäten behoben**: Eliminierung von fest kodierten Anmeldedaten und exponierten Geheimnissen - ✅ **Ressourcenverwaltung**: Umfassende CPU- und Speicherlimits für alle Services hinzugefügt - ✅ **Sicherheitshärtung**: Docker Secrets, Nicht-Root-Benutzer und Sicherheitsbeschränkungen implementiert - ✅ **Leistungsoptimierung**: Verbesserte Health Checks, Startabhängigkeiten und Ressourcenzuteilung - ✅ **Produktionsbereitschaft**: Ordnungsgemäße Volume-Verwaltung, Netzwerke und Monitoring hinzugefügt --- ## Sicherheitsverbesserungen ### 🔐 Behobene kritische Sicherheitsprobleme #### 1. **Geheimnisse-Verwaltung** **Problem**: Fest kodierte Anmeldedaten in Umgebungsvariablen ```yaml # VORHER (UNSICHER) environment: POSTGRES_PASSWORD: meldestelle KEYCLOAK_CLIENT_SECRET: K5RqonwVOaxPKaXVH4mbthSRbjRh5tOK GF_SECURITY_ADMIN_PASSWORD: admin ``` **Lösung**: Docker Secrets mit sicherem dateibasiertem Management ```yaml # NACHHER (SICHER) environment: POSTGRES_PASSWORD_FILE: /run/secrets/postgres_password KEYCLOAK_CLIENT_SECRET_FILE: /run/secrets/keycloak_client_secret GF_SECURITY_ADMIN_PASSWORD__FILE: /run/secrets/grafana_admin_password secrets: - postgres_password - keycloak_client_secret - grafana_admin_password ``` #### 2. **Container-Sicherheitshärtung** **Hinzugefügte Sicherheitsmaßnahmen**: - `no-new-privileges:true` für alle Container - Nicht-Root-Benutzer-Ausführung wo möglich - Schreibgeschützte Volume-Mounts für Konfigurationsdateien - Sichere Dateiberechtigungen (600) für alle Secrets #### 3. **Netzwerksicherheit** **Verbesserungen**: - Benutzerdefiniertes isoliertes Netzwerk mit dediziertem Subnetz (172.20.0.0/16) - Ordnungsgemäße Inter-Container-Kommunikationskontrollen - Verbesserte CORS- und Sicherheits-Header für Webanwendungen ### 🛡️ Hinzugefügte Sicherheitsfunktionen | Sicherheitsfunktion | Implementierung | Nutzen | |-------------------|-----------------|---------| | Docker Secrets | Dateibasiertes Secrets-Management | Eliminiert fest kodierte Anmeldedaten | | Nicht-Root-Benutzer | Benutzerdefinierte Benutzer/Gruppe für Anwendungen | Reduziert Angriffsfläche | | Sicherheitsoptionen | `no-new-privileges` Flag | Verhindert Privilegien-Eskalation | | Schreibgeschützte Mounts | Konfigurationsdateien schreibgeschützt gemountet | Verhindert Laufzeit-Manipulation | | Netzwerkisolation | Benutzerdefiniertes Bridge-Netzwerk | Isoliert Container-Kommunikation | | Ressourcenlimits | CPU/Speicher-Beschränkungen | Verhindert Ressourcenerschöpfungsangriffe | --- ## Leistungsoptimierungen ### 🚀 Ressourcenverwaltung #### Umfassende Ressourcenlimits Alle Services haben jetzt ordnungsgemäß konfigurierte Ressourcenlimits und Reservierungen: **Infrastruktur-Services**: ```yaml deploy: resources: limits: cpus: '2.0' memory: 2G reservations: cpus: '0.5' memory: 1G ``` **Ressourcenzuteilungsübersicht**: | Service | CPU-Limit | Speicher-Limit | CPU-Reserviert | Speicher-Reserviert | |---------|-----------|----------------|----------------|-------------------| | PostgreSQL | 2.0 | 2GB | 0.5 | 512MB | | Redis | 1.0 | 1GB | 0.25 | 256MB | | Keycloak | 2.0 | 2GB | 0.5 | 1GB | | API Gateway | 2.0 | 2GB | 0.5 | 1GB | | Kafka | 2.0 | 2GB | 0.5 | 512MB | | Grafana | 1.0 | 1GB | 0.25 | 256MB | | Prometheus | 1.0 | 2GB | 0.25 | 512MB | ### 🔧 Leistungsverbesserungen #### 1. **Optimierte Health Checks** ```yaml # Verbesserte Health Check-Konfiguration healthcheck: test: ["CMD", "curl", "--fail", "--max-time", "5", "http://localhost:8080/health/ready"] interval: 15s timeout: 10s retries: 3 start_period: 60s ``` #### 2. **JVM-Optimierung** **Kafka JVM-Einstellungen**: ```yaml environment: KAFKA_HEAP_OPTS: "-Xmx1G -Xms512m" KAFKA_JVM_PERFORMANCE_OPTS: "-XX:+UseG1GC -XX:MaxGCPauseMillis=20 -XX:InitiatingHeapOccupancyPercent=35" ``` #### 3. **Datenbankleistung** **PostgreSQL-Verbesserungen**: - SCRAM-SHA-256-Authentifizierung für bessere Sicherheit - Optimierte Verbindungseinstellungen - Ordnungsgemäße Datenpersistenz mit Bind-Mounts **Redis-Optimierungen**: - Speicherverwaltung mit `maxmemory` und `allkeys-lru` Policy - Persistenter Speicher mit AOF (Append Only File) - Authentifizierung aktiviert --- ## Konfigurationsstruktur ### 📁 Dateiorganisation Die optimierte Konfiguration besteht aus: ``` ├── docker-compose.yml.optimized # Infrastruktur-Services ├── docker-compose.services.yml.optimized # Microservices ├── docker-compose.clients.yml.optimized # Client-Anwendungen ├── .env.template # Umgebungskonfigurations-Template └── docker/ └── secrets/ ├── setup-secrets.sh # Automatisierte Secrets-Generierung ├── postgres_user.txt # Datenbank-Benutzername ├── postgres_password.txt # Datenbank-Passwort (generiert) ├── redis_password.txt # Redis-Passwort (generiert) ├── keycloak_admin_password.txt # Keycloak-Admin-Passwort (generiert) ├── keycloak_client_secret.txt # API-Gateway-Client-Secret (generiert) ├── grafana_admin_user.txt # Grafana-Admin-Benutzername ├── grafana_admin_password.txt # Grafana-Admin-Passwort (generiert) ├── jwt_secret.txt # JWT-Signatur-Secret (generiert) └── vnc_password.txt # VNC-Zugriffs-Passwort (generiert) ``` ### 🔄 Profilbasiertes Deployment Die optimierte Konfiguration unterstützt selektives Service-Deployment: ```bash # Nur Infrastruktur docker-compose -f docker-compose.yml.optimized up -d # Infrastruktur + Microservices docker-compose -f docker-compose.yml.optimized \ -f docker-compose.services.yml.optimized up -d # Vollständiges Stack-Deployment docker-compose -f docker-compose.yml.optimized \ -f docker-compose.services.yml.optimized \ -f docker-compose.clients.yml.optimized up -d # Selektive Services mit Profilen docker-compose -f docker-compose.services.yml.optimized \ --profile members --profile horses up -d ``` --- ## Migrationsleitfaden ### 🚀 Schnellstart #### 1. **Secrets generieren** ```bash # Alle erforderlichen Secrets generieren ./docker/secrets/setup-secrets.sh --all # Oder einzeln generieren ./docker/secrets/setup-secrets.sh --generate ./docker/secrets/setup-secrets.sh --validate ``` #### 2. **Umgebung konfigurieren** ```bash # Template kopieren und anpassen cp .env.template .env # Konfigurationswerte bearbeiten nano .env ``` #### 3. **Datenverzeichnisse erstellen** ```bash # Persistente Datenverzeichnisse erstellen mkdir -p ./data/{postgres,redis,prometheus,grafana,keycloak,consul,monitoring,desktop-app} ``` #### 4. **Services deployen** ```bash # Infrastruktur starten docker-compose -f docker-compose.yml.optimized up -d # Alle Services auf Gesundheit prüfen docker-compose -f docker-compose.yml.optimized ps # Microservices hinzufügen docker-compose -f docker-compose.yml.optimized \ -f docker-compose.services.yml.optimized up -d # Client-Anwendungen hinzufügen docker-compose -f docker-compose.yml.optimized \ -f docker-compose.services.yml.optimized \ -f docker-compose.clients.yml.optimized up -d ``` ### 🔄 Migration von Original-Konfiguration #### Schritt 1: Aktuelle Einrichtung sichern ```bash # Bestehende Services stoppen docker-compose down # Aktuelle Daten sichern (optional) cp -r data/ data.backup/ ``` #### Schritt 2: Konfiguration aktualisieren ```bash # Zuerst Secrets generieren ./docker/secrets/setup-secrets.sh --all # Umgebungskonfiguration aktualisieren cp .env.template .env # .env nach Bedarf bearbeiten ``` #### Schritt 3: Optimierte Konfiguration deployen ```bash # Mit neuer Konfiguration deployen docker-compose -f docker-compose.yml.optimized up -d ``` --- ## Sicherheits-Best-Practices ### 🛡️ Produktionssicherheits-Checkliste - [ ] **Secrets generiert**: Secrets-Setup-Script ausführen - [ ] **Dateiberechtigungen**: Secret-Dateien haben 600-Berechtigungen - [ ] **Netzwerkisolation**: Benutzerdefinierte Docker-Netzwerke verwenden - [ ] **Ressourcenlimits**: Alle Services haben CPU/Speicher-Limits - [ ] **Nicht-Root-Benutzer**: Anwendungen laufen als nicht-privilegierte Benutzer - [ ] **Schreibgeschützte Mounts**: Konfiguration schreibgeschützt gemountet - [ ] **Sicherheitsoptionen**: `no-new-privileges` aktiviert - [ ] **Health Checks**: Alle kritischen Services haben Health Checks - [ ] **Backup-Strategie**: Regelmäßige Daten-Backups konfiguriert - [ ] **Monitoring**: Prometheus und Grafana konfiguriert - [ ] **Log-Management**: Zentralisiertes Logging konfiguriert ### 🔐 Sicherheitsmonitoring #### Zugriffs-URLs (Standard-Konfiguration) - **Grafana Dashboard**: http://localhost:3000 - **Prometheus Metriken**: http://localhost:9090 - **Consul UI**: http://localhost:8500 - **Keycloak Admin**: http://localhost:8180/admin #### Zu überwachende Sicherheitsmetriken - Fehlgeschlagene Authentifizierungsversuche - Ressourcennutzungsmuster - Container-Neustart-Häufigkeit - Netzwerkverbindungsanomalien - Secret-Zugriffsmuster --- ## Fehlerbehebung ### 🔍 Häufige Probleme und Lösungen #### Problem 1: Secret-Dateiberechtigungen **Problem**: Container können Secret-Dateien nicht lesen **Lösung**: ```bash # Berechtigungen korrigieren chmod 600 docker/secrets/*.txt # Oder mit korrekten Berechtigungen neu generieren ./docker/secrets/setup-secrets.sh --force ``` #### Problem 2: Ressourcenbeschränkungen **Problem**: Services schlagen aufgrund von Ressourcenlimits fehl **Lösung**: ```bash # Ressourcennutzung prüfen docker stats # Limits in docker-compose-Dateien anpassen oder Systemressourcen erhöhen ``` #### Problem 3: Netzwerkkonnektivität **Problem**: Services können nicht kommunizieren **Lösung**: ```bash # Netzwerkkonfiguration prüfen docker network inspect meldestelle_meldestelle-network # Service-Gesundheit überprüfen docker-compose -f docker-compose.yml.optimized ps ``` #### Problem 4: Volume-Mount-Probleme **Problem**: Daten persistieren nicht oder Berechtigungsfehler **Lösung**: ```bash # Datenverzeichnisse mit korrekten Berechtigungen erstellen mkdir -p ./data/{postgres,redis,prometheus,grafana,keycloak,consul} chown -R 999:999 ./data/postgres # PostgreSQL-Benutzer chown -R 472:0 ./data/grafana # Grafana-Benutzer ``` ### 📊 Health Check-Befehle ```bash # Alle Service-Status prüfen docker-compose -f docker-compose.yml.optimized ps # Service-Logs anzeigen docker-compose -f docker-compose.yml.optimized logs [service-name] # Ressourcennutzung prüfen docker stats # Secrets validieren ./docker/secrets/setup-secrets.sh --validate # Konnektivität testen docker exec meldestelle-api-gateway curl -f http://postgres:5432 ``` --- ## Leistungstuning ### 🎯 Ressourcenoptimierungs-Richtlinien #### Speicherzuteilungsstrategie 1. **Infrastruktur-Services**: Höhere Speicherzuteilung für Datenbanken und Messaging 2. **Anwendungs-Services**: Ausgewogene CPU/Speicher für Microservices 3. **Client-Anwendungen**: Geringere Ressourcenanforderungen #### CPU-Zuteilungsstrategie 1. **I/O-gebundene Services** (Datenbank, Redis): Moderate CPU, hoher Speicher 2. **Rechenintensive Services** (Anwendungslogik): Höhere CPU-Zuteilung 3. **Statische Inhalts-Services** (Web-Apps): Geringere Gesamtressourcen #### JVM-Tuning für Java-Services ```yaml environment: JAVA_OPTS: | -XX:MaxRAMPercentage=75.0 -XX:+UseG1GC -XX:+UseStringDeduplication -XX:+UseContainerSupport -Djava.security.egd=file:/dev/./urandom ``` --- ## Monitoring und Observability ### 📈 Metriken-Sammlung #### Prometheus-Metriken - Container-Ressourcennutzung - Anwendungsleistungsmetriken - Health Check-Status - Netzwerkverkehrsmuster #### Grafana-Dashboards - Infrastruktur-Übersicht - Anwendungsleistung - Sicherheitsereignisse - Ressourcennutzungstrends #### Logging-Strategie - Zentralisiertes Logging über Docker-Logs - Strukturiertes JSON-Logging für Anwendungen - Log-Rotation und Aufbewahrungsrichtlinien - Sicherheitsereignis-Logging --- ## Fazit Die Docker-Konfigurationsoptimierung bietet: 1. **Verbesserte Sicherheit**: Vollständige Eliminierung fest kodierter Anmeldedaten und Implementierung von Docker Secrets 2. **Produktionsbereitschaft**: Umfassende Ressourcenlimits, Health Checks und Monitoring 3. **Verbesserte Leistung**: Optimierte Ressourcenzuteilung und Container-Konfigurationen 4. **Operational Excellence**: Automatisiertes Secret-Management, umfassende Dokumentation und Fehlerbehebungsleitfäden 5. **Skalierbarkeit**: Profilbasiertes Deployment und modulare Service-Architektur ### Nächste Schritte 1. **Optimierte Konfiguration deployen** in Entwicklungsumgebung 2. **Alle Sicherheitsmaßnahmen validieren** sind ordnungsgemäß implementiert 3. **Leistungsmetriken überwachen** und Ressourcenlimits nach Bedarf anpassen 4. **Backup- und Wiederherstellungsverfahren implementieren** für persistente Daten 5. **Automatisiertes Monitoring und Alerting einrichten** für Produktions-Deployment Bei Fragen oder Problemen mit der optimierten Konfiguration beziehen Sie sich auf den Fehlerbehebungsabschnitt oder konsultieren Sie die detaillierten Konfigurationskommentare in den docker-compose-Dateien.