408 Fehler werden in unseren Protokollen ohne Anfrage oder Benutzerprogramm abgerufen

36

Ich bekomme viele Anfragen in unseren Apache-Logs, die so aussehen

www.example.com:80 10.240.1.8 - - [06/Mar/2013:00:39:19 +0000] "-" 408 0 "-" "-" -

Es scheint keine Anfrage und kein User-Agent zu geben. Hat das schon mal jemand gesehen?

Glenn Slaven
quelle

Antworten:

29

Führen Sie Ihre Webserver möglicherweise in Amazon hinter einem Elastic Load Balancer aus?

Es scheint, dass sie aufgrund ihrer Gesundheitskontrollen eine Menge von 408 Antworten generieren .

Einige der Lösungen aus diesem Forenthread:

  • RequestReadTimeout header=0 body=0

    Dadurch werden die 408 Antworten deaktiviert, wenn eine Anforderung eine Zeitüberschreitung aufweist.

  • Ändern Sie den ELB-Health-Check in einen anderen Port.
  • Deaktivieren Sie die Protokollierung für die ELB-IP-Adressen mit:

    SetEnvIf Remote_Addr "10\.0\.0\.5" exclude_from_log
    CustomLog logs/access_log common env=!exclude_from_log
    

Und aus diesem Blogeintrag :

  • Passen Sie das Anforderungszeitlimit auf 60 oder höher an.
Ladadadada
quelle
2
nach meinem verständnis wird dies sie dem slowloris angriff aussetzen, ein anständiges reqtimeout scheint heutzutage für jeden nützlich zu sein, der apache verwendet
neofutur
Wenn Sie hinter einer ELB stehen, ist Slowloris kein Problem.
Ladadadada
2
RequestReadTimeout header=0 body=0würde das Zeitlimit für das Lesen von Anfragen alle zusammen deaktivieren, ich würde dies nicht empfehlen
mikejonesey
@Ladadadada Ich denke, Sie brauchen immer noch einen langsamen Loris-Schutz, da http als TCP-Proxy fungiert. Wenn https ausgelagert ist, werden HTTP-Anforderungen weitergeleitet und nicht TCP. Es gibt jedoch keine Filter für langsame Verbindungen. Es gibt nur eine Zeitüberschreitung für die Antwort.
Mikejonesey
@Ladadadada Sie irren sich, ELB oder ALB tun wenig bis gar nichts gegen Slowloris und die meisten Webserver sind betroffen. Weitere Informationen hierzu finden Sie in meiner AWS-Frage und hier: forums.aws.amazon.com/thread.jspa?threadID=269176
Cristiano Coelho
9

Etwas verbindet sich mit dem Port und sendet dann niemals Daten. HTTP 408 ist ein "Timeout" -Fehler. Hier gibt es eine gute Beschreibung: http://www.checkupdown.com/status/E408.html

Insyte
quelle
1
Während dieser Link die Frage beantworten kann, ist es besser, die wesentlichen Teile der Antwort hier einzuschließen und den Link als Referenz bereitzustellen. Nur-Link-Antworten können ungültig werden, wenn sich die verlinkte Seite ändert.
Kasperd
Nachdem ich gerade eine Liste von über 100 IPs durchgesehen habe, die 408s auf ihre leeren Anfragen erhalten haben, fällt auf, dass die Mehrheit vom chinesischen Festland stammt, und ich vermute, dass das Problem in erster Linie mit Überlastung zusammenhängt. Die Überlastung führt dazu, dass der Verbindungsaufbau erfolgreich ist, der Anforderungsheader jedoch nicht gesendet wird. Die grenzüberschreitende Bandbreite aus China ist sehr überlastet und die nicht festlandbezogenen Verbindungen, die ebenfalls leer ankamen, waren Streuungen aus Brasilien, Europa und den ländlichen USA, die plausibel ähnliche Probleme beim Erreichen eines Servers an der Westküste der USA haben.
ClearCrescendo
8

Hier gibt es bereits einige gute Antworten, aber ich möchte einen zusätzlichen Hinweis riskieren, der nicht speziell angesprochen wurde. Wie viele der bereits erwähnten früheren Kommentatoren zeigt 408 eine Zeitüberschreitung an; und es gibt eine ganze Reihe von Umständen, unter denen Timeouts auf einem Webserver auftreten.

Trotzdem können in einer Vielzahl von Fällen, in denen Ihr Server auf Exploits überprüft wird, 408 Fehler generiert werden. In solchen Fällen stellen Clients selten einen Benutzeragenten bereit und beenden Verbindungen häufig abrupt, was zu einem Abbruch des Herunterfahrens dieser Verbindung führt, was zu einem 408-Fehler führen kann.

