iptables

iGDark

Lt. Junior Grade
Registriert
Sep. 2005
Beiträge
306
Moin,

um meinen server vor andauernden angriffen ein wenig abzuschirmen, habe ich nun fail2ban installiert. dieses wertet allerdings nur die access.log aus, so dass ich noch andere am hals habe.

in meinem apache-log werden recht oft verzeichnis-scans (error.log) für phpmyadmin gezeigt:

[Sun Sep 26 21:31:03 2010] [error] [client 66.109.241.122] File does not exist: /var/www/vhosts/blabla.de/httpdocs/mysql
[Sun Sep 26 21:31:04 2010] [error] [client 66.109.241.122] File does not exist: /var/www/vhosts/blabla.de/httpdocs/pma
[Sun Sep 26 21:31:04 2010] [error] [client 66.109.241.122] File does not exist: /var/www/vhosts/blabla.de/httpdocs/phpmyadmin
[Sun Sep 26 21:31:04 2010] [error] [client 66.109.241.122] File does not exist: /var/www/vhosts/blabla.de/httpdocs/phpMyAdmin
[Sun Sep 26 21:31:05 2010] [error] [client 66.109.241.122] File does not exist: /var/www/vhosts/blabla.de/httpdocs/scripts, referer: 92.51.132.164
[Sun Sep 26 21:31:05 2010] [error] [client 66.109.241.122] File does not exist: /var/www/vhosts/blabla.de/httpdocs/mysql, referer: 92.51.132.164
[Sun Sep 26 21:31:05 2010] [error] [client 66.109.241.122] File does not exist: /var/www/vhosts/blabla.de/httpdocs/phpmyadmin, referer: 92.51.132.164
[Sun Sep 26 21:31:05 2010] [error] [client 66.109.241.122] File does not exist: /var/www/vhosts/blabla.de/httpdocs/scripts
[Sun Sep 26 21:31:05 2010] [error] [client 66.109.241.122] File does not exist: /var/www/vhosts/blabla.de/httpdocs/mysql
[Sun Sep 26 21:31:05 2010] [error] [client 66.109.241.122] File does not exist: /var/www/vhosts/blabla.de/httpdocs/phpmyadmin
[Sun Sep 26 21:31:05 2010] [error] [client 66.109.241.122] File does not exist: /var/www/vhosts/blabla.de/httpdocs/phpMyAdmin, referer: 92.51.132.164
[Sun Sep 26 21:31:05 2010] [error] [client 66.109.241.122] File does not exist: /var/www/vhosts/blabla.de/httpdocs/pma, referer: 92.51.132.164
[Sun Sep 26 21:31:05 2010] [error] [client 66.109.241.122] File does not exist: /var/www/vhosts/blabla.de/httpdocs/scripts, referer: 92.51.132.164
[Sun Sep 26 21:31:05 2010] [error] [client 66.109.241.122] File does not exist: /var/www/vhosts/blabla.de/httpdocs/phpMyAdmin
[Sun Sep 26 21:31:05 2010] [error] [client 66.109.241.122] File does not exist: /var/www/vhosts/blabla.de/httpdocs/mysql, referer: 92.51.132.164
[Sun Sep 26 21:31:05 2010] [error] [client 66.109.241.122] File does not exist: /var/www/vhosts/blabla.de/httpdocs/pma
[Sun Sep 26 21:31:05 2010] [error] [client 66.109.241.122] File does not exist: /var/www/vhosts/blabla.de/httpdocs/phpmyadmin, referer: 92.51.132.164
[Sun Sep 26 21:31:06 2010] [error] [client 66.109.241.122] File does not exist: /var/www/vhosts/blabla.de/httpdocs/phpMyAdmin, referer: 92.51.132.164
[Sun Sep 26 21:31:06 2010] [error] [client 66.109.241.122] File does not exist: /var/www/vhosts/blabla.de/httpdocs/pma, referer: 92.51.132.164

okay. da es sich ja innerhalb von sekunden abspielt habe ich nun folgendes gemacht:
iptables-chain namens http-flood erzeugt.

drop-regel in der chain:
iptables -A http_flood -m limit --limit 3/sec -p tcp --dport 80 -j DROP

dann die chain in die INPUT chain gelegt:

iptables -A INPUT -p tcp --dport 80 -j http_flood

jetzt die frage (ich bin kein iptables-spezi...leider :D): das bedeuted, dass sobald jemand mehr als 3 http-anfragen pro sekunde schickt, wird er gedroppt, oder? für welchen zeitraum gilt diese sperre dann?

