meldestelle/DOCKER-OPTIMIZATION-DE.md
2025-10-06 14:58:02 +02:00

14 KiB

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

# VORHER (UNSICHER)
environment:
  POSTGRES_PASSWORD: meldestelle
  KEYCLOAK_CLIENT_SECRET: K5RqonwVOaxPKaXVH4mbthSRbjRh5tOK
  GF_SECURITY_ADMIN_PASSWORD: admin

Lösung: Docker Secrets mit sicherem dateibasiertem Management

# 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:

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

# 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:

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:

# 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

# 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

# Template kopieren und anpassen
cp .env.template .env

# Konfigurationswerte bearbeiten
nano .env

3. Datenverzeichnisse erstellen

# Persistente Datenverzeichnisse erstellen
mkdir -p ./data/{postgres,redis,prometheus,grafana,keycloak,consul,monitoring,desktop-app}

4. Services deployen

# 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

# Bestehende Services stoppen
docker-compose down

# Aktuelle Daten sichern (optional)
cp -r data/ data.backup/

Schritt 2: Konfiguration aktualisieren

# Zuerst Secrets generieren
./docker/secrets/setup-secrets.sh --all

# Umgebungskonfiguration aktualisieren
cp .env.template .env
# .env nach Bedarf bearbeiten

Schritt 3: Optimierte Konfiguration deployen

# 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)

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:

# 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:

# 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:

# 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:

# 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

# 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

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.