Spam-Bot Protection – WordPress absichern Teil6

1. You shall not pass!Spam-Bot-Protection

Der Begriff Spam bezeichnet in erster Linie unerwünschte Werbemails. Tagtäglich landen diese in E-Mail Postfächern, werben für Markenartikel, enthalten Links zu schädlichen Webseiten oder virenverseuchte Anhänge. Auch vor WordPress machen Spammer keinen Halt – Spambots versuchen auch hier ihren Werbemüll zu platzieren.

Gegen die massive Spam-Flut helfen WordPress-Plugins wie Antispam Bee oder Akismet. Doch bereits auf Serverebene lassen sich wirksame Maßnahmen gegen Spambots und ungebetene Gäste ergreifen. Aus strategischen Gründen ist das sogar die bessere Wahl, denn jeder Aufruf der Kommentarfunktion (wp-comments-post.php) bedeutet Arbeit für den PHP-Interpreter und die Datenbank. Jeder abgewiesene Spambot auf Serverebene spart somit wichtige Ressourcen des Webservers.

Im Beitrag stelle ich verschiedene Varianten für die serverseitige Eindämmung von Spam vor. Dabei lege ich den Fokus hauptsächlich auf nginx – für Apache stehen bereits einige Tutorials zur Verfügung. Diese sind entsprechend verlinkt.

Dieser Beitrag ist Teil einer Artikelserie:

Update

März 2016: Die Artikelserie wurde das letzte Mal im März 2016 aktualisiert.

2. Spam! Spam! Spam!

Spam ist in jeglicher Art eine nervige und zeitraubende Angelegenheit. Spammer finden immer neue Wege Spamfilter zu unterwandern und lassen den ein oder anderen WordPress-Betreiber verzweifeln – das Aussortieren und Lesen der Kommentare kostet Zeit und ein Patentrezept gegen die Spam-Flut ist leider nicht in Sicht. Was würden wir auch ohne die netten Kontaktanfragen von Susanne und Angelina tun? Oder die Mahnungen von selbsternannten Rechtsverdrehern? Ganz zu schweigen vom Häuptlingssohn aus Friesenland der uns ein Vermögen verspricht wenn wir den Link jetzt anklicken – ohne Spam hätten wir tatsächlich weniger zu lachen. Und dennoch: Dahinter verbirgt sich eine hässliche Art illegal und schnell Geld zu verdienen.

2.1 Die Methode

Im Normalfall werden WordPress-Installationen durch automatisierte bzw. autonom agierende Bots zugespammt. In einschlägigen Untergrundforen lassen sich Bots für diesen Zweck mieten oder kaufen. Von einfachen Implementierungen (ScrapeBox) bis hin zu hochprofessionellen, weltweit vernetzten Bot-Netzwerken ist alles dabei. Wer Geld mitbringt erhält im Normfall auch die entsprechende »Gegenleistung«.

2.2 WordPress Identifikation

Das Verstecken der WordPress-Versionsnummer oder sonstigen Meta-Daten wird bei Laien oftmals mit dem Schutz gegen Spambots oder Sicherheitslücken in Verbindung gebracht. In der Tat lassen sich damit die besonders »dämlichen« Bots an der Nase herumführen, aber bereits semi-professionelle Varianten lassen sich von den Security by Obscurity Maßnahmen nicht beirren. Sie benutzen ausgeklügelte Methoden zur Feststellung ob eine Seite mit WordPress betrieben wird, um sie anschließend mit Spam-Kommentaren zu überfluten.

Wer selbst mal schauen möchte ob seine WordPress-Installation als solche erkannt wird kann folgende Webseite nutzen: Is it WordPress?
Is it WordPress?
Mehr Informationen benötigt? Beispielsweise alle installierten Plugins? Auch gar kein Problem mit dem Tool plecost. Hier ein Fingerprint einer WordPress-Installation:
WordPress Fingerprint
Trotz versteckter WordPress-Versionsnummer und weiterer Metadaten, die Rückschlüsse auf WordPress zulassen könnten, identifiziert plecost neben der Versionsnummer auch die installierten Plugin-Versionen einwandfrei.

