Hallo zusammen,
mit etwas Verspätung gibt es nun eine Rückmeldung von uns. Wir haben die Zwischenzeit genutzt, um die Zugriffe auf unsere Server innerhalb der letzten 30 Tage auszuwerten, verschiedene Ansätze zur Abwehr zu testen und das Verfahren zu implementieren, woran wir Euch gerne teilhaben möchten. Die detaillierten Diagramme und Statistiken unserer Auswertung findet Ihr unter
https://badbots.zitro.black (die Seite ist nur aus Deutschland aus aufrufbar).
Wie man der zweiten Auswertung auf der Webseite entnehmen kann, unterscheidet sich die China-Problematik von den herkömmlichen BadBots, da das Verhältnis zwischen den Zugriffen und den verwendeten IP-Adressen genau umgedreht ist. Das chinesische Botnetz greift direkt (und sekündlich) mit neuen IP-Adressen zu, sobald eine IP-Adresse blockiert wird. Somit kommen herkömmliche Verfahren leicht an ihre Grenzen:
auf dem einem Server wird es nun langsam echt etwas viel, dadurch braucht Fail2Ban auch schon recht viel Ressourcen
An den Punkt waren wir leider auch gekommen. Die Ursache liegt hierbei in der Verwaltung von iptables durch fail2ban. Iptables funktioniert auch mit vielen IP-Adressen performant, aber fail2ban muss jede Sekunde in den
Log-Dateien nach neuen Einträgen suchen (fail2ban-server) und sekündlich IP-Adressen zu iptables hinzufügen oder entfernen (fail2ban-client).
Wir werden die nächsten Tage noch detailliert der Frage nachgehen, wie oft das Botnetz versucht, mit einer gesperrten IP-Adresse auf die Server zuzugreifen. Anhand der jetzigen Daten vermuten wir, dass es keine erneuten Zugriffe mit verbrauchten IP-Adressen macht (die Zugriffe teilen sich auf 457.746 dynamische IP-Adressen und 36.486 statische IP-Adressen auf). Das Botnetz schafft es, täglich mit ca. 30.000-60.000 vorher unbekannten IP-Adressen wiederzukommen. Ab dem 20.01. benutzt es dafür sogar noch IP-Adressen aus Singapur (Top 3: China, Singapur, Hongkong).
Kleine Übersicht der verwendeten Pattern im User Agent bei den Zugriffe der knapp 8.000 IP-Adressen aus Singapur am 20.01.:
58481x LieBaoFast
58254x Mb2345Browser
57570x zh-CN
56901x MicroMessenger,zh_CN
160x BuiltWith
155x masscan
101x zgrab
66x Kinza
57x ZmEu
4x Nmap
2x MSIECrawler
Man erkennt anhand der Top 4 Pattern, dass es sich wieder um das alte bekannte Botnetz handelt.
Das bringt mich zum nächsten Punkt: Wir haben die verwendeten User-Agents analysiert und wie man in der Auflistung der Singapur-Pattern erkennt, gibt es einen Anteil an User-Agents, die wir nur über die Spracheinstellung "zh-CN" dem Botnetz zuordnen können. "zh-CN" ist ein offizieller Sprachcode (
https://www.metamodpro.com/browser-language-codes). Unsere Kunden haben keine Kunden in China und sind daher ein guter Honey-Pot. Wenn man aber wie
@lahr-net auf Baidu angewiesen ist, sollte man keinen so grobes Pattern verwenden, um die Chinesen, die man mit Baidu erreichen möchte, nicht wieder auszusperren.
Wir werden weiterhin versuchen einen Fingerabdruck aus den User-Agent abzuleiten. Was wir schon sagen können und was hier in dem Forum auch schon thematisiert wurde: Das Botnetz unterteilt sich in Geräte mit dynamischer IP-Adresse mit User-Agent-Strings von Mobilgeräten und auf Geräte mit fester IP-Adresse diverser Cloud-Anbieter (Huawai und Amazon), die identische Mobile-User-Agent-Strings verwenden (Linux, Android, ...). Insgesamt verwendete das Botnetz bei uns 48 verschiedene User-Agent-Strings für 2.184.834 Zugriffe (ausgehend von ca. 500.000 unique IP-Adressen).
Aufgrund der hohen Dynamic in den verwendeten IP-Adressen haben wir einen verteilten Ansatz zur Botnetz-Abwehr entwickelt. Eine lokale Erkennung und Abwehr auf einem einzelnen Server - so wie sie hier in dem Forumsbeitrag beschrieben ist (htaccess, fail2ban) - ohne Informationsaustausch zu anderen Servern, nimmt zwar die Last von den PHP-Skripten und der Datenbank , verlagert aber die Last in andere Bereiche (fail2ban (Extraktion der Informationen aus den Logs) und apache (Prüfung des User-Agents oder Land bei
jedem Request)).
Wir führen daher vorselektiert(!) IP-Adresse, User Agent und Zeitstempel an einer zentralen Stelle zusammen und verteilen die IP-Adressen dann wieder zurück auf alle Server. So profitieren alle Server von den Erkenntnissen, die ein anderer Server gesammelt hat. Wir verwenden für das Sperren weiterhin fail2ban und iptables, aber fail2ban muss sich nicht mehr um die Extraktion der Informationen aus den Log-Files kümmern. Mit iptables hat man weiterhin den Vorteil, dass nicht bei jedem Request ein Suchpattern auf den User-Agent-String angewendet werden muss. Die von uns verwendeten Pattern könnt Ihr öffentlich hier als JSON abrufen:
https://badbots.zitro.black/api/v1/BadBots/Patterns. Die Pattern stammen aus dem apache-badbot-Filter von fail2ban,
https://github.com/mitchellkrogza/nginx-ultimate-bad-bot-blocker und u.a. den Erkenntnissen aus dem Forum.
Wir haben zwei PHP-Programme geschrieben (der Code liegt offen vor und ist nicht verschlüsselt), die sich gegen unsere RESTful-API verbinden. Das eine Programm extrahiert periodisch anhand der o.g. Pattern IP-Adresse, User Agent und Zeitstempel aus den Access-Logs des Webservers und sendet das Tripple an die API. Das andere Programm ruft periodisch die neuen zu sperrenden IP-Adressen mit vom Backend angereicherten Zusatzinformationen an der API ab und schreibt Zeitstempel und IP-Adresse in ein Log-File, was wiederum von fail2ban überwacht wird. So muss sich fail2ban nur noch um 1 Log-File kümmern und kein aufwendiges Pattern-Matching der Badbots-Pattern vornehmen. Es können je nach Zusatzinformation die IP-Adressen auch in verschiedene Log-Files mit unterschiedlichen fail2ban-Sperrzeiträumen geschrieben werden. Bspw. verwenden wir 3 Dateien mit einer Sperrzeit von 1 Tag (dynamische IP-Adressen ausser China, Singapur, Hongkong), 1 Woche (statische IP-Adressen ausser China, Singapur, Hongkong) und 4 Wochen (China, Singapur, Hongkong). Man kann auch wie von
@lahr-net gewünscht IP-Adressen mit Pattern (bspw. SISTRIX, AHREF und BAIDU) überspringen. Die Programme können im Benutzerkontext des Webspaces ausgeführt werden und benötigen lediglich Leserechte am Access-Log, was i.d.R. immer der Fall ist.
Das ganze wendet sich aktuell noch nicht an Noobs (
@Groundhog), sondern an eher technisch versiertere Personen. Unsere Idee ist es, dass sich interessierte Service-Partner finden (
@css-umsetzung ?), die Ihre Kunden an das Backend anbinden möchten, um Daten zu liefern und mit der Gesamtmenge der Daten die Kunden besser zu schützen. Die Verwendung der API ist kostenfrei. Falls ein Service-Partner Interesse hat, bitte einfach eine
PM senden. Ihr erhaltet dann einen Auth-Token für die API und die Skripte. Wir sehen das ganze momentan noch als Beta an und werden voraussichtlich erst einmal mit einer begrenzten Menge an Interessenten arbeiten. Eine offizielle Registrierungsmöglichkeit über eine fancy Webseite und Einsicht in eigene Statistiken wird noch kommen. Für Noobs entwickeln wir aktuell ein Plugin, welches vor BadBots und zusätzlichen Bedrohungen schützen wird...
Viele Grüße
Tom