Online Services

Fail2Ban + zentrale Datenbank

Lies Angreifer-IPs aus deinem zentralen Speicher aus, gib sie an Fail2Ban weiter und halte jeden Dienst mit Cron-Automation konsistent geschützt.

Fail2Ban-Konsole

Überblick

Dieser zweite Teil erklärt, wie du die Angreifer-IP-Kette aus der zentralen Datenbank liest (siehe Teil eins) und Fail2Ban anweist, jeden aufgeführten Host zu blockieren. Ein durchdachtes Automations-Rezept, das du an deine Umgebung anpassen kannst.

Systemvoraussetzungen

  • Funktionierendes Fail2Ban, iptables und PHP auf dem Host
  • Datenbank-Zugangsdaten mit Leserechten auf die Angreifer-Tabelle
  • Schreibbares /etc/fail2ban/empty.log für Blocklisten-Trigger
root@devserv3:~# sudo apt-get install php7.4 fail2ban iptables
                            

Fail2Ban-Blocklisten-Jail

Überwacht eine schlanke Logdatei und blockiert jede IP genau einmal. Die Jail nutzt banaction iptables-allports, sodass alle Dienste geschützt sind.

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

Neuladen & Testen

Nach Anpassungen an jail.local Fail2Ban neu starten und eine Beispiel-IP per fail2ban-client zusammen mit einer Änderung der Empty-Flag-Datei einspeisen.

root@devserv3:~# service fail2ban restart
root@devserv3:~# fail2ban-client set blocklist banip 1.168.100.1
echo "-" > /etc/fail2ban/empty.log
                            

Prüfe iptables, um sicherzustellen, dass die Drop-Regel für die geblockte IP existiert.

root@devserv3:~# iptables -L fail2ban-blocklist
                            

PHP-Synchronisierer

Das Skript holt IPs, die in den letzten 60 Sekunden hinzugefügt wurden, triggert Fail2Ban für jeden Eintrag und touched die leere Logdatei.

#!/usr/bin/php -n
<?php
$link = mysql_connect('devserv3', 'fail2ban', 'password');
mysql_select_db('fail2ban');
$query = 'SELECT ip FROM fail2ban WHERE created>DATE_ADD(NOW(), INTERVAL -60 SECOND)';
$result = mysql_query($query);
$cmd = '';
while ($row = mysql_fetch_object($result)) {
    $cmd .= 'fail2ban-client set blocklist banip ' . $row->ip . ' && ';
}
if ($cmd) {
    $cmd .= "echo \"-\" > /etc/fail2ban/empty.log";
    $cmd .= ' >/dev/null 2>/dev/null &';
    exec($cmd);
}
mysql_close($link);
exit;
                            

Cron-Planung

Starte das PHP-Skript jede Minute, um Fail2Ban mit der zentralen Datenbank synchron zu halten. Passe das Intervall in der SQL-Abfrage an, falls du einen anderen Takt benötigst.

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

Angreifern voraus bleiben

Nutze Datenbanksignale, um Fail2Ban automatisch zu füttern und jeden Knoten über aktive Sperren zu informieren.

Unser Team fragen