Risiken bei der Aktivierung von Nginx Upstream Keepalive

Risiken bei der Aktivierung von Nginx Upstream Keepalive

Ich verwende nginx als HTTP-Reverse-Proxy für Apache mit PHP-Backend (ich brauche .htaccess-Flexibilität für Webmaster). Als ich sah, dass in Apache-Protokollen http/1.0 verwendet wurde, suchte ich nach, wie man eine Keep-Alive-Verbindung aktiviert.

Bei meiner Suche fand ich diesen Blogbeitrag von Nginxhttps://www.nginx.com/blog/avoiding-top-10-nginx-configuration-mistakes/#no-keepalives

Standardmäßig öffnet NGINX für jede neue eingehende Anfrage eine neue Verbindung zu einem Upstream-Server (Backend-Server). Das ist sicher, aber ineffizient,[...]

Wenn das Standardverhalten sicher ist, welche Risiken birgt die Aktivierung von Upstream-Keepalive?

Antwort1

Das Proxying einer Verbindung mit Keepalive gilt aufgrund von HTTP-Desynchronisierungsangriffen/Anforderungsschmuggel als Risiko. Dies tritt auf, wenn das Backend verschiedene Clientanforderungen nicht auf die gleiche Weise aufteilt wie das Frontend. Das Schließen der Verbindung nach jeder Anforderung ist die „sichere“ Option, da dadurch klar abgegrenzt wird, wann die aktuelle Anforderung beendet ist.

Sehenhttps://book.hacktricks.xyz/pentesting-web/http-request-smugglingfür mehr Informationen.

Antwort2

Wie ich bereits sagte, ist KeepAlive eine Optimierung zum Zwischenspeichern der Verbindung. Es soll Datenverkehr mit hohem Durchsatz unterstützen. Ich sehe keine Risiken bei der Aktivierung, tatsächlich würde es in jedem Fall bessere Ergebnisse bringen.

Antwort3

Das Standardverhalten, bei dem für jede Anforderung eine Verbindung mit Upstream hergestellt wird, ist bei hoher Last nicht sicher. Aus folgenden Gründen:

  1. Sobald vom selben Client eine Anforderung an den Nginx-Server geht, wird eine neue Verbindung mit dem Upstream-Server hergestellt und hierfür der neue verfügbare lokale Port verwendet.
  2. Sobald die Anfrage abgeschlossen ist, wechselt die Verbindung auf diesem lokalen Port für 120 Sekunden von „hergestellt“ auf „TIME_WAIT“. Das bedeutet, dass dieser lokale Port für 120 Sekunden nicht für eine neue Anfrage wiederverwendet werden kann.
  3. Jetzt kommt die zweite Anfrage vom selben Client, Schritt 1 wird wiederholt.
  4. auf diese Weise für schwere Last,
    1. Möglicherweise verwenden Sie alle verfügbaren lokalen Ports auf dem Nginx (65 KB).
    2. Das Erstellen und Beenden einer Verbindung bei jeder Anfrage ist ein sehr kostspieliger Vorgang.

Um dies zu vermeiden, können Sie die Verbindung am besten zwischenspeichern, sodass Sie bei einer erneuten Anforderung dieselbe Verbindung mit dem Upstream-Server erneut verwenden können (auf demselben lokalen Port wie bei der letzten Anforderung).

Grüße Vj

verwandte Informationen