Mit Modsecurity Brute-Force Angriffe auf Web-Logins abwehren

3. März 2009 | Von | Kategorie: Firewalling | VPN | IDS

Brute-Force Anmeldungen an Webapplikationen sind heute allgegenwärtig. Spätestens der Twitter-Hack hat wieder gezeigt, wie kritisch diese Angriffe sind.

Modsecurity kann seit einiger Zeit die Zugriffe gleicher IP-Adresse überwachen. Hierbei ist es möglich Ereignisse zu zählen. So können die Zugriffe auf eine Anmeldeseite gezählt werden. Hierzu nutzt Modsecurity Collections. Diese müssen zunächst initialisiert werden:

# Initialisiert für jeden neuen Zugriff eine IP-Kollektion
# Falls die IP-Adresse bereits bekannt ist, wird die Kollektion geladen
SecAction initcol:ip=%{REMOTE_ADDR},nolog

Nun existiert ein getrenntes Array ip für jede IP-Adresse, in dem beliebige Werte gespeichert werden können. Die maximale Größe des Arrays ist jedoch auf 1024 Byte beschränkt.

Unsere Login-Seite ist nicht von der Seite, die später die Zugriffe entgegennimmt zu unterscheiden. In allen Fällen handelt es sich um index.php. Die Anmeldung kann daran erkannt werden, dass das Argument login übergeben wird:

# Prüfe ob die Variable "login" übergeben wird
# Phase 2, da Post-Variable
# Zähle dann die ip-spezfische Variable logins um 1 hoch
SecRule ARGS_NAMES "^login$" nolog,phase:2,setvar:ip.logins=+1

Für jeden Zugriff mit dem Argument login wird nun die Variable logins für diese IP-Adresse um 1 erhöht.

Nun können wir später diesen Wert prüfen und ab einem Schwellwert den Zugriff verweigern:

# Wenn 5 Anmeldeversuche erfolgt sind, ablehnen
SecRule IP:LOGINS "@gt 5" "log,deny,phase:2,status:500,msg:'Brute Force'"

Dies ist jedoch vielleicht ein wenig nichtssagend für Benutzer, die sich tatsächlich fünfmal falsch anmelden. Hier ist es sinnvoller, eine Fehlerseite einzublenden:

# Wenn 5 Anmeldeversuche erfolgt sind, umleiten
SecRule IP:LOGINS "@gt 5" "log,phase:2,msg:'Brute Force',redirect:http://www.os-s.net/failed.html"

Hat sich nun ein Benutzer sechsmal eine Anmeldung übertragen, so wird jeder weitere Zugriff von dieser IP-Adresse nun umgeleitet. Auch der Zugriff auf die umgeleitete Seite wird umgeleitet. Das führt zu einer Endlosschleife. Daher muss der Zugriff auf diese Seite vorher mit folgender Regel grundsätzlich erlaubt werden:

SecRule REQUEST_FILENAME "^/failed.html$" phase:2,allow,nolog

Falls es der Benutzer tasächlich weiter versuchen sollte, kann ab einem weiteren Schwellwert die Verbindung unterbrochen werden. Mit drop bricht Modsecurity direkt die Verbindung ab. Das Verhalten des Webbrowsers ist hier nicht vorhersehbar.

SecRule IP:LOGINS "@gt 8" "log,logdata:'%{IP.LOGINS}',drop,phase:2,msg:'Brute Force %{IP.LOGINS}'"

Jetzt haben wir nur noch das Problem, dass ein Benutzer ab der fünften, auch korrekten, Anmeldung von der selben IP-Adresse auf alle Zeiten blockiert wird. Daher sollte der Wert der Variable LOGINS automatisch in regelmäßigen Zeitabständen reduziert werden. Auch dies kann Modsecurity. Hierzu ändern Sie einfach die Zählregel ab:

SecRule ARGS_NAMES "^login$" nolog,phase:2,setvar:ip.logins=+1,deprecatevar:ip.logins=1/60

Nun wird die Variable jede Minute um 1 erniedrigt. Pro Minute kann also eine neue Anmeldung erfolgen. Dies mag in einigen Umgebungen nicht ausreichend sein, da die Anwender über einen Proxy alle mit der identischen IP-Adresse zugreifen. Dann ist es sicherlich sinnvoller, die Antworten des Webservers auszuwerten. Vielleicht kann die fehlerhafte Anmeldung hier nachvollzogen werden. Schön wäre eine Information in den Response-Headers. Diese können von Modsecurity ohne großen Aufwand analysiert werden. Der Response-Body benötigt aufwändige Pufferungen.

Post to Twitter Post to Yahoo Buzz Post to Delicious Post to Digg Post to Facebook Post to Ping.fm Post to Reddit

Tags: | | |

Schreibe einen Kommentar

Fühle dich ermuntert einen Kommentar, Anmerkungen, Hinweise oder deine Ideen zum Thema zu hinterlassen. Wir freuen uns über deine Rückmeldung.