BadBots blockieren

  • Thread starter Thread starter BulliM
  • Start date Start date
B

BulliM

Guest
Hi,

ich möchte gern bestimmte Zugriffe serverweit blockieren. Ich könnte das auch für jede Domain einzeln per htaccess tun. Aber ich denke, da ist es einfacher, bestimmten IP und User_Agents komplett den Zugang zum Server zu verbieten.

Was wäre da die beste ressourcensparendste und sicherste Methode? Eine serverweite Htaccess? Über die Firewall?

Mein Apache 2.2 Server läuft unter Ubuntu 10.04.
 
Das ressourcensparenste wäre, wie üblich, die Firewall (iptables)

Im Fall von User-Agent ist dies etwas komplizierter allerdings ist es bei einem solchen Filtersystem eigentlich immer egal ob eine Anfrage durchkam.
Und sobald eine durchgekommen ist, ist diese in der Access-Log enthalten.
Man kann dann also mit fail2ban oder einer anderen Filter-Logik die Accesslog mitlesen und IP's welche diesen User-Agent verwenden blockieren.

Beachte aber dass ein User-Agent frei vom Client wählbar ist. Du kannst höchstens ein paar Skripkiddies oder Programme mit Defaultwerten aussperren.
 
Ja, dachte ich mir. IP's blockiere ich dann am Besten per iptables. Viele Bots geben zwar einen User_Agent an. Aber ist klar, dass der veränderbar ist. Darum habe ich es auch vorwiegend auf IPs abgesehen.

Es gibt wo viele Seiten, auf denen Badbots gelistet sind. Aber so wirklich aktuell, sind nicht viele. Und die Meisten setzen auch auf den User_Agent. Das halte ich eben auch für semioptimal. Kennt vielleicht jemand eine Seite, auf denen man aktuelle IP's der bösen Bots bekommt? So habe ich noch eine Referenz, bevor ich versehentlich was falsches blockiere.
 
Evtl solltest du dir auch mal die Atomicorp Mod-Security Regeln ansehen.
Diese blockieren auch schon jede Menge User-Agents welche als "Böse" angesehen werden können. Darauf basierend kannst du dann die in meinem letzten Post angesprochene Filterung mit Fail2ban auf der Verweigerten Auslieferung durch Mod_Security durchführen und die IP komplett bannen.

Hier eine Liste von RBL's im fertigen mod_security Format welche ich mal zusammengestelt hatte
Code:
#Key für Project Honeypot
SecHttpBlKey DEIN_KEY

#Reset (Evtl nicht notwendig? Dokumentation ist unklar)
SecRule TX:dnsbl_count "@gt 0" \
"phase:1,nolog,pass,rev:1,setvar:tx.dnsbl_count=0"

SecRule REMOTE_ADDR "@rbl web.dnsbl.sorbs.net." \
"phase:1,nolog,pass,rev:1,setvar:tx.dnsbl_count=+1"

#Achtung: Blockiert auch Google Crawler =(
SecRule REMOTE_ADDR "@rbl dnsbl.tornevall.org." \
"phase:1,nolog,pass,rev:1,setvar:tx.dnsbl_count=+1"

SecRule REMOTE_ADDR "@rbl rbl.efnetrbl.org." \
"phase:1,nolog,pass,rev:1,setvar:tx.dnsbl_count=+1"


SecRule REMOTE_ADDR "@rbl dnsbl.httpbl.org." \
"phase:1,nolog,pass,rev:1,setvar:tx.dnsbl_count=+1"

#Executive rule
SecRule TX:dnsbl_count "@ge 2" \
"log,drop,phase:1,msg:'Global RBL match on at least 2 RBLs',logdata:'client ip: %{REMOTE_ADDR}'"

Die Filterung erfolgt nur wenn mindestens 2 RBL's die IP listen.
Es gibt aber mehrere Nachteile:
- gutwillige Crawler (Google, MSN, ...) werden fast immer gelistet und somit blockiert
- die Ladezeit beim ersten Besuch der Webseite kann sich bis zu 2-3 Sekunden verzögern wenn eine RBL langsam antwortet
=> Es wäre klüger die RBL ebenfalls als Logfile-Analyser zu verwenden.

Die meisten RBL's versuchen verseuchte Clients zu blockieren. Aber durch dynamische IP's wird es jede Menge false-positives geben und selbst Leute welche "richtig" gelistet sind sehen nicht ein warum sie nicht auf deine Webseite dürfen.
Wirklich helfen tut eine RBL übrigens nicht als Schutz. Da gibt es effektivere Lösungen.
 
Wirklich helfen tut eine RBL übrigens nicht als Schutz. Da gibt es effektivere Lösungen.

Also über RBL, kann ich nichts finden. WAS IST DAS ? (Remote-Block-List?) Und wie sehen effektivere Lösungen aus?

