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 &';
    exec($cmd, $output, $returnValue);
}
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

Server Sicherheit mit unserer Cloud-IPS

Sichere deine Server ganz einfach mit der intelligenten IPS aus der Cloud.
Unsere Cloud-IPS Software ist ganz einfach zu installieren und kann dann über einen Browser konfiguriert werden.
Stoppe Server Angriffe bevor diese stattfinden und hilf auch anderen Cloud Anwendern Ihre Server sicher zu betreiben.

Steigere die Serversicherheit mit unserem Cloud-IPS!

  • Einfaches Setup auf dem Server check
  • Automatische Updates check
  • Geringe System Last check
  • Manuelles Lock/Unlock von IP's check
  • Cloud Standort in Deutschland check
  • Detailierte Statistiken check
  • Private Whitelist check
  • SSL Verschlüsselung check
Intrusion Prevention
account_box

Kostenlos Starten

Mit nur wenigen Klicks bis zu 5 Server kostenlos sichern und sofort durch unser Cloud-IPS geschützt werden.

  • check 5 Server Kostenlos
  • check Keine Kreditkarte notwendig
Fail2ban centralize - IP share or saving 2
Wie gefällt dir der Artikel?
3.55 Bisher 7 Bewertungen = 3.5star_rate

commentKommentare

Schönes Konzept. Allerdings scheint im PHP-Script "fai2ban.get.php" ein Fehler drin zu sein. Du füllst die Variable "$cmd" bis zum Schluss, schreibst sie aber nicht ins empty.log oder machst kein execute. Die Variable $cmd hat einen Wert, der bei Beendigung des Scriptes einfach nur verloren geht. Oder sehe ich was falsch?

Thomas_H - 16.05.2018 um 11:30

Oh Mann. Hat das echt 3 Jahre gedauert bis jemand diesen fiesen Fehler gefunden hat.
Danke Dir. Ist somit korrigiert.

Sven Ruttloff - 16.05.2018 um 11:47

commentHinterlasse einen Kommentar

aVv1UuV66SGMb