Umfangreiches Refactoring der Projektkonfiguration zur klaren Trennung von Build-, Runtime- und Applikations-Logik. Änderungen im Detail: - Struktur: Neuorganisation des `config/` Verzeichnisses in logische Bereiche: - `config/docker`: Reine Infrastruktur-Configs (Postgres, Redis, Nginx, Monitoring). - `config/quality`: Statische Code-Analyse (Detekt, Lint). - `config/app`: Gemeinsame Spring-Boot-Konfigurationen. - Docker Compose: - Einführung von Profilen (`infra`, `backend`, `ops`, `gui`, `tools`) für gezieltes Starten von Teilbereichen. - Anpassung aller Volume-Pfade auf die neue Struktur. - Spring Boot Config: - Zentralisierung gemeinsamer Einstellungen (Datasource, Redis, JPA) in `config/app/base-application.yml`. - Parametrisierung der Hosts für nahtlosen Wechsel zwischen Docker und Localhost. - Bereinigung der service-spezifischen `application.yaml` Dateien (z.B. Ping-Service). - Cleanup: Entfernen redundanter "Ghost-Files" (`versions.toml`, `central.toml`, `config/.env`), um eine echte Single Source of Truth (SSoT) zu gewährleisten.
270 lines
7.6 KiB
Markdown
270 lines
7.6 KiB
Markdown
# SSL/TLS Zertifikat-Setup für die Produktionsumgebung
|
|
|
|
Dieses Verzeichnis enthält SSL/TLS-Zertifikate und Schlüssel zur Absicherung der Meldestelle-Anwendung in der Produktionsumgebung.
|
|
|
|
## Verzeichnisstruktur
|
|
|
|
```
|
|
config/ssl/
|
|
├── postgres/ # PostgreSQL SSL-Zertifikate
|
|
├── redis/ # Redis TLS-Zertifikate
|
|
├── keycloak/ # Keycloak HTTPS-Zertifikate
|
|
├── prometheus/ # Prometheus HTTPS-Zertifikate
|
|
├── grafana/ # Grafana HTTPS-Zertifikate
|
|
├── nginx/ # Nginx SSL-Zertifikate
|
|
└── README.md # Diese Datei
|
|
```
|
|
|
|
## Zertifikat-Anforderungen
|
|
|
|
### 1. PostgreSQL SSL-Zertifikate
|
|
|
|
Platzieren Sie die folgenden Dateien in `config/ssl/postgres/`:
|
|
|
|
- `server.crt` - Server-Zertifikat
|
|
- `server.key` - Privater Server-Schlüssel
|
|
- `ca.crt` - Certificate Authority-Zertifikat
|
|
|
|
### 2. Redis TLS-Zertifikate
|
|
|
|
Platzieren Sie die folgenden Dateien in `config/ssl/redis/`:
|
|
|
|
- `redis.crt` - Redis Server-Zertifikat
|
|
- `redis.key` - Privater Redis Server-Schlüssel
|
|
- `ca.crt` - Certificate Authority-Zertifikat
|
|
- `redis.dh` - Diffie-Hellman Parameter
|
|
|
|
### 3. Keycloak HTTPS-Zertifikate
|
|
|
|
Platzieren Sie die folgenden Dateien in `config/ssl/keycloak/`:
|
|
|
|
- `server.crt.pem` - Server-Zertifikat im PEM-Format
|
|
- `server.key.pem` - Privater Server-Schlüssel im PEM-Format
|
|
|
|
### 4. Prometheus HTTPS-Zertifikate
|
|
|
|
Platzieren Sie die folgenden Dateien in `config/ssl/prometheus/`:
|
|
|
|
- `prometheus.crt` - Prometheus Server-Zertifikat
|
|
- `prometheus.key` - Privater Prometheus Server-Schlüssel
|
|
- `web.yml` - Prometheus Web-Konfigurationsdatei
|
|
|
|
### 5. Grafana HTTPS-Zertifikate
|
|
|
|
Platzieren Sie die folgenden Dateien in `config/ssl/grafana/`:
|
|
|
|
- `server.crt` - Grafana Server-Zertifikat
|
|
- `server.key` - Privater Grafana Server-Schlüssel
|
|
|
|
### 6. Nginx SSL-Zertifikate
|
|
|
|
Platzieren Sie die folgenden Dateien in `config/ssl/nginx/`:
|
|
|
|
- `server.crt` - Haupt-SSL-Zertifikat
|
|
- `server.key` - Privater Haupt-SSL-Schlüssel
|
|
- `dhparam.pem` - Diffie-Hellman Parameter
|
|
|
|
## Generierung selbstsignierter Zertifikate (Entwicklung/Test)
|
|
|
|
⚠️ **Warnung**: Verwenden Sie selbstsignierte Zertifikate nur für Entwicklung und Tests. Nutzen Sie ordnungsgemäß von einer CA signierte Zertifikate in der Produktion.
|
|
|
|
### CA-Zertifikat generieren
|
|
|
|
```bash
|
|
# CA privaten Schlüssel erstellen
|
|
openssl genrsa -out ca.key 4096
|
|
|
|
# CA-Zertifikat erstellen
|
|
openssl req -new -x509 -days 365 -key ca.key -out ca.crt \
|
|
-subj "/C=AT/ST=Vienna/L=Vienna/O=Meldestelle/OU=IT/CN=Meldestelle-CA"
|
|
```
|
|
|
|
### Server-Zertifikate generieren
|
|
|
|
```bash
|
|
# Für jeden Service privaten Schlüssel und Certificate Signing Request generieren
|
|
openssl genrsa -out server.key 2048
|
|
openssl req -new -key server.key -out server.csr \
|
|
-subj "/C=AT/ST=Vienna/L=Vienna/O=Meldestelle/OU=IT/CN=ihre-domain.com"
|
|
|
|
# Zertifikat mit CA signieren
|
|
openssl x509 -req -days 365 -in server.csr -CA ca.crt -CAkey ca.key \
|
|
-CAcreateserial -out server.crt
|
|
|
|
# Aufräumen
|
|
rm server.csr
|
|
```
|
|
|
|
### Diffie-Hellman Parameter generieren
|
|
|
|
```bash
|
|
openssl dhparam -out dhparam.pem 2048
|
|
```
|
|
|
|
## Produktions-Zertifikat Setup
|
|
|
|
### Option 1: Let's Encrypt (Empfohlen)
|
|
|
|
Verwenden Sie Certbot, um kostenlose SSL-Zertifikate zu erhalten:
|
|
|
|
```bash
|
|
# Certbot installieren
|
|
sudo apt-get install certbot
|
|
|
|
# Zertifikate erhalten
|
|
sudo certbot certonly --standalone -d ihre-domain.com -d www.ihre-domain.com
|
|
|
|
# Zertifikate in entsprechende Verzeichnisse kopieren
|
|
sudo cp /etc/letsencrypt/live/ihre-domain.com/fullchain.pem config/ssl/nginx/server.crt
|
|
sudo cp /etc/letsencrypt/live/ihre-domain.com/privkey.pem config/ssl/nginx/server.key
|
|
```
|
|
|
|
### Option 2: Kommerzielle CA
|
|
|
|
1. Certificate Signing Requests (CSRs) generieren
|
|
2. CSRs an Ihre Certificate Authority übermitteln
|
|
3. Signierte Zertifikate herunterladen
|
|
4. Zertifikate in entsprechende Verzeichnisse platzieren
|
|
|
|
### Option 3: Interne CA
|
|
|
|
Bei Verwendung einer internen Certificate Authority:
|
|
|
|
1. CSRs für jeden Service generieren
|
|
2. Zertifikate mit Ihrer internen CA signieren
|
|
3. CA-Zertifikat an alle Clients verteilen
|
|
|
|
## Dateiberechtigungen
|
|
|
|
Stellen Sie ordnungsgemäße Dateiberechtigungen für die Sicherheit sicher:
|
|
|
|
```bash
|
|
# Restriktive Berechtigungen für private Schlüssel setzen
|
|
chmod 600 config/ssl/*/server.key
|
|
chmod 600 config/ssl/*/redis.key
|
|
chmod 600 config/ssl/*/prometheus.key
|
|
|
|
# Lesbare Berechtigungen für Zertifikate setzen
|
|
chmod 644 config/ssl/*/server.crt
|
|
chmod 644 config/ssl/*/ca.crt
|
|
|
|
# Verzeichnisberechtigungen setzen
|
|
chmod 755 config/ssl/*/
|
|
```
|
|
|
|
## Docker Volume Mounts
|
|
|
|
Die Zertifikate werden als schreibgeschützte Volumes in die Docker-Container eingebunden:
|
|
|
|
```yaml
|
|
volumes:
|
|
- ./config/ssl/nginx:/etc/ssl/nginx:ro
|
|
- ./config/ssl/keycloak:/opt/keycloak/conf:ro
|
|
# ... weitere Mounts
|
|
```
|
|
|
|
## Zertifikat-Erneuerung
|
|
|
|
### Automatisierte Erneuerung (Let's Encrypt)
|
|
|
|
Richten Sie einen Cron-Job für automatische Erneuerung ein:
|
|
|
|
```bash
|
|
# Zu Crontab hinzufügen
|
|
0 12 * * * /usr/bin/certbot renew --quiet --post-hook "docker-compose -f docker-compose.prod.yml restart nginx"
|
|
```
|
|
|
|
### Manuelle Erneuerung
|
|
|
|
1. Neue Zertifikate generieren
|
|
2. Alte Zertifikate in SSL-Verzeichnissen ersetzen
|
|
3. Betroffene Services neu starten:
|
|
|
|
```bash
|
|
docker-compose -f docker-compose.prod.yml restart nginx keycloak grafana prometheus
|
|
```
|
|
|
|
## Sicherheits-Best-Practices
|
|
|
|
1. **Starke Verschlüsselung verwenden**: Mindestens 2048-Bit RSA-Schlüssel oder 256-Bit ECDSA-Schlüssel verwenden
|
|
2. **Regelmäßige Rotation**: Zertifikate regelmäßig rotieren (jährlich oder halbjährlich)
|
|
3. **Sichere Speicherung**: Private Schlüssel sicher speichern und Zugriff beschränken
|
|
4. **Ablauf überwachen**: Überwachung für Zertifikat-Ablauf einrichten
|
|
5. **HSTS verwenden**: HTTP Strict Transport Security aktivieren
|
|
6. **Perfect Forward Secrecy**: ECDHE-Cipher-Suites verwenden
|
|
7. **Certificate Transparency**: CT-Logs auf unbefugte Zertifikate überwachen
|
|
|
|
## Fehlerbehebung
|
|
|
|
### Häufige Probleme
|
|
|
|
1. **Berechtigung verweigert**
|
|
|
|
```bash
|
|
# Dateiberechtigungen korrigieren
|
|
sudo chown -R $USER:$USER config/ssl/
|
|
chmod -R 755 config/ssl/
|
|
chmod 600 config/ssl/*/server.key
|
|
```
|
|
|
|
2. **Zertifikat-Verifizierung fehlgeschlagen**
|
|
|
|
```bash
|
|
# Zertifikat verifizieren
|
|
openssl x509 -in config/ssl/nginx/server.crt -text -noout
|
|
|
|
# Zertifikatskette prüfen
|
|
openssl verify -CAfile config/ssl/nginx/ca.crt config/ssl/nginx/server.crt
|
|
```
|
|
|
|
3. **TLS-Handshake-Fehler**
|
|
- Gültigkeitsdaten des Zertifikats prüfen
|
|
- Verifizieren, dass Zertifikat zum Hostnamen passt
|
|
- Ordnungsgemäße Cipher-Suite-Konfiguration sicherstellen
|
|
|
|
### SSL-Konfiguration testen
|
|
|
|
```bash
|
|
# SSL-Zertifikat testen
|
|
openssl s_client -connect ihre-domain.com:443 -servername ihre-domain.com
|
|
|
|
# Mit spezifischem Protokoll testen
|
|
openssl s_client -connect ihre-domain.com:443 -tls1_2
|
|
|
|
# Zertifikat-Ablauf prüfen
|
|
openssl x509 -in config/ssl/nginx/server.crt -noout -dates
|
|
|
|
# Zertifikat-Details anzeigen
|
|
openssl x509 -in config/ssl/nginx/server.crt -text -noout
|
|
```
|
|
|
|
## Monitoring und Wartung
|
|
|
|
### Zertifikat-Überwachung
|
|
|
|
Implementieren Sie Überwachung für:
|
|
|
|
- Zertifikat-Ablaufdaten
|
|
- Zertifikat-Gültigkeit
|
|
- SSL/TLS-Handshake-Erfolg
|
|
- Cipher-Suite-Verwendung
|
|
|
|
### Wartungsaufgaben
|
|
|
|
- Regelmäßige Überprüfung der Zertifikat-Gültigkeit
|
|
- Aktualisierung der Cipher-Suites
|
|
- Überwachung der Sicherheitsupdates
|
|
- Backup der Zertifikate und privaten Schlüssel
|
|
|
|
## Weitere Ressourcen
|
|
|
|
- [Mozilla SSL Configuration Generator](https://ssl-config.mozilla.org/)
|
|
- [SSL Labs Server Test](https://www.ssllabs.com/ssltest/)
|
|
- [Let's Encrypt Dokumentation](https://letsencrypt.org/docs/)
|
|
- [OpenSSL Dokumentation](https://www.openssl.org/docs/)
|
|
|
|
---
|
|
|
|
**Letzte Aktualisierung**: 25. Juli 2025
|
|
|