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.
Ü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.logfü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.