Apache 2.2: allow/deny aus Datenbank/memcache/cookie

Autor: Raphael Eiselstein <rabe_at_uugrn.org>
Datum: Fri, 7 Dec 2012 01:06:16 +0100
Hallo zusammen,

ich pflege aktuell manuell eine .htaccess-Datei, um Zugriffe von
bestimmten IPs oder IP-Ranges auf GET-Requests zu beschränken.

<LimitExcept GET>
…
        deny from 78.27.128.0/18
        deny from 85.127.0.0/16
…
</LimitExcept> 

Ich will den Vorgang allerdings automatisieren, um Spammer und Botnetze
effektiv auszusperren, zu mindest von der *akiven* Teilnahme am
Rhein-Neckar-Wiki zu hindern.

Ich habe täglich einige zig bis hundert Zugriffe in dieser Form im
Logfile stehen:

GET /index.php?title=Special:UserLogin&type=signup HTTP/1.1

Die Seite [[Special:UserLogin]] existiert jedoch nicht. Ein normaler
Benutzer würde sich immer über den Link anmelden, der ihm angeboten
wird, das wäre dann zB http://rhein-neckar-wiki.de/index.php?title=Spezial:Anmelden&returnto=Hauptseite

Es sind also nur und ausschließlich Bots, die sich die
MediaWiki-Eigenschaft zunutze machen, dass Zugriffe auf
englischsprachige Spezialseiten immer umgeleitet werden auf die
lokalsprachlichen, hier deutsch.

Meine Idee ist es also, Zugriffe auf /index.php mit
title=Special:UserLogin und type=signup abzufangen und direkt zu
blocken, sodass der (meist nur wenige Sekunden später) folgende
POST-Request direkt abgewiesen mird mit "403 Forbidden".

Dazu würde ich eine Extension bauen, die eine Blockliste in MySQL
pflegt. Allerdings will ich, dass Apache diese Blockliste dann selbst
direkt verwendet um POST-Requests zu blocken.

Alternativ: Die IP-Sperren sind ja immer nur kurzzeitig sinnvoll, d.h.
nach zB einem Tag ist diese Sperre nicht mehr sinnvoll, weil der
infizierte PC dann längst eine neue IP-Adresse hat. Anstelle von MySQL
könnte ich auch den ohnehin vorhandenen Memcache verwenden. Dennoch auch
hier: Kann Apache das selbst zugreifen oder muss ich auch hier jedesmal
erst PHP bemühen?

Da die Bots generell Cookies annehmen, von denen sie vieher nicht
wissen, wie sie heißen, könnte ich auch ein Cookie setzen, mit dem ich
den Zugriff für Post-Requests "freischalte" und dem Apache auf
*irgendeine* Weise beibringen, dass er alles, was kein GET-Request ist
abweist, wenn dieses Cookie *nicht* gesetzt ist. Sicher, das würde kein
Scriptkiddie abhalten, das es spziell auf mich abgesehen hat, aber es
würde die Bot-Scripte effektiv aussperren. Und ja, das Cookie wird bei
jedem "verdächtigen" Zugriff entsprechend geändert, sodass es für !GET
gesperrt bleibt.

Prinzipiell ist ein PHP-Code, der auf ein Cookie prüft und nur bei
Bedarf komplexere Dinge tut sehr schlank, zumal das Projekt insgesamt 
ja schon sehr schwerlastig in PHP daherkommt (MediaWiki).

Prinzipiell bin ich an einer Lösung interessiert, mit der Apache pro
Request den Zugriff verhindert und eben nicht erst PHP loslaufen muss.

Alternative Ideen oder vielleicht sogar Lösungen?

Gruß
Raphael

-- 
Raphael Eiselstein <rabe@uugrn.org>               http://rabe.uugrn.org/
xmpp:freibyter@gmx.de  | https://www.xing.com/profile/Raphael_Eiselstein   
GnuPG:                E7B2 1D66 3AF2 EDC7 9828  6D7A 9CDA 3E7B 10CA 9F2D
.........|.........|.........|.........|.........|.........|.........|..


-- 
UUGRN e.V. http://www.uugrn.org/
http://mailman.uugrn.org/mailman/listinfo/uugrn
Wiki: https://wiki.uugrn.org/UUGRN:Mailingliste
Archiv: http://lists.uugrn.org/

Empfangen am 07.12.2012

Dieses Archiv wurde generiert von hypermail 2.2.0 : 07.12.2012 CET