428 lines
14 KiB
Markdown
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.
|