habe ich die möglichkeit, eine regel zu erstellen, die sobald soetwas passiert (mehr als 3 http/anfragen pro sec) die ip permanent geblockt wird (eigene -j DROP regel in der input-chain)? sprich das sich diese regel dann selber erstellt?


nächstes problem:

[Mon Sep 27 00:00:32 2010] [error] [client 217.109.146.25] client sent HTTP/1.1 request without hostname (see RFC2616 section 14.23): /w00tw00t.at.ISC.SANS.DFind:)
[Mon Sep 27 03:14:59 2010] [error] [client 217.109.146.25] client sent HTTP/1.1 request without hostname (see RFC2616 section 14.23): /w00tw00t.at.ISC.SANS.DFind:)
[Mon Sep 27 06:27:35 2010] [error] [client 217.109.146.25] client sent HTTP/1.1 request without hostname (see RFC2616 section 14.23): /w00tw00t.at.ISC.SANS.DFind:)
[Mon Sep 27 09:45:56 2010] [error] [client 217.109.146.26] client sent HTTP/1.1 request without hostname (see RFC2616 section 14.23): /w00tw00t.at.ISC.SANS.DFind:)
[Mon Sep 27 10:42:04 2010] [error] [client 216.205.76.228] client sent HTTP/1.1 request without hostname (see RFC2616 section 14.23): /w00tw00t.at.ISC.SANS.DFind:)
[Mon Sep 27 12:51:41 2010] [error] [client 88.149.200.154] client sent HTTP/1.1 request without hostname (see RFC2616 section 14.23): /w00tw00t.at.ISC.SANS.DFind:)

wie kann ich dieses kerlchen bannen? kommt auch täglich mit unterschiedlichen ip's, leider in keinem sekunden-zeitfenster.

besteht die möglichkeit, fail2ban auf die error.log-datei zu erweitern?

danke und viele grüße,
marco
 
ich habs dir ja schon im letzten thread geschrieben, dass du mit fail2ban nicht automatisch denial of service etc blocken kannst. zum einen kann fail2ban nur das bannen, was irgendwo in ner logdatei landet (und das ist bei weitem nicht alles!) und zum anderen kann die sache auch schnell nach hinten losgehen.

iptables -A http_flood -m limit --limit 3/sec -p tcp --dport 80 -j DROP
eine geile idee.. du hättest vielleicht vorher das manual iptables (8) lesen sollen.

zitat:
This module matches at a limited rate using a token bucket filter. A rule using this extension will match until this limit is reached (unless the `!' flag is used). It can be used in combination with the LOG target to give limited logging, for example.
[!] --limit rate[/second|/minute|/hour|/day]
Maximum average matching rate: specified as a number, with an optional `/second', `/minute', `/hour', or `/day' suffix; the default is 3/hour.
--limit-burst number
Maximum initial number of packets to match: this number gets recharged by one every time the limit specified above is not reached, up to this number; the default is 5.

kurz gesagt.. eine blöde idee den limit-match zu verwenden. die limitierung gilt nämlich global, und nicht etwa für jede ip-adresse einzeln! dafür ist der hashlimit-match gedacht! und selbst das ist ne blöde idee. wenn die seite entsprechend groß ist und der client kein keep-alive unterstützt, dann ist er binnen sekunden gebannt nach dem ersten seitenaufruf.. hurra!

fail2ban kann beliebige logdateien parsen.. vorausgesetzt du konfigurierst es korrekt. auch dafür gibt es manuals -> http://www.fail2ban.org/wiki/index.php/Main_Page
 
Man sollte wohl noch dazuschreiben, dass es bei diesem Limit nicht um "3 HTTP-Anfragen pro Sekunde" sondern um "3 TCP-Pakete pro Sekunde an den HTTP-Port" geht. Das sind sehr unterschiedliche Dinge. Allein bei einer einzige HTTP-Anfage und -Antwort gehen höchtswahrscheinlich schon insgesamt 5 oder 6 Pakete auf Port 80 ein. So einen HTTP-Zugriff willst du immer entweder komplett abarbeiten oder gar nicht.

Die Zahl der HTTP-Zugriffe auf TCP-Ebene zu limitieren ist keine taugliche Methode.
 
ja richtig.. neue verbindungen wäre mit -m tcp --syn der fall.. ggf. noch in kombination mit -m state --state NEW

egal wie.. per iptables sowas zu limitieren ist ne blöde idee..
 
moin
so hab die regel raus. die regel soll ja auch gar keine DoS-Attacken blocken, sondern eben diese andauernden Verzeichnis-Scanns. Es passiert zwar nix, trotzdem hätte ich diese Leute eben gerne im iptables auf drop.

werde mir das mit fail2ban mal ansehen und die config ggf. so ändern, dass er diese verzeichniss-scanner genauso auf die block-liste setzt wie z.b. die bots, die versuchen per ssh an meinen server zu kommen .... in der hinsicht blockt fail2ban mir nämlich schon einiges weg :)
Ergänzung ()