2.3 Das Vorgehen der Spammer

Schon wieder ein neuer Spam-Kommentar? Wie zum Teufel… !? Ärgerlich – aber tagtäglich werden WordPress-Installationen von Spambots heimgesucht. Das Vorgehen der Spammer ist dabei relativ simpel. Vereinfacht dargestellt funktioniert das wie folgt:

  • Zunächst wird ein Bot benötigt. Dieser wird gekauft, programmiert oder für eine gewisse Zeitspanne einfach gemietet. Die Qualität des Bots und dessen implementierter »Intelligenz« entscheidet über den Erfolg des Spamvorhabens.
  • Phase1: Ziele werden definiert. Stehen WordPress-Seiten mit dem Thema Software im Fokus? Oder soll es doch lieber Android sein? Mit cleveren Suchanfragen über Google lassen sich die potenziellen Ziele eingrenzen, die in Phase 2 dann geprüft werden.
  • Phase2: Aus der Menge der gefundenen Seiten wird mittels Fingerprinting festgestellt ob es sich beim Ziel um eine WordPress-Installation handelt. Das geschieht beispielsweise durch den direkten Aufruf einer in Phase1 ermittelten Web-Adresse.
  • Phase3: Nach einer positiven Fingerprinting-Rückmeldung beginnt der Bot direkt mit dem Aufruf der wp-comments-post.php und versucht seinen Spam-Kommentar zu platzieren.
  • Sie haben Post! Ein neuer Spam-Kommentar wurde soeben eingereicht…

WordPress auf Schwachstellen und Konfigurationsfehler prüfen

Für Deine WordPress-Installation habe ich ein spezielles Leistungspaket im Angebot:
  • Scan Deiner WordPress-Installation auf Schwachstellen
  • Auswertung und Beurteilung der gefundenen Schwachstellen
  • Auf Basis der Ergebnisse erhälst Du von mir individuelle Maßnahmenempfehlungen zur Behebung und Absicherung

Wenn du Deine WordPress-Installation nachhaltig absichern möchtest, kannst Du mich gerne kontaktieren.

Gut zu wissen: Sicherheit erlangst Du nicht durch die Installation unzähliger Security-Plugins, sondern durch eine saubere Konfiguration, stetige Updates und proaktive Maßnahmen zur Absicherung. Kontakt aufnehmen

3. Gegenmaßnahme Variante 1 – Spamhaus Datenbank

Bereits auf Serverebene können wir auf Spambots angemessen reagieren. IP-Adressen von bekannten Spammern werden blockiert und sind anschließend nicht mehr in der Lage einen Spam-Kommentar abzugeben. Bei Variante 1 vertrauen wir auf die Antispam-Datenbank von Spamhaus – seit 1998 stellt das Unternehmen E-Mail- und Internet-Providern eine ständig aktualisierte Liste mit Spam IP-Adressen zur Verfügung. Diese Liste importieren wir in nginx, verknüpfen Sie mit dem ngx_http_geo_module Modul und erweitern die Konfiguration.

Diese Variante basiert auf einem Skript von perusio.

3.1 nginx-drop-fetch Skript anlegen

Zunächst wird ein Skript angelegt, welches die Spam-Datenbank bei Spamhaus einliest und unter »/etc/nginx/drop_list.conf« ablegt. Ihr könnt es mittels git beziehen:

git clone git://github.com/perusio/nginx-spamhaus-drop.git

Alternativ legt ihr das Skript selbst an:

nano nginx-drop-fetch
chmod 700 nginx-drop-fetch

… und füllt es mit diesem Inhalt.

Ein anschließender Aufruf füllt die Datei »/etc/nginx/drop_list.conf« mit IP-Adressen, die aktuell unter Spam-Verdacht stehen.

bash nginx-drop-fetch

3.2 drop-list Konfiguration anlegen

Als nächstes wird eine Spamhaus Konfiguration unter »/etc/nginx/« angelegt.

nano /etc/nginx/spamhaus_drop_list.conf
### Configuration for blocking all the netblocks listed on the 
### spamhaus DROP and EDROP lists. See http://www.spamhaus.org/drop/.

