Bad Bots oder wie man Bots fern hält

Bad Bots, Hacker, Spammer

Gibt es ein Gegenteil von Suchmaschinen-Optimierung? Bad Bots und Spider machen auf vielen Webseiten mehr als die Hälfte des Traffics aus und belasten einen Server in Stoßzeiten zusätzlich.

Bad Bots errichten kein Suchregister. Sie sind auf der Suche nach Emailadressen und nach Sicherheitslücken oder erzeugen lange Listen von 404-Fehlern. Nach den Bad Bots kommen die Angriffe.

Durchschnittliche Ladezeit – Bad Bot Attack
Massives Bot-Aufkommen mit extremen Ladezeiten der Seiten. Nach der Verbannung der Bad Bots und dem Zähmen der guten Bots haben sich die Ladezeiten wieder normalisiert.

Einige Suchmaschinen lassen sich mit Anweisungen in der robots.txt bändigen. Suchmaschinen, die auf die Anweisungen pfeifen, werden verbannt.

Die Datei access_log bzw. access_ssl_log ist die erste Anlaufstelle, um herauszufinden, wie stark die Seiten von Suchmaschinen frequentiert werden und welche Robots sich besonders dick machen. I.d.R. liegen die Logdateien über dem Hauptverzeichnis unter /log oder statistics/logs. Verdächtig sind gehäufte Zugriffe von derselben oder ähnlichen IP oder gleichen User Agent Strings innerhalb weniger Sekunden.

robots.txt – nur begrenzt hilfreich

Zu den typischen Erntemaschinen gehören AiHitBot | BLEXBot | Cliqzbot | DotBot | linkdexbot | MJ12bot | SEOkicks-Robot | SearchmetricsBot | SISTRIX, und CareerBot | GrapeshotCrawler | iCjobs | magpie-crawler | proximic | QuerySeekerSpider | Vagabondo | WBSearchBot.