so, ich hab mir das mal durchgesehen, da gabs zum glück schon ein beispiel-regex. habe das jetzt mal so eingefügt:

Code:
[Apache-Errorlog]
enabled = true
port = http
logfile = /var/www/vhosts/blabla.de/statistics/logs/error_log
timeregex = \S{3} \S{3} \d{2} \d{2}:\d{2}:\d{2} \d{4}
timepattern = %%a %%b %%d %%H:%%M:%%S %%Y
failregex = [[]client <HOST>[]] (File does not exist|script not found or unable to stat): .*/(cgi-bin|admin|Admin|sql|mail|phpmyadmin|file:|php|pma|web|PMA|$|*******und noch viele weitere beschreibungen die gerne von solchen scannern verwendet werden *************

im fail2ban log steht das modul als geladen und die ip-tables-chain wurde auch erstellt. hoffe mal das funktioniert so?!?



ich habe für diesen

[Mon Sep 27 00:00:32 2010] [error] [client 217.109.146.25] client sent HTTP/1.1 request without hostname (see RFC2616 section 14.23): /w00tw00t.at.ISC.SANS.DFind
[Mon Sep 27 03:14:59 2010] [error] [client 217.109.146.25] client sent HTTP/1.1 request without hostname (see RFC2616 section 14.23): /w00tw00t.at.ISC.SANS.DFind
[Mon Sep 27 06:27:35 2010] [error] [client 217.109.146.25] client sent HTTP/1.1 request without hostname (see RFC2616 section 14.23): /w00tw00t.at.ISC.SANS.DFind
[Mon Sep 27 09:45:56 2010] [error] [client 217.109.146.26] client sent HTTP/1.1 request without hostname (see RFC2616 section 14.23): /w00tw00t.at.ISC.SANS.DFind
[Mon Sep 27 10:42:04 2010] [error] [client 216.205.76.228] client sent HTTP/1.1 request without hostname (see RFC2616 section 14.23): /w00tw00t.at.ISC.SANS.DFind
[Mon Sep 27 12:51:41 2010] [error] [client 88.149.200.154] client sent HTTP/1.1 request without hostname (see RFC2616 section 14.23): /w00tw00t.at.ISC.SANS.DFind

eine extra-regel gebaut. aber fail2ban ist ja so konfiguriert das er erst nach 5 mal die ip ins drop nimmt. kann ich es bei diesem ding auch schon nachm ersten mal weghauen?
 
Zuletzt bearbeitet:
jep hab ich eingebaut. das regex hat noch nich gepasst..... sollte nun eig. stimmen, mal sehen ob heut nacht jemand rein rennt ^^
Ergänzung ()

es will nich klappen....
so sieht es jetzt aus:

Code:
[Apache-w00t]
enabled = true
port = http
maxretry = 1
logfile = /var/www/vhosts/blablubb.de/statistics/logs/error_log
timeregex = \S{3} \S{3} \d{2} \d{2}:\d{2}:\d{2} \d{4}
timepattern = %%a %%b %%d %%H:%%M:%%S %%Y
failregex = [[]client <HOST>[]] client sent HTTP/1.1 request without hostname \(see RFC2616 section 14.23\): /w00tw00t.at.ISC.SANS.test0:\)

so sieht der eintrag im error.log aus:

Code:
[Fri Oct 01 13:45:26 2010] [error] [client 62.103.39.74] client sent HTTP/1.1 request without hostname (see RFC2616 section 14.23): /w00tw00t.at.ISC.SANS.DFind:)

die regex-tester die es so gibt sagen das es matchen müsste... aber das tut es nich :(
oder muss maxretry auf 0 stehen?
 
Hat sich dein Problem bezüglich :

[Sun Sep 26 21:31:03 2010] [error] [client 66.109.241.122] File does not exist: /var/www/vhosts/blabla.de/httpdocs/mysql

und diesen Logs

[Mon Sep 27 12:51:41 2010] [error] [client 88.149.200.154] client sent HTTP/1.1 request without hostname (see RFC2616 section 14.23): /w00tw00t.at.ISC.SANS.DFind

bereits erledingt ...also funktioniert es nun bei dir mit fail2ban ?
Ansonsten kann ich mal dafür 2 Filterregeln und Einstellungen für Failban herauskopieren die bei mir sehr gut funktionieren. Hatte sie nach dem gleichen Problem einfach selber erstellt.

Grüße
 
Zurück
Oben