Fail2Ban zentralisieren - Teil 2

fail2ban zentral aus einer Datenbank steuern Angreifer IP's aus einer Datenbank lesen und sperren

Im ersten Teil dieses HowTo wurde bereits erklärt wie man die IP Adressen potentieller Angreifer in eine zentrale Datenbank schreibt.
Im zweiten Teil geht es nun darum diese IP Adressen aus der Datenbank zu lesen und eine tatsächliche Sperrung mittels Fail2Ban zu erreichen.

Auch dieser zweite Teil soll nur ein Denkanstoss sein. Er stellt keine vollständige Lösung dar, aber mit den Grundlagen dieses HowTo ist man in der Lage ein Sicherheitssystem zu errichten, welches an die eigenen Ansprüche anpassbar ist.

Systemvoraussetzungen

Das HowTo geht davon aus, dass fail2ban, iptables und php auf dem System funktionsfähig installiert ist.
Unter Ubuntu kann man das schnell nachholen:

root@devserv3:~# sudo apt-get install php5 fail2ban iptables
            

Nun wird die Fail2Ban Konfigurationsdatei vorbereitet. Dazu wird die bei Fail2Ban mitgelieferte Datei kopiert und zum editieren (Nano ist hier der Editor) geöffnet.

cd /etc/fail2ban && cp jail.conf jail.local && nano jail.local
            

In der jail.local wird ein Jail am Ende des Default Blockes eingefügt. Der Name des Gefängnisses "blocklist"

[blocklist]
enabled  =  true
port     =  ssh
filter   =  sshd
logpath  =  /etc/fail2ban/empty.log
maxretry =  1
banaction = iptables-allports
action   = %(action_)s

Mit dieser Blocklist definieren wir eine Datei /etc/fail2ban/empty.log die überwacht werden soll. Als maximale Einbruchsversuch wird 1 festegelegt, so dass beim ersten auftauchen einer IP Adresse ein Sperrung vollzogen wird. Die Art der Sperrung wird mit banaction festgelegt und bedeutet im Beispiel einer Sperrung der IP auf allen Ports.
Für den Angreifer hinter der gesperrten IP ist der Server damit nicht mehr erreichbar. Hier muss unbedingt darauf geachtet werden, dass man sich nicht selbst aussperrt!

Jetzt muss Fail2Ban einmal neu gestartet werden und es kann getestet werden ob Fail2Ban IP in die Blocklist aufnimmt.
Dazu wird eine IP Adresse an Fail2Ban übergeben die gesperrt werden soll, gleich darauf wird ein - in die empty.log geschrieben um Fail2Ban eine Veränderung anzuzeigen. Daraufhin wird Fail2Ban die übergebene IP sperren.

root@devserv3:~# service fail2ban restart
 * Restarting authentication failure monitor fail2ban             [ OK ]
fail2ban-client set blocklist banip 1.168.100.1 echo "-" > /etc/fail2ban/empty.log;

Gab es keine Fehlermeldung hat alles geklappt. Bei einem Fehler hilft einem der Blick in die Logdatei weiter (/var/log/fail2ban.log). In IPTables sollte die IP nun ebenfalls gelistet sein.

root@devserv3:~# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
fail2ban-blocklist  tcp  --  anywhere             anywhere
fail2ban-ssh  tcp  --  anywhere             anywhere             multiport dports ssh

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Chain fail2ban-blocklist (1 references)
target     prot opt source               destination
DROP       all  --  1-168-100-1.dynamic.hinet.net  anywhere
RETURN     all  --  anywhere             anywhere

Chain fail2ban-ssh (1 references)
target     prot opt source               destination
RETURN     all  --  anywhere             anywhere

PHP Skript zum holen der IP aus der Datenbank

Nun kommt ein kleines PHP Skript zum Einsatz, mit dem die IP Adressen aus der zentralen Datenbank gelesen werden.
Um zu verhindern das immer wieder alle IP Adressen aus der Datenbank gelesen werden, wird die Datenbank-Spalte created benutzt. So werden in dem Skript nur die Einträge der letzten 60 Sekunden geholt.
Der Name des Skript fail2ban.get.php

#!/usr/bin/php -n
<?php
// connect to mysql by hostname, username and password
$link = mysql_connect('devserv3', 'fail2ban', 'password') or die('Could not connect: ' . mysql_error());
mysql_select_db('fail2ban') or die('Could not select database');
$query = 'SELECT ip FROM `fail2ban` where created>DATE_ADD(NOW(), INTERVAL -60 SECOND)';
$result = mysql_query($query) or die('Query failed: ' . mysql_error());
$cmd = null;
while ($row = mysql_fetch_object($result)) {
    $cmd .= 'fail2ban-client set blocklist banip ' . $row->ip . ' && ';
}
if ($cmd) {
    $cmd .= "echo \"-\" > /etc/fail2ban/empty.log";
    $cmd = $cmd . ' >/dev/null 2>/dev/null &';
}
mysql_close($link);
exit;

Nun einmal kurz das skript testen ....

root@devserv3:~# ./fail2ban.get.php

Keine Fehler? Prima.
Nun legen wir das Skript als Cronjob an, so dass es jede Minute aufgerufen wird und IP's sperrt. Man kann den Zyklus natürlich auch anheben, falls es nicht jede Minute sein soll - dann aber auch die 60 Sekunden im Skript entsprechend anpassen.
Wir modifizieren dazu mit nano die Datei: /etc/crontab und fügen folgendes ein.

*/1 * * * * root nice -n 19 /usr/bin/php -c /etc/php5/apache2/php.ini -f /root/fail2ban.get.php > /dev/null 2>&1

Fertig.




Zum ersten Teil - Fail2ban IP zentral in einer Datenbank sammeln

Letzte Änderung: 15.10.2015
Fail2ban centralize - IP share or saving 2
Wie gefällt dir der Artikel?
3.55 Bisher 7 Bewertungen = 3.5star_rate

commentHinterlasse einen Kommentar

auTrXCRuLweNn