Schutz der Website oder des Blog vor massiven Zugriffen durch Crawler oder Angreifer

Heute bekam ich über mein Monitoring-Tool mal wieder eine Mail, dass mein Blog gerade down ist. Bei allen, die das vorhin getroffen hat, möchte ich mich hiermit auch entschuldigen. Aber wieso war mein Blog mal wieder down, wo er doch in letzter Zeit so gut gelaufen ist?

Crawler: Plage oder Segen?

Jeder von uns, der eine Website hat freut sich wohl, wenn den Google Crawler regelmäßig vorbeischaut und dabei möglichst alle neuen schon nach wenigen Minuten in den Index befördert. Da der Google Crawler dabei auch automatisch auf die Performance einer Website achtet um kleine Seiten nicht zu überlasten, fällt es auch nicht weiter auf, wenn er gerade am Werk ist.

Aber leider gibt es nicht nur den Google Crawler sondern mittlerweile eine unüberschaubar große Anzahl davon. Heute hat sich also ein neuer Crawler ans Werk gemacht und meine Website im Turbogang mit Anfragen beschossen. Das ist für den kleinen V-Server dann doch etwas zu viel geworden und er hatte innerhalb kürzester Zeit eine Auslastung von 4500%!

Aber wie kann man sich nun vor solchen Crawlern schützen und möchte man das auch. Wenn man nämlich einen Crawler blockiert, dann kann der Dienst dahinter die Website nicht mehr indizieren und man verliert eventuell neue Nutzer, die auf die eigene Website über diesen Dienst aufmerksam geworden wären. Daher habe ich bei meiner Website nicht kategorisch alle Crawler außer denen der großen Suchmaschinen ausgeschlossen.

Einzelne Crawler sperren

Um Crawler den Zugriff auf die eigene Website zu verweigern setzt man eine Datei mit dem Namen robots.txt ein. Nachdem ich also den Namen des Crawlers über die Logfiles meines Servers rausgefunden hatte, konnte ich ihn zukünftig ausschließen, indem ich folgende Zeilen zur robots.txt Datei hinzugefügt habe:

User-agent: 008
Disallow: /

Das Problem an der Sache ich nur, dass der Crawler diese Änderung nicht sofort bemerkt. Eventuell prüft er die Datei ja nur einmal pro Stunde oder sogar nur einmal am Tag oder in der Woche. Bis er also aufhört die Website mit Anfragen zu überfluten müssen andere Maßnahmen getroffen werden.

Zugriffe von einer IP-Adresse blockieren

Ich musste also nun den Zugriff durch den Crawler anhand seiner IP-Adresse blockieren. Das geht am einfachsten über die Datei .htaccess die sich meistens im Wurzelverzeichnis der Website befindet. Dort habe ich folgende Zeilen eingefügt:

# block potentially harming clients
order allow,deny
deny from 77.45.136.22
deny from 91.218.229.49
allow from all
# END: block potentially harming clients

Ich habe hier in diesem Beispiel zwei IP-Adressen blockiert. Was es mit der zweiten auf sich hat erkläre ich euch gleich. Ihr könnt hier also auch mehrere IP-Adressen blockieren, müsste aber pro Adresse eine Zeile verwenden. Damit verhindert ihr zwar die Anfrage selbst nicht (was auch nicht möglich ist) aber die Anfrage wird hierbei vom Apache-Server direkt zurückgewiesen, ohne dass beispielsweise WordPress etwas davon mitbekommt und anfängt die angeforderte Seite zu generieren. Wenn der Crawler intelligent ist, hört er auch recht bald auf eure Seite zu lesen und schaut sich vielleicht gleich mein eure veränderte robots.txt Datei an.

Hilfe gegen die bösen Jungs da draußen

Leider ist die robots.txt Datei nur eine Bitte an einen Crawler, was sie mit eurer Website tun soll. Er kann diese Information aber natürlich auch einfach ignorieren und eure Website trotzdem auslesen. Dann sollte das Blockieren mittels .htaccess Datei funktionieren, solange es ein Crawler ist, hinter dem keine bösen Absichten stecken. Denn sobald ihr den Crawler blockiert, bekommt er das natürlich mit. Er könnte dann einfach die IP-Adresse wechseln und erneut eure Seite belagern. Damit er das aber nicht so schnell mitbekommt, könnt ihr einen kleinen Trick anwenden. Oft werden solche Crawler von Programmieren eingesetzt, die den gesamten Inhalt eurer Website lesen wollen. Sie prüfen dabei vermutlich auch, ob die Seite erfolgreich angefordert werden konnte (Status Code 200) oder ob es eine erfolgreiche Weiterleitung gab (Status Code 301/302). Wieso also nicht dem Crawler einfach eine Seite zurückliefern, die Inhalt enthält, nicht aber den, den er wollte. Oder ihn einfach auf eine andere Seite weiterleiten.

Ich leite solche Angreifer gerne auf „Das Ende des Internets“ um. Das ist eine witzige Seite, die wie eine typische Internet Explorer-Fehlerseite aussieht und andeutet, dass man das Ende des Internet erreicht hat. Um das zu tun fügt ihr einfach folgende Zeilen in eure .htaccess Datei ein:

# rewrite unwanted clients to the end of the internet
RewriteCond %{REMOTE_ADDR} ^77.45.136.22 [OR]
RewriteCond %{REMOTE_ADDR} ^91.218.229.49
RewriteRule ^(.*)$ http://www.weirdity.com/internet/eoti.html [L]
# END: rewrite unwanted clients to the end of the internet

Wenn ihr hier mehrere IP-Adressen angeben möchtet, dann müsst ihr hinter jeder Zeile, außer der letzten, noch [OR] einfügen. Außerdem müssten die Punkte mit einem vorangestellten Backslash markiert werden.

Wenn ihr zuvor schon den vorherigen Code zum Blockieren einer IP-Adresse eingefügt habt, dann müsst ihr diesen auskommentieren (indem ihr vor jede Zeile ein # Zeichen einfügt), damit die Zugriffe nicht mehr blockiert, sondern stattdessen umgeleitet werden.

Der Nutzer des Crawlers merkt im Optimalfall davon nichts. Wenn er sich dann aber im Nachhinein die gecrawlten Seiten ansieht, wird er sich über deren Inhalt wohl sehr ärgern.

Fazit

Ich habe mit den hier beschriebenen schon eingie Angriffe bzw. unbeabsichtigte Überlastungen durch Crawler abwenden können. Auch mein Server läuft gerade wieder mit gemächlichen 5% Auslastung vor sich hin. Diese Maßnahmen schützen einen zwar nicht vor professionellen oder gut organisierten Angriffen, aber gegen die oft genannten „Script-Kiddies“ sollten sie ausreichen. Die suchen sich dann einfach eine Website, die sie einfacher angreifen können.

Ach ja und jetzt noch zu der zweite IP-Adresse. Diese stammt wirklich von einem Angreifer. Der wollte aber nicht meinen Server durch viele Anfragen überlasten, sondern viel schlimmer noch, er wollte Schadcode auf meinen Server laden. Dazu hat er versucht die Sicherheitslücke in der TimThumb Funktion auszunutzen, auf die ich auch weiter unten in meinem Artikel Plugins und Sicherheit: Sicherheitslücke in Filedownload Plugin geschlossen kurz eingegangen bin. Aber zum Glück verwende ich kein Plugin oder Theme, das diese Funktion nutzt bzw. eine unsichere Version von TimThumb verwendet.

Veröffentlicht von

Bernhard ist fest angestellter Webentwickler, entwickelt in seiner Freizeit Plugins, schreibt in seinem Blog über WordPress und andere Themen, treibt sich gerne bei den WP Meetups in Berlin und Potsdam herum und läuft nach Feierabend den ein oder anderen Halbmarathon.

10 Kommentare » Schreibe einen Kommentar

  1. Hallo!! Dein Bericht ist gut. Die Spam IP bekomme ich auf meiner seite mit der Seitenzugrifsliste raus. Diesetrage ich dann in die zu blockierenden IP Adressen in meiner Backlist ein.
    LG

    • Hallo Webmaster, meinst du mit Seitenzugriffliste die Apache Logfiles? Oder hast du da was anderes im Einsatz? Und wie hast du deine Blacklist abgelegt? Auch wie in meinem Beispiel direkt in der .htaccess?

  2. Wer sich nicht mit der htaccess rumschlagen möchte oder kann, kann auch im header.php-File auf der obersten Zeile eine PHP-Abfrage auf die IP machen (REMOTE_ADDR), und im Falle einer nicht erwünschten IP, ein PHP-exit reinhauen.

    • Das geht natürlich auch, aber bis die header.php geladen wurde haben der Apache und der MySQL Server schon unnötig viel gearbeitet. Daher blockiere ich Bots so früh wie möglich und noch bevor WordPress oder ein anderes System dahinter etwas davon mitbekommt.

  3. Ich halte manuelle Lösungen hier nicht für zuende gedacht, da es zur Lebensaufgabe werden kann jede einzelne IP zu blocken, die gerade den Server „nervt“.

    1. man könnte deinen Vorschlag mithilfe von regelmäßig aktualisierten, verfügbaren „Bad-IP“ Listen beschleunigen die man diese automatisch in die hosts.deny, iptables oder htaccess Liste läd.
    2. mittels Diensten wie fail2ban lassen sich IP’s, die über einen längeren Zeitraum viele Elemente abgreifen, gut aus Logs herausfiltern und sperren

    • Du hast natürlich recht, dass dies keine optimale Lösung ist, um sich dauerhaft gegen Bots zu währen. Aber das habe ich im Artikel ja auch erwähnt. Ich wollte eben eine Lösung aufzeigen, mit der man bei akuten Problemen eine schnelle Entlastung herbeiführen kann. Wer seinen Server effektiv schützen will, sollte in der Tat etwas wie fail2ban einsetzten, das du ja schon erwähnt hattest. Oder noch besser eine echte Hardware Firewall, die von Experten eingerichtet und überwacht wird. Das ist aber für viele schon sehr schwer selbst umzusetzen oder mit hohen Kosten verbunden.

  4. Sehr netter Beitrag, gibt es doch auch Möglichkeiten, den Log in Bereich auf einen anderen Link zu verweisen, sodass es nicht mehr über wp-admin geht?

    Gruß

    • Das ist richtig Kris, das kann man machen. Aber es hilft bei einem gezielten Angriff nicht wirklich. Denn die URL für den Login rauszufinden ist für einen Angreifer nicht schwer und der anschließende massive Angriff somit weiterhin möglich.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert