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

428 lines
14 KiB
Markdown

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