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:truefü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
maxmemoryundallkeys-lruPolicy - 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-privilegesaktiviert - 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:
# 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
- Infrastruktur-Services: Höhere Speicherzuteilung für Datenbanken und Messaging
- Anwendungs-Services: Ausgewogene CPU/Speicher für Microservices
- Client-Anwendungen: Geringere Ressourcenanforderungen
CPU-Zuteilungsstrategie
- I/O-gebundene Services (Datenbank, Redis): Moderate CPU, hoher Speicher
- Rechenintensive Services (Anwendungslogik): Höhere CPU-Zuteilung
- 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:
- Verbesserte Sicherheit: Vollständige Eliminierung fest kodierter Anmeldedaten und Implementierung von Docker Secrets
- Produktionsbereitschaft: Umfassende Ressourcenlimits, Health Checks und Monitoring
- Verbesserte Leistung: Optimierte Ressourcenzuteilung und Container-Konfigurationen
- Operational Excellence: Automatisiertes Secret-Management, umfassende Dokumentation und Fehlerbehebungsleitfäden
- Skalierbarkeit: Profilbasiertes Deployment und modulare Service-Architektur
Nächste Schritte
- Optimierte Konfiguration deployen in Entwicklungsumgebung
- Alle Sicherheitsmaßnahmen validieren sind ordnungsgemäß implementiert
- Leistungsmetriken überwachen und Ressourcenlimits nach Bedarf anpassen
- Backup- und Wiederherstellungsverfahren implementieren für persistente Daten
- 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.