Nehmen wir zum Beispiel an, ich bin ein heimtückischer Hacker, der das Internet nach Computern durchsucht, die immer noch für die POODLE-Sicherheitsanfälligkeit anfällig sind. Als solches habe ich ein Skript geschrieben, das Verbindungen zu großen Teilen von IP-Adressen öffnet, um Server zu finden, die SSL Version 3 akzeptieren. Später werde ich diese Liste verwenden, um gezielt nach dem POODLE-Exploit zu suchen. Dieses erste Skript baut lediglich eine Verbindung mit openssl auf, um nach SSLv3 zu suchen:

openssl s_client -connect [IP]:443 -ssl3

Dieser Befehl führt in vielen Apache-Konfigurationen zu einer 408-Nachricht, genau wie Sie sie beschrieben haben. Die Ausführung dieses Befehls auf zwei eigenen Servern führte zu diesem Eintrag im Zugriffsprotokoll:

<remote IP address>  - - [04/Nov/2015:08:09:33 -0500] "-" 408 - "-" "-"

Ich wollte dies klarstellen, da selbst in einer Situation, in der OP keine Form des Lastenausgleichs verwendet, 408 Fehler unter verschiedenen Umständen auftreten können - einige böswillig, einige weisen auf Probleme mit dem Client hin, andere auf Probleme mit dem Server. (Ich habe in dem von OP bereitgestellten Protokoll festgestellt, dass eine lokale IP als Remote-IP angegeben wurde, OP erwähnte jedoch nicht ausdrücklich die Verwendung eines Lastenausgleichs, sodass ich nicht sicher war, ob OP für diese Zwecke einfach eine nicht routbare IP verwendet hatte der Demonstration, wie er es mit der URL tat)

Wie auch immer, obwohl mein Beitrag offensichtlich zu spät ist, um dem OP zu helfen, könnte er hoffentlich anderen helfen, die hier ankommen und nach einer Lösung für all diese verdammten Timeout-Fehler suchen.

Josh Wieder
quelle
6

Es gibt verschiedene Gründe für ein 408 Timeout. Aber gehen wir mal davon aus, dass alles in Ordnung ist, dann tauchen diese 408 irgendwann in Ihrem Zugriffsprotokoll auf - also 408 0 "-" "-".

Wie viele im Netz betonen, stellt ein 408 eine Verbindung dar, die hergestellt wird, aber in der entsprechenden Zeitskala wird keine Anfrage gesendet, weshalb der Server die Verbindung mit einem 408 abbricht - "Welchen Teil von Timeout verstehst du nicht".

Ich denke, das ist eine unerfahrene Antwort und zeigt ein völliges Unverständnis darüber, wie einige Sicherheitsmethoden mit Webserver-Software funktionieren.

Also zurück zum Anfang, warum sehe ich all diese 408er? Eine Sache, die Sie mit dem Rest von uns, der einen Server verwaltet, gemeinsam haben werden, ist die enorme Anzahl von Angriffen, die Sie täglich erhalten. Was machen Sie jetzt damit? Nun: Sie wenden Ihre gewählten Sicherheitsmethoden an, um damit umzugehen. Dies ändert sich.

Nehmen wir ein sehr einfaches Beispiel: Geben Sie eine IP-Adresse ein. In einer iptabes-Datei (rules.v4) ist "-A ufw-user-input -s 37.58.64.228 -j DROP" enthalten. Mit 37.58.64.228 erkennt die Firewall die IP und trennt die Verbindung. In vielen Konfigurationen würden Sie nicht einmal wissen, dass es an die Tür geklopft hat.

Nehmen wir nun ein erweitertes Beispiel: Trennen Sie die Verbindung anhand einiger Kriterien. In einer Iptabes-Datei (rules.v4) ist "-EINGABE -p tcp -m tcp --dport 80 -m Zeichenfolge --string" cgi "--algo bm --to 1000 -j DROP" enthalten. Dies ist anders, da wir in dieser iptable-Regel sagen, dass Sie sich die ersten 1000 Bytes der Anforderungszeichenfolge ansehen und prüfen, ob Sie eine Unterzeichenfolge von "cgi" finden können. Wenn Sie diese Unterzeichenfolge finden, gehen Sie zu keiner Trennen Sie einfach die Verbindung.

