Compare commits
2 Commits
70e97d3ece
...
083913cadb
| Author | SHA1 | Date | |
|---|---|---|---|
| 083913cadb | |||
| 4c0cc90734 |
@@ -215,6 +215,67 @@ Plus:
|
||||
- Vollständige Hardening-Story + restliche Trade-offs:
|
||||
[docs/SECURITY-HARDENING.md](docs/SECURITY-HARDENING.md)
|
||||
|
||||
### ⚠️ Wichtig: gzip für `/api/*` am Reverse-Proxy deaktivieren (BREACH-Schutz)
|
||||
|
||||
Wenn ein TLS-Reverse-Proxy (Nginx Proxy Manager, Caddy, eigener Nginx, …) HTTPS
|
||||
terminiert und Antworten gzip-komprimiert, ist die **BREACH-Attacke** (CVE-2013-3587)
|
||||
theoretisch möglich: aus der gzip-komprimierten Response-Größe könnten unter
|
||||
ungünstigen Umständen Secrets erraten werden. Auch wenn unsere JWT-basierte SPA
|
||||
das Risiko praktisch klein hält (keine reflektierten Secrets im Response-Body),
|
||||
geht ein Penetration-Test mit testssl trotzdem auf „medium – Ausnutzbar: Ja".
|
||||
|
||||
**Lösung:** gzip-Komprimierung nur für statische Frontend-Assets erlauben, für
|
||||
`/api/*` deaktivieren. Statische Bundles bleiben damit performant ausgeliefert,
|
||||
JSON-API-Responses werden ohne Kompression gesendet → BREACH ist dort kein
|
||||
Einfallstor mehr.
|
||||
|
||||
**Nginx Proxy Manager (NPM):**
|
||||
1. Proxy-Hosts → den CRM-Host → **Edit**
|
||||
2. Tab **Custom Locations** → **„Add location"**
|
||||
3. **Define location:** `/api/`
|
||||
4. **Scheme:** `http`, **Forward Hostname/IP:** wie im Haupt-Host
|
||||
(z.B. `172.0.2.39`), **Forward Port:** `3010`
|
||||
5. Zahnrad rechts an der Location → erweiterte Config eintragen:
|
||||
```nginx
|
||||
gzip off;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
# Information-Disclosure-Header weg (Pentest-Hygiene):
|
||||
more_clear_headers Server X-Served-By;
|
||||
```
|
||||
6. **Save** (Location), **Save** (Proxy-Host)
|
||||
|
||||
> Der `more_clear_headers`-Befehl kommt aus dem `headers-more`-Modul, das
|
||||
> bei NPM standardmäßig dabei ist. Damit verschwinden die Banner
|
||||
> `Server: openresty` und `x-served-by: …` aus den Responses – Pentest-
|
||||
> Tools können den eingesetzten Webserver nicht mehr direkt aus dem Header
|
||||
> ablesen. Wer das auch auf der Hauptlocation will, kann denselben Eintrag
|
||||
> zusätzlich im **Advanced**-Tab des Proxy-Hosts setzen.
|
||||
|
||||
**Plain Nginx** (falls eigener Nginx statt NPM):
|
||||
```nginx
|
||||
location /api/ {
|
||||
gzip off;
|
||||
proxy_pass http://backend:3010;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
more_clear_headers Server X-Served-By; # braucht headers-more-Modul
|
||||
}
|
||||
# Optional global im server { … }-Block:
|
||||
server_tokens off;
|
||||
```
|
||||
|
||||
**Verifikation:**
|
||||
```bash
|
||||
# 1) gzip ist für /api/ deaktiviert (sollte leer sein)
|
||||
curl -sI -H 'Accept-Encoding: gzip' https://kundencenter.deine-domain.de/api/health \
|
||||
| grep -i content-encoding
|
||||
|
||||
# 2) Server-/x-served-by-Banner sind weg (sollte leer sein)
|
||||
curl -sI https://kundencenter.deine-domain.de/api/health \
|
||||
| grep -iE '^(server|x-served-by):'
|
||||
```
|
||||
|
||||
## Developer-Tools aktivieren
|
||||
|
||||
Die Developer-Tools (Datenbankstruktur, ER-Diagramm) sind standardmäßig für Admins verfügbar. Falls der Menüpunkt nicht erscheint:
|
||||
|
||||
Reference in New Issue
Block a user