Ich will natürlich nichts blockieren, dass mir normale Besuche verschafft. Google mal gar nicht. Ich möchte eben nur die Bösen aussperren. Ich würde gern eine Datei mit IP's anlegen, die dann beim Start der Firewall eingelesen wird. Von mir aus können die IP's auf allen Ports blockiert werden. Je nachdem, ob das Ressourcen spart. Oder ist es sinnvoller, nur den Serverport zu blockieren? Ich denke, dass da im Laufe der Zeit schon ein paar hundert IP's zusammenkommen werden.

Das mit den virtuellen IP, ist weniger ein Problem. Ich schaue mir meine Besucher genau an. Wenn ich mir nicht sicher bin, blockiere ich die IP auch nicht. Momentan halte ich Besucher per PHP in der Datenbank fest, um die leichter auswerten zu können. Ich kann so auch den Standort einer IP (geoplugin) feststellen. Das hilft ja auch bei der Entscheidung, ob sie blockiert werden kann.

Bei den Remote-Adressen, gibt es schon auch ein paar Webverzeichnisse (z.b. helpster.de) , de ich ausschließen will. Geht das auch per iptables oder fail2ban? Wie bewerkstellige ich das? Liste mit IP's und Liste mit Remote-Adressen, kann ich ja aus meinen gesammelten Daten erstellen.
 
Last edited by a moderator:
Also über RBL, kann ich nichts finden. WAS IST DAS ?
Real-time Blackhole List, meist über DNSBL manchmal aber auch zB HTTPBL
Siehe hier: http://en.wikipedia.org/wiki/DNSBL

Ich will natürlich nichts blockieren, dass mir normale Besuche verschafft.[...]
Ich möchte eben nur die Bösen aussperren.
Dann ist dein Ansatz falsch. Wer sagt dass die Informationen in den Listen überhaupt wahr sind, nicht veraltet sind und _das wichtigste_ ob du die gleiche Auffassung von "Böse" hast als der Listenbetreiber.
Du musst deine eigene Liste erstellen. Kriterien wären zB die Anzahl an 403/404 über die Anzahl an Requests und die Anzahl von Requests je Zeitspanne (zB Stunde)
 
Dann ist dein Ansatz falsch. Wer sagt dass die Informationen in den Listen überhaupt wahr sind, nicht veraltet sind..

Darum sammle ich doch eigene Daten über die Besuche. Ich halte es nur für semioptimal, für jede Domain die auf meinem Server liegt, eine eigene htaccess anzufertigen. Das frisst doch enorme Ressourcen. Daher die Idee, den Job zentral von der Firewall erledigen zu lassen.

Ich werde auch noch eine Bot-Trap aufstellen um auch wirklich jeden bösen Bot zu erwischen.

Findest du die Herangehensweise etwa falsch? Ich sammle Daten über die Besucher. Webverzeichnisse, Contentklauer & Co will ich aussperren. Und eben jeden, der sich nicht an aufgestellte Regeln (robots.txt) hält. Jetzt stelle ich mir die Frage, wie ich mit den Erkenntnissen am Besten umgehe. Firewall oder htaccess? Wenn Firewall, wie?

Ich habe eine Liste mit IP's (auch Wildcards), eine Liste von User_Agents und ein paar Referrer. Was mache ich jetzt damit?
 
Last edited by a moderator:
Die Herangehensweise eine externe Liste zu verwenden oder vergleichen halte ich für falsch.

Contklauer kannst du so oder so nicht erkennen. Wie denn auch?
Du kannst höchstens hotlinking grösstenteils durch Referer verhindern.

Die Blockierung solle natürlich wie oben bereits gesagt über die Firewall erfolgen.
Erkennung kann nicht über die Firwall erfolgen da musst du also zwischen Realtime (Apache) oder delayed (Logfile) entscheiden. Ich würde aus Performance- und Einfachheitsgründen delayed empfehlen.
 
Die Herangehensweise eine externe Liste zu verwenden oder vergleichen halte ich für falsch.

Würde ich ohnehin nur zur Absicherung verwenden. Also um zu schauen, ob es tatsächlich ein BadBot ist. Ich sammle ja selbst Besucherdaten.

Contklauer kannst du so oder so nicht erkennen. Wie denn auch?
Du kannst höchstens hotlinking grösstenteils durch Referer verhindern.

Klar. Habe ich ja u.A. auch vor. Contentklau ist kaum zu verhindern. Aber mit einer Trap, kann man schon ein paar Diebe erkennen.

Ich würde aus Performance- und Einfachheitsgründen delayed empfehlen.

Da stimme ich dir schon zu. Aber so Logfile-Analyse ist nicht wirklich optimal. Meine Methode ist zwar erstmal Performance-Lastiger. Aber dafür sind die Daten etwas wertvoller. Ich denke auch darüber nach, die Akquise-Last auf Zeiten zu verschieben, wo nicht so viel los ist. Man muss ja nicht durchgehend beobachten. Bots sind ja rund um die Uhr unterwegs.