Hier ist die Sicherheitsmethode gut, aber was Ihre Protokolle betrifft irreführend. Das 408 0 "-" "-", das generiert wird, ist das Beste, was Apache unter diesen Umständen tun kann. Die Verbindung wurde hergestellt und die Anforderung musste bis zu einem bestimmten Punkt akzeptiert werden, um die Zeichenfolgenvergleichsregel anzuwenden. Dies führt letztendlich zu einer 408, da Ihre Regel die Kriterien für das Trennen der Verbindung erfüllt. Unsere kleinen Neulinge könnten also nicht falscher liegen, wenn sie es versuchen würden. Es wurde eine Verbindung hergestellt und eine Anfrage wurde empfangen (unter diesen Umständen ist sie nur nicht sichtbar). Obwohl ein 408 generiert wird, handelt es sich nicht um ein Timeout. Ihr Server hat die Verbindung einfach getrennt, nachdem die Anforderung in Verbindung mit Ihrer Firewall-Regel gestellt wurde. Es gibt viele andere Regeln, die dieselbe Situation schaffen würden. Don'

Im Idealfall würde es einen anderen von Apache generierten Fehlercode geben, zum Beispiel '499', was bedeutet: 'Server hat Ihre Anfrage gelesen und festgestellt, dass es einfach nicht stört, Sie zu unterhalten - Sod Off HaHa'.

Mit der neuesten Webserver-Software können Sie DOS-Angriffe praktisch ausschließen, und das neue Gen von Browsern mit Vorhersagefunktionen verursacht dieses Problem nicht, wie einige vorgeschlagen haben.

Kurz gesagt, der 408 wird generiert, weil der Server auf die Anforderung nicht geantwortet hat, was das Timeout der Verbindung für den Client betrifft, wenn der Server in Wirklichkeit die Anforderung gelesen hat, die Verbindung jedoch aus anderen Gründen als einem Wartezeitlimit abgebrochen hat eine Anfrage.

Kev
quelle
2
Aber WARUM hat es die Verbindung unterbrochen ? Wir sehen, dass dies Server-Protokolle sind, keine Client-Protokolle.
Erick Robertson
5

Wir hatten genau dieses Problem und haben eine ganze Weile darüber nachgedacht. Die beste Lösung wurde vom ELB-Team des AWS-Supports vorgeschlagen. Es hängt im Wesentlichen davon ab, dass sichergestellt wird, dass die Timeout-Einstellungen Ihres httpd-Servers alle größer sind als Ihre ELB- idle timeoutEinstellung (die standardmäßig 60 Sekunden beträgt).

  • Stellen Sie sicher, dass Ihr Apache- TimeoutAnweisungswert doppelt so hoch ist wie die idle timeoutEinstellung Ihres ELB.
  • Aktivieren Sie die KeepAliveFunktion, und stellen Sie sicher, dass sie MaxKeepAliveRequestssehr groß ist (entweder 0 für unendlich oder sehr hoch, wie 2000) und KeepAliveTimeoutgrößer als Ihre ELBs idle timeout.

Wir haben festgestellt, dass durch die KeepAliveEinstellung (und die zugehörigen Einstellungen) die Anzahl der 408-Sekunden auf 0 reduziert wurde (wir sehen nur wenige, aber nur sehr wenige).

dsummersl
quelle
Leider benutze ich die elastische Bohnenstange. Ich habe diese Optionen nicht zur Verfügung.
Erick Robertson
3

Ich hatte dieses Problem hinter AWS Elastic Load Balancer. Die Integritätsprüfungen ergaben eine schreckliche Anzahl von 408 Antworten im Protokoll.

Die einzige Lösung , die für mich gearbeitet wurde haben Load Balancer Idle Timeout Einstellung niedriger als der Gesundheitscheck der Antwort - Timeout .

Přemysl Růžička
quelle
0

Ein Kollege bemerkte kürzlich, dass mein letzter Beitrag zwar eine gültige Erklärung lieferte, wie ein 408 mit einer Sicherheitsmaßnahme in Verbindung gebracht werden könne, aber keine Lösung bot.

Piped Access Log ist meine persönliche Lösung.

Das Folgende sollte bei den meisten Ubuntu-Konfigurationen sofort funktionieren und bei anderen Apache-Konfigurationen nur minimale Änderungen erfordern. Ich habe PHP gewählt, weil es am einfachsten zu verstehen ist. Es gibt zwei Skripte: Das erste verhindert, dass ein 408 in Ihr Zugriffsprotokoll geschrieben wird. Das zweite Skript sendet alle 408s an eine separate Protokolldatei. In beiden Fällen ist das Ergebnis nicht mehr 408s in Ihrem Zugriffsprotokoll. Sie entscheiden, welches Skript Sie implementieren möchten.

Benutze deinen bevorzugten Texteditor, ich benutze Nano. Öffnen Sie die Datei mit Ihren Anweisungen 'LogFormat' und 'CustomLog'. Kommentieren Sie die Originale mit dem üblichen # aus und fügen Sie Folgendes hinzu. Diese Anweisungen finden Sie in der folgenden Datei.

