Fail2Ban zentralisieren - Teil 1

fail2ban zentralisieren um mehrere Server zu schützen Potentielle Server Angriffe abwehren mit fail2ban

Fail2ban ist ein großartiges Tool um potentielle Angriffe auf Server zu erkennen und die erkannte IP auszusperren. Leider ist fail2ban nur für den Einzelbetrieb ausgelegt. Es schützt also nur den Server auf dem es läuft. Hat man aber mehrere Server, wird man schnell feststellen, dass die gleiche IP auch bald an den "Türen" der anderen Servern rüttelt. Mit ein paar Handgriffen kann man fail2ban aber dazu bringen die entdeckten IP's mit anderen Systemen zu teilen, damit diese sich ebenfalls abschotten können. Eine weitere Möglichkeit der Absicherung wäre aber auch das pushen der von fail2ban erkannten IP's auf einen übergeordneten Router oder Switch. Im ersten Teil des HowTo soll die IP eines Angreifers in eine MySql Datenbank geschrieben werden, so dass andere Systeme auf diesen Datenbestand zugreifen können. Es gibt natürlich auch andere Möglichkeiten als über eine Datenbank die Daten mit anderen Systemen zu teilen. Wie immer sind der Fantasie sind hier keine Grenzen gesetzt.

Systemvoraussetzungen

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

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

Als nächstes muss eine Datenbank in MySql angelegt werden, hier ist das die Datenbank namens "fail2ban". In dieser Datenbank wird eine Tabelle erzeugt:

CREATE TABLE IF NOT EXISTS `erp_core_fail2ban` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `hostname` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  `created` datetime NOT NULL,
  `name` text COLLATE utf8_unicode_ci NOT NULL,
  `protocol` varchar(16) COLLATE utf8_unicode_ci NOT NULL,
  `port` varchar(32) COLLATE utf8_unicode_ci NOT NULL,
  `ip` varchar(64) COLLATE utf8_unicode_ci NOT NULL,
  PRIMARY KEY (`id`),
  KEY `hostname` (`hostname`,`ip`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
            

PHP Skript zum Weiterreichen der IP

Nun kommt ein kleines PHP Skript zum Einsatz, welches die IP Adresse, Port, Protokoll und den fail2ban Jailnamen entgegennehmen wird und in die MySql Datenbank schreibt.
Das PHP Skript wird im Ordner /root erstellt und ausführbar gemacht. Zusätzlich sollten Leserechte für Unbefugte entzogen werden!

root@devserv3:~# cd /root && touch fail2ban.php && chmod +x fail2ban.php
            

fail2ban.php wird mit folgendem Inhalt gefüllt:

#!/usr/bin/php -n
<?php
$name = $_SERVER["argv"][1];
$protocol = $_SERVER["argv"][2];
$port = $_SERVER["argv"][3];
if (!preg_match('/^\d{1,5}$/', $port))
    $port = getservbyname($_SERVER["argv"][3], $protocol);
$ip = $_SERVER["argv"][4];

$hostname = gethostname();

// 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 = 'INSERT INTO `fail2ban` set hostname="' . addslashes($hostname) . '", name="' . addslashes($name) . '", protocol="' . addslashes($protocol) . '", port="' . addslashes($port) . '", ip="' . addslashes($ip) . '", created=NOW()';
$result = mysql_query($query) or die('Query failed: ' . mysql_error());
mysql_close($link);
exit;
            

Nun kann man das Skript testen und schauen ob Daten in der Datenbank landen.

root@devserv3:~# ./fail2ban.php jailname ssh 22 123.123.123.123
            

Fail2ban IP in MySql Datenbank gespeichert

Anbindung an Fail2Ban

Wenn das Skript funktioniert kann mit der Anbindung an Fail2Ban begonnen werden.
Dazu wird in das Fail2Ban Konfigurationsverzeichnis gewechselt.

root@devserv3:~# cd /etc/fail2ban/ && ls -al
total 28
drwxr-xr-x  4 root root 4096 Feb 13 14:56 .
drwxr-xr-x 97 root root 4096 Feb 13 15:28 ..
drwxr-xr-x  2 root root 4096 Feb 13 14:56 action.d
-rw-r--r--  1 root root  853 Nov 29  2011 fail2ban.conf
drwxr-xr-x  2 root root 4096 Feb 13 14:56 filter.d
-rw-r--r--  1 root root 7346 Jun 18  2013 jail.conf
root@devserv3:/etc/fail2ban#

In den Dateien jail.conf und jail.local (muss nicht vorhanden sein) sind die Jails und der banaction definiert.
Hier einmal am Beispiel vom Jail "pam-generic".

[pam-generic]
enabled  = true
filter   = pam-generic
port     = all
banaction = iptables-multiport
logpath  = /var/log/auth.log

Die Zeile mit dem banaction legt fest, mit welchem Action die IP behandelt werden soll.
Ist kein banaction beim Jail angegeben, so wird ein default banaction verwendet. Dieser wird in der gleichen Datei, im Bereich [DEFAULT] definiert. In der Regel ist das der Action iptables-multiport.
Im Ordner action.d sollte dann auch die Datei iptables-multiport.conf zu finden sein.
Diese Datei wird nun so erweitert, dass mit dem Ban einer IP auch unser PHP Skript aufgerufen wird. Beim Aufruf werden alle Parameter wie IP, Port, etc. übergeben.
Nach der Zeile mit actionban = ..... wird eine neue Zeile eingefügt um das PHP Skript aufzurufen:

actionban = iptables -I fail2ban-<name> 1 -s <ip> -j DROP /root/fail2ban.php <name> <protocol> <port> <ip>

Nun muss fail2ban einmal neugestartet werden. In den fail2ban logs kann überprüft werden ob es einen Fehler gab.

root@devserv3:~# /etc/init.d/fail2ban restart
root@devserv3:~# cat /var/log/fail2ban.log

Von nun an werden Einbruchsversuche erkannt und in der Datenbank protokolliert.
Im zweiten Teil des HowTo wird beschrieben, wie man die IP Adressen aus der Datenbank auf weitere Server verteilt und Angreifer aussperrt.




Zum Zweiten Teil - Fail2ban IP aus der DB auslesen und sperren

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

commentHinterlasse einen Kommentar

aFkFT47uxqJX5