Sie durchforsten die Seiten teilweise extensiv, aber sie bringen keine Besucher. Mit der Suche nach (compatible beginnt die Recherche:

136.243.33.232 - - [22/May/2017:00:03:51 +0200] "GET /details-industriefotos-anlagen/ HTTP/1.0" 200 9943 "-" "Mozilla/5.0 (compatible; vebidoobot/1.0; +https://blog.vebidoo.de/vebidoobot/)"
136.243.33.232 - - [22/May/2017:00:03:54 +0200] "GET /industrie-on-location/ HTTP/1.0" 200 9661 "-" "Mozilla/5.0 (compatible; vebidoobot/1.0; +https://blog.vebidoo.de/vebidoobot/)"

Höflicherweise können Bots erst einmal per robots.txt ausgeschlossen werden – das ist hinreichend bekannt.

User-agent: AhrefsBot
Disallow: /

User-agent: DotBot
Disallow: /

User-agent: MJ12bot
Disallow: /

User-agent: seoscanners.net
Disallow: /

User-agent: SEOkicks-Robot
Disallow: /

Bad Bots deny

Der Spider ahref wirft zwar einen Blick in die robots.txt und greift dann munter weiter auf die Seite zu.

Stellt man also nach ein paar Tagen fest, dass sich Bots nicht um den Ausschluss kümmern, sind handfestere Maßnahmen am Zuge.

Zugriffe anhand von User Agent Strings blockieren

Die .htaccess-Datei bzw. die Konfigurationsdatei eines NGINX-Servers blockieren Zugriffe anhand des Browser-Strings.

BrowserMatchNoCase "HTTrack" bots
BrowserMatchNoCase "SEOkicks-Robot" bots
BrowserMatchNoCase "AhrefsBot" bots
BrowserMatchNoCase "Uptimebot" bots
BrowserMatchNoCase "Cliqzbot" bots
BrowserMatchNoCase "ssearch_bot" bots

Order Allow,Deny
Allow from ALL
Deny from env=bots

Bad Bots mit nginx.conf blockieren

Mit einem NGINX-Server geht die Blockade in die Konfigurationsdatei – meist /usr/local/nginx/conf/nginx.conf.

if ($http_user_agent ~ (AhrefsBot|Uptimebot|Cliqzbot|Wget|Catall Spider|AcoiRobot) ) {
    return 403;
}

Quelle HowTo: Nginx Block User Agent

Speichern und NGINX neu starten.

service nginx reload

Bei Plesk sitzt der Suchmaschinen-Blocker unter Domains / Apache & nginx Settings / Additional nginx directives

Ein ausführlicher Beitrag auf Perishable Press zeigt, wie Angreifer, Lückensucher und Bad Bots schon in der .htaccess aussortiert werden können.

.htaccess Redirect Generator erzeugt Einträge für redirect und erzeugt obendrein einen Filter für Bad Bots.

Login-Versuche und gefakte User Agent Strings

Das Massenauftreten von Robots aller Art ist lästig. Gefährlich sind Bad Bots, die nach Sicherheitslücken suchen. Die Log-Datei nach login-Versuchen durchsuchen: wp-login.php oder user/register bei Drupal liefert nicht den einsamen Hacker im Keller, sondern unterschiedliche IPs, aber immer wieder denselben Browserstring.

Eigentlich zeigt der User Agent String – die Kennung des Browsers –, ob hier tatsächlich ein Besucher oder ein Bot die Seite besucht. Aber der User Agent String lässt sich ohne großen Aufwand ändern, um das wirkliche Anliegen zu verschleiern. Der einsame Hacker ist längst ausgestorben. Stattdessen sitzen hinter den Angriffsversuchen Botnetze mit Hunderten und Tausenden von unterschiedlichen IP-Adressen.

Der User Agent String Mozilla/5.0 (Windows NT 6.1; WOW64; rv:40.0) Gecko/20100101 Firefox/40.1 taucht ausschließlich bei Login-Versuchen auf. Firefox 40.1 hat es nie gegeben.. Hier helfen weder die robots.txt noch das Blockieren der IP-Adressen.

24.50.217.60 - - [16/May/2017:05:34:54 +0000] "GET /wp-login.php HTTP/1.1" 403 162 "-" 
                 "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:40.0) Gecko/20100101 Firefox/40.1"
…
89.205.125.170 - - [16/May/2017:16:19:31 +0000] "GET /wp-login.php HTTP/1.1" 403 162 "-" 
                 "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:40.0) Gecko/20100101 Firefox/40.1"

Der Return-Code 403 weist darauf hin, dass die wilden Logins bereits blockiert sind.

Das ist das Login-Äquivalent von Drupal

199.249.223.000 - - [21/May/2017:23:29:30 +0200] "GET /user/register HTTP/1.1" 301 565 "-" 
                    "Mozilla/5.0 (Windows NT 5.1; rv:7.0.1) Gecko/20100101 Firefox/7.0.1"
                    
199.249.223.000 - - [21/May/2017:23:29:33 +0200] "GET /user/register HTTP/1.1" 200 15692 "-" 
                    "Mozilla/5.0 (Windows NT 5.1; rv:7.0.1) Gecko/20100101 Firefox/7.0.1"

Die Drupal Flood Control blockiert Bruteforce-Angriffe zwar, aber auch hier verwenden die Botnetze wechselnde IP-Adressen.

Beiden Bad Bots gemein sind alte NT-Versionen und das Release-Datum 20100101. In beiden Szenarien gilt: Auch derartige User Agent Strings können blockiert werden. Vorsichtshalber liefert eine Textsuche in der Logdatei alle Besuche mit verdächtigen Browser-Strings. Wenn nur Login-Versuche mit diesen Kennungen einhergehen, können die User Agent Strings ebenfalls blockiert werden.

Mit einem SSH-Zugang listet und sortiert der Aufruf von cat die User Agent Strings nach der Zahl der Treffer.

cat test.log | awk -F\" '{print $6}' | sort | uniq -c | sort -n

Allerdings muss man damit leben, dass Bad Bots – genauso wie Hacker und Spammer – ein Faß ohne Boden sind. Wie heißt es so schön:

Die kriminelle Energie reicht immer weiter als die Fantasie der Beschützer.

Das ist nicht der Google-Bot, sondern ein unbedarfter Hack-Versuch aus Italien. Wie gesagt: Das Fälschen des User Agent Strings ist einfach.

83.103.119.48 - - [26/May/2017:20:37:03 +0200] "GET /setup-config.php?step=1 HTTP/1.0" 404 21692 "-" 
                  "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
83.103.119.48 - - [26/May/2017:20:39:25 +0200] "GET /site/setup-config.php?step=1 HTTP/1.0" 404 23062 "-" 
                  "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
Durchschn. Seitenladezeit (Sek.) 15. Jan. 22. Jan. 29. Jan. 5. Feb. 12 6