sudo nano / etc / apache2 / sites-available / default

LogFormat "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" AccessLogPipe

CustomLog "|/var/log/apache2/PipedAccessLog.php" AccessLogPipe env=!dontlog

HINWEIS: Ich protokolliere keine Bilder in meinem Zugriffsprotokoll. In meiner etc / apache2 / httpd.conf Datei füge ich die Zeile ein

SetEnvIfNoCase Request_URI ".(gif)|(jpg)|(png)|(css)|(js)|(ico)$" dontlog

Wenn dies für Sie nicht von Interesse ist, entfernen Sie die env=!dontlogaus der CustomLogRichtlinie.

Jetzt ist einer der folgenden PHP - Skripte erstellen ( #!/usr/bin/phpist ein Verweis auf die Lage des Dolmetschers, stellen Sie sicher , dass der Standort für Ihr System korrekt ist - man kann dies auf $ prompt durch Eingabe tun; whereis php- dies sollte so etwas wie zurückkehren php: /usr/bin/php /usr/bin/X11/php /usr/share/man/man1/php.1.gzWie Sie. kann sehen, #!/usr/bin/phpist richtig für mein Setup).

sudo nano /var/log/apache2/PipedAccessLog.php

#!/usr/bin/php
<?php
  $file = '/var/log/apache2/access.log';
  $no408 = '"-" 408 0 "-" "-"';
  $stdin = fopen ('php://stdin', 'r');
  ob_implicit_flush (true);
  while ($line = fgets ($stdin)) {
    if($line != "") {
      if(stristr($line,$no408,true) == "") {
        file_put_contents($file, $line, FILE_APPEND | LOCK_EX);
      }
    }
  }
?>

sudo nano /var/log/apache2/PipedAccessLog.php

#!/usr/bin/php
<?php
  $file = '/var/log/apache2/access.log';
  $file408 = '/var/log/apache2/408.log';
  $no408 = '"-" 408 0 "-" "-"';
  $stdin = fopen ('php://stdin', 'r');
  ob_implicit_flush (true);
  while ($line = fgets ($stdin)) {
    if($line != "") {
      if(stristr($line,$no408,true) != "") {
        file_put_contents($file408, $line, FILE_APPEND | LOCK_EX);
      }
      else {
        file_put_contents($file, $line, FILE_APPEND | LOCK_EX);
      }
    }
  }
?>

Das PipedAccessLog.phpSkript gespeichert haben ; Stellen Sie sicher, dass root Eigentümer ist, indem Sie an der Eingabeaufforderung $ Folgendes ausführen.

sudo chown -R root:adm /var/log/apache2/PipedAccessLog.php

Das PipedAccessLog.phpSkript benötigt Lese- / Schreib- und Ausführungsberechtigungen. Führen Sie daher Folgendes an der Eingabeaufforderung $ aus.

sudo chmod 755 /var/log/apache2/PipedAccessLog.php

Zum Schluss müssen Sie den Apache-Dienst neu starten, damit alles funktioniert. Führen Sie an der Eingabeaufforderung $ Folgendes aus.

sudo service apache2 restart

Wenn sich Ihre Apache-Protokolle an anderer Stelle befinden, ändern Sie die Pfade entsprechend Ihrer Konfiguration. Viel Glück.

Kev
quelle
6
Wenn die 408 passieren, müssen wir herausfinden, warum und sie loswerden. Es ist reine Zeitverschwendung, zu verhindern, dass sie protokolliert oder an eine andere Datei weitergeleitet werden. Es dient auch nur dazu, das Problem zu verbergen. Es ist, als würde man sein Zimmer putzen, indem man alles unter sein Bett schiebt.
Erick Robertson
-2

Ich habe festgestellt, dass 408 Fehler sowohl in der Anzahl als auch in der Häufigkeit zunehmen. Der Bereich der IP-Adressen, von denen sie stammen, wächst ebenfalls (diese werden in einer eigenen separaten Datei protokolliert). Es gibt auch offensichtliche Protokollmuster, die aufeinanderfolgende 408 aus denselben IP-Gruppen anzeigen, die nicht auf normale Server-Zeitüberschreitungen zurückzuführen sind, da der Absender in einem zyklischen Muster versucht, Verbindungen im Abstand von 2 oder 3 Sekunden herzustellen (es wird nicht auf eine Zeitüberschreitung gewartet) Verbindungsversuch) Ich betrachte diese als einfache Verbindungsversuche im DDOS-Stil. Meiner Meinung nach handelt es sich hierbei um eine Art Bestätigungsnachricht für den Absender, dass ein Server online ist. Sie werden später mit verschiedenen Tools wieder angezeigt ihre Hack-Programme innerhalb.

user282558
quelle