fail2ban Monitoring

fail2ban Monitoring

fail2ban

Fail2ban ist ein nützliches Werkzeug und ich habe ja schon einmal darüber geschrieben: fail2ban und dynamische IP-Adressen. Heute mal ein etwas anderes Thema welches mich beruflich ebenfalls häufig bewegt: Monitoring.

Also wie würde man vorgehen wenn man einen Check für Nagios, Icinga2, Shinken, ... braucht? Man sucht in der Suchmaschine des Vertrauens oder bemüht eine der Plugin-Sammlungen im Internet. Doch halt, ein Blick ins Repository von fail2ban verrät das ein passender Check bereits mitgebracht wird: https://github.com/fail2ban/fail2ban/tree/master/files/nagios.

Das ist ja mal richtig super 🙂 Was mir jetzt weniger gefällt ist die Ausgabe der Performance-Daten:

CHECK FAIL2BAN ACTIVITY - CRITICAL - 6 detected jails with 195 current banned IP(s) | apache.currentBannedIP=0 dovecot.currentBannedIP=0 fail2ban.currentBannedIP=0 postfix.currentBannedIP=0 roundcube.currentBannedIP=0 sshd.currentBannedIP=195

Viele Monitoringinstallationen die ich betreue verwenden zur Visuallisierung rrd basierte Systeme wie zum Beispiel PNP4Nagios (http://docs.pnp4nagios.org/start). Das ist jetzt weniger toll, da sich bei mir durchaus auch mal die Anzahl der jails ändern kann. Zweitens sind mir diese Daten eigentlich egal, viel interessanter finde ich die Anzahl der Jails sowie die aktuell geblockten IPs. Das täte mir reichen.

Naja, dann also mal in den Quellcode rein geschaut. Die passende Stelle sollte sich finden lassen. Ist in Python geschrieben. Das ist jetzt nicht so meins, aber so eine kleine Änderung/Ergänzung bekomme ich allemal hin. Ich hab ja schon das ein oder andere kleinere Skript in Python geschrieben. Doch halt, Moment: Der Nagios Check ist in perl geschrieben. Das ist jetzt allerdings sehr meins. Kurz den Code angelesen und tada, fertig. Nun in einen Pull Request gepackt und fertig: https://github.com/fail2ban/fail2ban/pull/2732.

Meine Ausgabe sieht jetzt so aus:

CHECK FAIL2BAN ACTIVITY - CRITICAL - 6 detected jails with 195 current banned IP(s) | jails=6 currentBannedIp=195

Die alte Ausgabe möchtest Du zusätzlich haben? Das geht natürlich ebenfalls:

CHECK FAIL2BAN ACTIVITY - CRITICAL - 6 detected jails with 195 current banned IP(s) | jails=6 currentBannedIp=195 apache.currentBannedIP=0 dovecot.currentBannedIP=0 fail2ban.currentBannedIP=0 postfix.currentBannedIP=0 roundcube.currentBannedIP=0 sshd.currentBannedIP=195

Oder man lässt alles so wie es ist, das geht selbstverständlich weiterhin 😛

Hier der Link zu meiner Variante von check_fail2ban: https://github.com/SteScho/fail2ban/tree/master/files/nagios.

fail2ban und dynamische IP-Adressen

fail2ban und dynamische IP-Adressen

fail2ban ist ein sehr, sehr praktisches Werkzeug (http://www.fail2ban.org). Und jeder, der fail2ban regelmäßig nutzt hat sich selbst schon einmal ausgesperrt. Gut dem, der eine statische IP hat und diese via ignoreip auf die Whitelist gesetzt hat (http://www.fail2ban.org/wiki/index.php/Whitelist). Pech hingegen für mich, der bei der deutschen Tel... unter Vertrag ist, privat einen DSL Anschluss hat und nicht bereit ist die extrem hohen Kosten für einen Vertrag mit statischer IP zu zahlen.

Dynamische IP-Adresse

Das Problem dabei ist, dass dynamische IP-Adressen sich so dann und wann ändern. Nur was trägt man in einer Witelist ein die statischer Natur ist? So wie von fail2ban verwendet?

Was ich hingegen habe ist einen passenden Eintrag ins DNS der auf meine wechselnde IP zeigt (DynDNS oder wie auch immer ihr das Kind nennen wollt). Also fix ein Skript erstellt welches im tmp-Verzeichnis die dazugehörige IP puffert. Sobald sich diese ändert wird eine passende fail2ban local Config erstellt und die komplette Config neu eingelesen. Da ich ebenfalls auf eine Leitung mit statischer IP-Adresse zugriff habe wird ignoreip eben mit diesem statischen Teil befüllt und anschließend um den dynamischen Teil erweitert.

#!/bin/bash

#
# Whitelisted eine dynamische IP in Fail2ban
#


IGNALWAYS="127.0.0.1/8 ::1 193.nn.mm.0/24"
IGNDYN="dyn.gehirn-mag.net"
IGNFILE="/etc/fail2ban/jail.d/ignoreip.local"
TMPFILE="/tmp/fail2ban-dynip"


# Suche nach aktueller IP sowie gepufferter IP
CURIP=$($(which dig) +short $IGNDYN)
[ -f $TMPFILE ] && OLDIP=$(cat $TMPFILE) || OLDIP="--unknown--"
echo "aktuelle IP: $CURIP gepufferte IP: $OLDIP"

# Falls IPs verschieden ignoreip neu schreiben
if [ $CURIP != $OLDIP ]; then
    echo -n "Ändere ignoreip: "
    echo $CURIP > $TMPFILE
    echo -e "# written by $0 ad $(date)\\n\\n[DEFAULT]\\nignoreip = $IGNALWAYS $CURIP\\n" > $IGNFILE
    $(which fail2ban-client) reload
    # Debug
    $(which fail2ban-client) --dp | mail -s "$(hostname) fail2ban-dynip $CURIP" ...@gehirn-mag.net
fi

 

Falls Du weißt welchen DNS-Server Du fragen musst kannst Du Zeile 15 entsprechend ergänzen. Sowie sich die IP ändert lasse ich mir via Email die aktuelle fail2ban Konfig senden (Zeile 26). Wer das nicht will nimmt diese Zeile einfach raus. Was jetzt noch fehlt ist der regelmäßige Aufruf. Ich selbst verwende dazu folgenden cron Eintrag welcher alle 15 Minuten läuft:

# Fail2ban: die private IP auf die Whitelist setzen
*/15 * * * * /usr/local/bin/fail2ban-ignoreip.sh 2>&1 | /usr/bin/logger -t fail2ban-dynip

Fertig, das war es 🙂