RSS-Feed anzeigen

jahlives

ban4ever

Bewerten
ban4ever
ban4ever ist ein addon für fail2ban. fail2ban ist ein Überwachungstool für Logfiles. Anhand von definierten Mustern kann fail2ban die Logfiles nach Verletzungen überwachen und dann entsprechend reagieren. Es soll nicht Teil dieses Beitrags sein, wie man fail2ban installieren kann. Da es sich dabei um Python Code handelt, sollte eine Installation relativ problemlos vonstatten gehen.

Warum ban4ever?
Im folgenden soll es um das Addon ban4ever gehen. Ich möchte aber kurz erläutern warum man das braucht :-)
fail2ban an sich ist sehr gut, um die Logs nach Verletzungen zu durchsuchen. Da als Muster reguläre Ausdrücke verwendet werden sind die Möglichkeiten sehr mächtig. Allerdings ist (für mich) der Pferdefuss von fail2ban, dass es nicht unterschiedlich reagieren kann, wenn ein "Verletzer" nach seiner Sperre erneut vorbeikommt. fail2ban kann keinen Zusammenhang mit bereits abgelaufenen Sperren erstellen und behandelt einen "Wiederkehrer" genau gleich wie einen "Neuling".
Und genau hier setzt ban4ever an: Es überwacht das Logfile von fail2ban (fail2ban.log) und zählt die bereits einmal gesperrten IPs aus. Wird ein Schwellenwert überschritten (z.Z. mehr als 1 Verletzung) schreibt ban4ever die IPs in eine Liste, welche dann abgearbeitet, und die enthaltenen IPs in einer eigenen Chain gesperrt werden. Damit ist es egal wenn fail2ban die IP nach Ablauf der Sperrfrist wieder entfernt, denn sie ist noch in einer von fail2ban unabhängigen Chain vorhanden und bleibt gesperrt.

Voraussetzungen
ban4ever setzt einige Dinge voraus, damit es funzen kann
  • fail2ban muss installiert sein und sauber laufen (das setzt mindestens Python 2.3 voraus)
  • Lesezugriff für das Script auf fail2ban.log muss gegeben sein
  • bash muss installiert sein. Könnte zwar auch mit anderen Shells laufen, habe es aber nur mit bash getestet!
  • php (php-cli) muss installiert sein. Das PHP5 Apache Modul reicht nicht, da das Script auf der Kommandozeile (cli) läuft
  • iptables muss installiert sein
Die beiden letzten Punkte sollten bei der Diskstation eigentlich durch die Firmware bereits erledigt sein.
Daneben gibt es noch einige fakultative Punkte, die z.Z. nur für die devel Version von ban4ever gelten
  • ein Mailkommando muss vorhanden sein, welches den Betreff einer Mail per -s Parameter aktzeptiert (z.B. mailx)
  • für sogn Abuse Mails an Provider muss das Mailkommando auch den -c Parameter aktzeptieren (CarbonCopy)
  • für Abuse Mails an Provider muss das Script Zugriff auf die Banmails von fail2ban haben d.h. fail2ban muss so konfiguriert sein, dass diese Mails an den admin geschickt werden
Installation und Konfiguration
Es gibt ban4ever z.Z. in Version 1.0 (stable) und Version 1.1 (devel). Die devel Version ist noch nicht ganz fertig, funzt aber soweit schon ganz gut :-) Empfehlen würde ich trotzdem nur die stable Version.
Nach dem Download (stable oder devel) das Archiv einfach entpacken.
Bei stable gibt es nichts zum Konfigurieren. Es wird davon ausgegangen, dass das fail2ban Log unter /var/log/fail2ban.log liegt. Beim devel hingegen gibt es einige Konfigvars, welche ich hier beschreibe

Nachdem alles entpackt und eingerichtet ist, kann man mal probieren den Daemon manuell zu starten. Die manuelle Methode hat den Vorteil, dass Fehlermeldungen direkt auf der Konsole ausgegeben werden. Wenn der Daemon via Client gestartet wird, dann landen alle Meldungen in einem Logfile. Läuft alles fehlerfrei, dann sollte man den Daemon via Client starten
Code:
INSTALLATION_PATH/ban4ever-daemon.sh
obiges ist die manuelle Methode. Mittels ctrl+c kann man den Daemon beenden, wenn er ohne Fehler gestartet ist.
Zum Starten des Daemon via Client
Code:
INSTALLATION_PATH/ban4ever.sh start
das Logfile für den Daemon ist INSTALLATION_PATH/ban4ver.log