Letzendlich geht es mir um eine Methode, die effektiv und ressourcenschonend ist. Also würde ich für die Blockierung gern die Firewall verwenden. Gibt es da denn die Möglichkeit, auch unaufgelöste Remote-Adressen und Referrer auszuschließen?

Wie schon mehrfach erwähnt, sammle ich in Listen, was ich nicht haben will. Jetzt suche ich nach einem Weg, die Listen praktisch anzuwenden. Kannst du mir dabei helfen? Wo trage ich meine Daten ein, damit sie angewendet werden? Ideal wäre ein File, dass von der Firewall beim Start geladen wird. Wie müsste das aussehen? Wo müsste das liegen?
 
Last edited by a moderator:
Würde ich ohnehin nur zur Absicherung verwenden. Also um zu schauen, ob es tatsächlich ein BadBot ist.
Dann wirst du nur einen Bruchteil (5-10% wenn es hochkommt) der Bots finden.
Grund ist dass diese Listen genau wie deine funktionieren indem sie sehen wer bei ihnen anklopft. Das Internet ist aber so gross und die Bots meist mit einer dynamischen IP versehen dass es ein Ding der Unmöglichkeit ist dass eine nennenwerte Anzahl von Bots KURZ VORHER bei denen waren und dann bei dir.

Aber mit einer Trap, kann man schon ein paar Diebe erkennen.
Nur Crawler. Und Crawler versuchen entweder Sicherheitslöcher zu finden oder gehören zu Suchmachinen. Du könntest mit Traps Sicherheits-Scanner blockieren aber nicht Content-Klau.

Aber so Logfile-Analyse ist nicht wirklich optimal. Meine Methode ist zwar erstmal Performance-Lastiger. Aber dafür sind die Daten etwas wertvoller
Was macht Echtzeit-Daten wertvoller als Daten welche um einen Sekundenbruchteil verzögert sind? Die eine Anfrage wird deinen Server nicht lahmlegen.

Man muss ja nicht durchgehend beobachten.
Doch. Viele Bots sind infizierte Rechner (Botnet-Zombies) und diese sind halt fast nur in der Rush-Hour online. Ausserhalb der Hauptzeiten wirstdu bedeutend wenigerere sehen was die Effektivität stark mindert.

Kannst du mir dabei helfen? Wo trage ich meine Daten ein, damit sie angewendet werden?
Wie gesagt: Firewall.
IPv4: iptables -I INPUT -p tcp -s DIE.CLIENT.IP.HIER -j DROP
IPv6: ip6tables -I INPUT -p tcp -s DIE.CLIENT.IP.HIER -j DROP

Ideal wäre ein File, dass von der Firewall beim Start geladen wird.
Wäre möglich, aber besser wäre es wenn deine Liste einfach geparst und mit den Kommandos in die Datenbank eingefüttert ist.
ein @reboot Cronjob mit entsprechender Logik sollte diesem Genüge tun.
 
Was macht Echtzeit-Daten wertvoller als Daten welche um einen Sekundenbruchteil verzögert sind? Die eine Anfrage wird deinen Server nicht lahmlegen.

Habe ich schon erwähnt. Ich lokalisiere die IP direkt bem ersten Zugriff. So kann ich später beim Auswerten sehen, woher die Anfrage kam. Chinesen z.b. müssen mein Angebot nicht sehen. Außerdem kann ich meine Daten nach Belieben selbst verwalten, sortieren, akquirieren, löschen oder verwerten.
 
Last edited by a moderator:
So kann ich später beim Auswerten sehen, woher die Anfrage kam. Chinesen z.b. müssen mein Angebot nicht sehen.
Was hat "nicht sehen" mit Auswertung zu tun.
Die Auswertung wird durch verzögerte Sperrung nicht beeinflusst ausser dass hin und wieder ein seltener Chinese sich drin verirrt.

Außerdem kann ich meine Daten nach Belieben selbst verwalten, sortieren, akquirieren, löschen oder verwerten.
Was hat das mit dem Rest zu tun?
 
Was hat "nicht sehen" mit Auswertung zu tun.
Die Auswertung wird durch verzögerte Sperrung nicht beeinflusst ausser dass hin und wieder ein seltener Chinese sich drin verirrt.


Was hat das mit dem Rest zu tun?

Ich habe den Eindruck, dass du ein Problem damit hast, wenn jemand innovativer ist als du. Ich finde meine Herangehensweise super.
 
wenn jemand innovativer ist als du.
Been there. Done that. Klappte nicht. Hab eine andere Lösung gefunden welche funktioniert.
Aber es gibt ein schönes Sprichwort: wer nicht hören will muss fühlen.

/signoff
 
Back
Top