geo $is_spamhaus_drop {    
   default 0;     
   ## Including the list.  
   include /etc/nginx/drop_list.conf; 
}

3.3 nginx Konfiguration anpassen

Anschließend wird die nginx Konfiguration auf http-Ebene um die Spamhaus Konfiguration erweitert.

nano /etc/nginx/nginx.conf
http {
...

##     
# Include Spamhaus drop list         
##     
include /etc/nginx/spamhaus_drop_list.conf;

...
}

3.4 Erweiterung der Server Konfiguration

Zum Abschluss wird in der entsprechenden WordPress Server-Konfiguration eine Prüfung der Spamhaus geblockten IP-Adressen integriert.

Global für den Aufruf der WordPress-Webseite:

## Close connections for all requests that come from IPs listed in the Spamhaus DROP list 
if ($is_spamhaus_drop) {
   return 444; 
}

Reduziert auf das Kommentarformular:

## Close connection for all wp-comments-posts.php requests listed in Spamhaus DROP list
location ~* /wp-comments-post.php {
   if ($is_spamhaus_drop) {
      return 444;
   }
   include /etc/nginx/conf.d/fastcgi.conf;
}

4. Gegenmaßnahme Variante 2 – Geotargeting

Auch bei Variante 2 werden Spambots bereits auf Serverebene abgewiesen – allerdings arbeiten wir hier mit Geotargeting. Damit werden IP-Adressen anhand ihrer geografischen Herkunft zugeordnet. Korrekt konfiguriert ist diese Variante strikter als die eben vorgestellte und blockiert eine hohe Anzahl von Spambots. Allerdings ist die Gefahr auch höher, den ein oder anderen Kommentar zu verlieren, der nicht unter die Kategorie Spam fällt.

Hinweis

Eine ähnliche Lösung für Apache ist im Folgenden verlinkt: mod_geoip2 Apache module

4.1 nginx-geoip-fetch Skript anlegen

Zunächst wird ein Skript angelegt, welches die Geo-IP Adressen von MaxMind einliest und unter »/etc/nginx/GeoLiteCity.dat« ablegt.

nano nginx-geoip-fetch 
chmod700 nginx-geoip-fetch

Inhalt des Skripts:

#!/bin/bash

# Simple shell script to download country GeoIPs for nginx.
# GeoIPs are stored in GeoLiteCity.dat

cd /etc/nginx 
wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCountry/GeoIP.dat.gz -O GeoIP.dat.gz
gunzip -f GeoIP.dat.gz

4.2 nginx Konfiguration anpassen

Anschließend wird die nginx Konfiguration auf http-Ebene um die GeoIP Datenbank erweitert.

nano /etc/nginx/nginx.conf
http {
...

##        
# Geo-IPs         
##         
geoip_country  /etc/nginx/GeoIP.dat;

...
}

4.3 Erweiterung der Server Konfiguration

Zum Abschluss wird in der entsprechenden WordPress Server-Konfiguration eine Prüfung der Geo-IP Adressen integriert.

Reduziert auf das Kommentarformular:

# Block unwanted geo IPs from commenting
location ~* /wp-comments-post.php {
   if ($geoip_country_code !~ (DE|AT|CH) ) {
      return 444;
   }
   include /etc/conf.d/fastcgi.conf;
}

Falls der Kommentar NICHT von einer deutschen (DE), österreichischen (AT) oder schweizer IP-Adresse erfolgt, wird die Verbindung zur Gegenstelle unterbrochen. Eine Liste der Ländercodes im geopip_country_code (ISO 3166) bietet Maxwind auf seiner Webseite an. Damit wird die Kommentarfunktion auf »deutschsprachige« IP-Adressen beschränkt. IP-Adressen deutschsprachiger Besucher aus anderen Ländern können die Kommentarfunktion somit nicht nutzen – ein Nachteil dieser Variante. Wer weniger strikt filtern möchte greift auf folgenden Code-Schnipsel zurück:

# Block unwanted geo IPs from commenting
location ~* /wp-comments-post.php {
   if ($geoip_country_code ~ (BR|CN|KR|RU|TR) ) {
      return 444;
   }
   include /etc/conf.d/fastcgi.conf;
}

Durch die Entfernung des Ausrufezeichen (!) nach geoip_country_code drehen wir die Abfrage um. Alle IP-Adressen aus den Ländern Brasilien (BR), China (CN), Korea (CN), Russland (RU) und Türkei (TR) können die Kommentarfunktion NICHT mehr nutzen. Diese Liste lässt sich beliebig anpassen – je nachdem aus welchem Land viel gespammt wird.

5. Tipps

5.1 Spam Identifikation

Mit einem simplen Befehl lässt sich Einsicht in die Kommentar-Aktivität pro IP-Adresse erhalten:

cat /var/log/nginx/access.log | grep wp-comments-post.php | awk '{print $1}' | uniq -c | sort -n

Anschließend könnt ihr euch IP-Adressen herauspicken und mit einer whois Abfrage die Herkunft ermitteln:

whois 88.202.124.121

Whois

Die IP-Adresse wird dem Land Südafrika (ZA) zugeordnet.

Unterstütze den Blog mit einem Dauerauftrag!

Unabhängig. Kritisch. Informativ. Praxisnah. Verständlich.

Die Arbeit von kuketz-blog.de wird vollständig durch Spenden unserer Leserschaft finanziert. Sei Teil unserer Community und unterstütze unsere Arbeit mit einer Spende.

Mitmachen ➡

5.2 Cronjob für die Skripts

Für beide Varianten empfehle ich Cronjobs, welche die Listen automatisch erneuern und nginx anschließend neu starten (zum Beispiel Nachts gegen 3 Uhr).

6. Fazit

Spam nervt – ein Patentrezept dagegen ist allerdings nicht in Sicht. Die dargestellten Varianten können allerdings dabei helfen bereits auf Serverebene eine hohe Zahl von Spambots abzuweisen. Variante 1 wird im Gegensatz zu Variante 2 nicht so viel Spam filtern, ist allerdings zu bevorzugen, falls viele der Besucher bzw. Kommentatoren im Ausland heimisch sind. Denkbar ist auch eine Kombination aus beiden Varianten – wer sein Publikum beispielsweise nicht in China hat kann eine große Anzahl potenzieller Spammer durch das Geotargeting aussperren.

Bildquellen:

Robot: „#53082452“, https://de.fotolia.com/id/53082452

Über den Autor | Kuketz

Mike Kuketz

In meiner freiberuflichen Tätigkeit als Pentester / Sicherheitsforscher (Kuketz IT-Security) schlüpfe ich in die Rolle eines »Hackers« und suche nach Schwachstellen in IT-Systemen, Webanwendungen und Apps (Android, iOS). Des Weiteren bin ich Lehrbeauftragter für IT-Sicherheit an der Dualen Hochschule Karlsruhe, sensibilisiere Menschen in Workshops und Schulungen für Sicherheit und Datenschutz und bin unter anderem auch als Autor für die Computerzeitschrift c’t tätig.

Der Kuketz-Blog bzw. meine Person ist regelmäßig in den Medien (heise online, Spiegel Online, Süddeutsche Zeitung etc.) präsent.

Mehr Erfahren ➡

SpendeUnterstützen

Die Arbeit von kuketz-blog.de wird zu 100% durch Spenden unserer Leserinnen und Leser finanziert. Werde Teil dieser Community und unterstütze auch du unsere Arbeit mit deiner Spende.

Folge dem Blog

Wenn du über aktuelle Beiträge informiert werden möchtest, hast du verschiedene Möglichkeiten, dem Blog zu folgen:

Bleib aktuell ➡


Diskussion