Client
Code:
#!/bin/bash


checkStatus(){
 ii=$(ps aux | grep ban4ever-daemon | grep -v grep | awk '{print $2}')
 if [ ! "x$ii" = 'x' ] ; then
  echo "$ii"
 fi
}


startService(){
 [ ! -e ./ban4ever-daemon.sh ] && echo "$(date +'%a %d.%m.%y %T') Daemon File not found" && echo "$(date +'%a %d.%m.%y %T') Daemon File not found" >> ./ban4ever.log && exit 5
 status=$(checkStatus)
 [ ! "x$status" = 'x' ]  && echo "$(date +'%a %d.%m.%y %T') service already runnig see PID(s) $status" && echo "$(date +'%a %d.%m.%y %T') service already runnig see PID(s) $status" >> ./ban4ever.log && exit 0
 bash ./ban4ever-daemon.sh >> ./ban4ever.log 2>&1 &
 status=$(checkStatus)
 [ "x$status" = 'x' ] && echo "$(date +'%a %d.%m.%y %T') ERROR: could not start" && echo "$(date +'%a %d.%m.%y %T') ERROR: could not start" >> ./ban4ever.log && exit 7
 [ ! "x$status" = 'x' ] && echo "$(date +'%a %d.%m.%y %T') sucessfully started see PID $status" && echo "$(date +'%a %d.%m.%y %T') sucessfully started see PID $status" >> ./ban4ever.log
}


stopService(){
 status=$(checkStatus)
 [ "x$status" = 'x' ] && echo "$(date +'%a %d.%m.%y %T') Not running" && echo "$(date +'%a %d.%m.%y %T') Not running" >> ./ban4ever.log
 for i in $status ; do
  kill -9 $status > /dev/null 2>&1
 done
 status=$(checkStatus)
 [ "x$status" = 'x' ] && echo "$(date +'%a %d.%m.%y %T') succesfully terminated" && echo "$(date +'%a %d.%m.%y %T') succesfully terminated" >> ./ban4ever.log
 [ ! "x$status" = 'x' ] && echo "$(date +'%a %d.%m.%y %T') ERROR: could not terminate. check PID $status" &&  echo "$(date +'%a %d.%m.%y %T') ERROR: could not terminate. check PID $status" >> ./ban4ever.log && exit 1
}


case "$*" in
 'start')
  startService && exit 0
 ;;
 'stop')
  stopService && exit 0
 ;;
 'restart')
  stopService
  startService && exit 0
 ;;
 'start-force')
  stopService
  startService && exit 0
 ;;
 *)
 echo 'USAGE: start|stop|restart|start-force'
 ;;
esac
Daemon
Code:
#!/bin/bash


echo "$(date +'%a %d.%m.%y %T') ban4ever started"
pause=0
while true ; do
 sleep 30
 touch ./ban4ever.txt.tmp && echo > ./ban4ever.txt.tmp
 for i in $(grep Ban /var/log/fail2ban.log | awk '{print $7}') ; do
  echo $i >> ./ban4ever.txt.tmp
 done
 mv ./ban4ever.txt.tmp ./ban4ever.txt
 /usr/bin/php ./ban4ever.php > /dev/null 2>&1
 for i in $(cat ./ban4ever_act.txt) ; do
  [ "$(iptables -L OFFENDERS -n | grep  $i)" ] && continue
  iptables -A OFFENDERS -s $i -j DROP && echo "$(date +'%a %d.%m.%y %T') IP $i added to block"
 done
 ii=`expr $pause % 120`
 [ $ii -eq 0 ] && echo "$(date +'%a %d.%m.%y %T') Status up and running"
 pause=`expr $pause + 1`
done

Aktualisiert: 21.02.2012 um 15:26 von jahlives

Kategorien
Linux

Kommentare

  1. Avatar von itari
    laufen die Skripte auch mit der /bin/ash ??? sehe im Moment nichts, was dagegen sprechen würde, oder?
  2. Avatar von jahlives
    Habe mir den daemon Teil auch mal noch angeguckt, sehe auch nichts was gegen ash sprechen würde. Kenn mich aber mit den Spezialitäten der einzelnen Shells zu wenig aus, um das sicher sagen zu können. Und da ich es selber nur mit bash verwendet habe, wollte ich mit der Angabe zu Shell nur sichergehen ;-)
    Muss die Tage eh mal noch ein paar Sachen im devel testen, da guck ich auch gleich ob andere Shells die Scripte auch mögen