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.
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 `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;
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
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
Unsere intelligente IPS Lösung aus der Cloud ermöglicht das einfache sichern von Servern.
In wenigen Schritten ist unsere Cloud-IPS Software auf Ihrem Server installiert. Nun nur noch mit unserem Cloud Dienst verbinden - Fertig.
Wir verhindern Angriffe auf Ihre Server bevor diese stattfinden oder unterbinden dieses bereits sehr früh.
Aus all diesen Aktionen und denen anderer angebundener Server, lernt unser Dienst und wird so immer effektiver beim Schutz der Server.
Mit nur wenigen Klicks bis zu 5 Server kostenlos sichern und sofort durch unser Cloud-IPS geschützt werden.