9 Ergänzungen zu “Spam-Bot Protection – WordPress absichern Teil6”

  1. Comment Avatar Clement, Tobias sagt:

    Hallo,

    sehr viele nützliche Tipps um weniger Spam zu bekommen, jedoch ist bei den Tipps auch ein sicherer Umgang mit dem Server Voraussetzung. Ist jedoch sicherlich nicht bei jedem „Hobby“-Webmaster der Fall.

    Ich werde den Artikel jetzt auch mal an unser IT’ler weitergeben, damit diese noch mehr gegen den ganzen Spam unternehmen könnnen.

    • Comment Avatar Mike Kuketz sagt:

      Hallo Tobias,

      nein das ist wirklich nichts mehr für den Hobby-Betreiber. Hatte ich aber bereits im ersten Teil der Serie angekündigt. Wir steigern uns in jedem Teil der Artikelserie – es wird technischer und komplizierter.

  2. Comment Avatar Sergej Müller sagt:

    Feine Zusammenstellung. Meine präferierte serverseitige Lösung in Verbindung mit Antispam Bee: Fail2Ban. Habe ich hier ausführlich beschrieben: https://github.com/sergejmueller/sergejmueller.github.io/wiki/Fail2Ban:-IP-Firewall

  3. Comment Avatar Christian sagt:

    Ich hatte Fail2Ban im Zusammenspiel mit einer WAF auf einem VPS konfiguriert. durch Fail2ban verschlechterten sich die Ladezeiten der Webseite, vielleicht war das VPS zu schwach.

    @Mike bin schon gespannt auf deinen WAF Artikel. Vielleicht kann ich dir mit meinem, der nicht so ausführlich ist, noch ein paar Anregungen geben.

    • Comment Avatar Sergej Müller sagt:

      Die Größe der IP-Tabelle spielt eine nicht ungewichtige Rolle und spiegelt sich auf der Performance. Ich hatte mal verglichen mit und ohne: Fail2Ban erzeugt 0.5 % mehr CPU-Last.

  4. Comment Avatar StoiBär sagt:

    Vor ewigen Zeiten habe ich Bottrap installiert. Seit damals geht das Spamaufkommen gegen Null. In den drei Jahren hatte ich nie mehr als 3-5 Spamkommentare pro Woche, die dann aber eh Aksimet erkannte. Lediglich ein paar handgeschriebene Kommentare von diversen Marketingagenturen kommen noch durch, aber gegen die ist wohl jedes Programm machtlos.

  5. Comment Avatar Stan sagt:

    Hallo Mike,

    danke für diese ausführlichen Informationen, genau danach habe ich gesucht!

    Eine Frage zu 5.2 Cronjob für die Skripts:

    Kannst du mir sagen, wie dieser aussehen könnte?

    Vielen Dank!

  6. Comment Avatar Christian sagt:

    Hi Mike,

    super Tutorial zur Absicherung. Leider nutze ich lighttpd und muß für das ein oder andere Snippet aus den vorangegangenen Teilen eine Entsprechung suchen. Für das Blocken nach der Spamhaus Liste gibt es zwar ähnliche Module, die ich aber separat einkompilieren müsste. Da mir dafür der Aufwand zu hoch wäre bin ich auf folgende Alternative gestoßen:

    https://snipplr.com/view/83710/iptables-spamhaus-blacklist/

    Ist es nicht sogar besser, die IPs direkt in der Firewall zu sperren, da man dann den Webserver nicht zusätzlich belastet? ich betreibe meine WP-Installation eigentlich nur Just4Fun auf sehr begrenzter Hardware (RPi)

HilfeWenn du konkrete Fragen hast oder Hilfe benötigst, sind das offizielle Forum oder der Chat geeignete Anlaufstellen, um dein Anliegen zu diskutieren. Per E-Mail beantworte ich grundsätzlich keine (Support-)Anfragen – dazu fehlt mir einfach die Zeit. Kuketz-Forum

Abschließender Hinweis

Blog-Beiträge erheben nicht den Anspruch auf ständige Aktualität und Richtigkeit wie Lexikoneinträge (z.B. Wikipedia), sondern beziehen sich wie Zeitungsartikel auf den Informationsstand zum Zeitpunkt des Redaktionsschlusses.

Kritik, Anregungen oder Korrekturvorschläge zu den Beiträgen nehme ich gerne per E-Mail entgegen.