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.
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
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
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.
Mit nur wenigen Klicks bis zu 5 Server kostenlos sichern und sofort durch unser Cloud-IPS geschützt werden.