BlockHosts

Das Script BlockHosts ermöglicht das automatische Sperren von IP Adressen für verschiedene Dienste wie zum Beispiel ssh.
Dazu wird das Server-Logfile anhand definierter Regeln durchsucht und bei Zutreffen einer Regel wird für diese IP ein Strafpunkt vergeben (Counter erhöht). Ab einer einstellbaren Anzahl an Strafpunkten wird die IP für eine definierbare Zeit gesperrt. Die Sperrung erfolgt über /etc/hosts.allow bzw., wenn erwünscht, zusätzlich mit einer eigenen Iptabels Chain. Es gibt auch die Möglichkeit sogenannte Whitelists (IP's die nie geblockt werden) bzw. Blacklists (diese IP's werden immer geblockt) zu erstellen. Das Script kann entweder per Cron Job oder mittels hosts.allow und spawn ausgeführt werden. Damit nicht immer das ganze Server-Logfile durchsucht werden muss, wird in der Datei /etc/hosts.allow die Anzahl der bereits überprüften Logzeilen als Offset gespeichert. Ebenfalls wird dort die erste Logzeile zur Identifikation des Logfiles abgelegt. Somit erkennt das Script wenn z.B. aufgrund von Logrotate das Logfile neu angelegt wurde und setzt den Offset wieder auf Null.

BlockHosts-2.3.1.1 benötigt Python ab der Version 2.3

Homepage: http://www.aczoom.com/cms/blockhosts

Installation:

Das RPM-Paket und die für syslog-ng angepassten Konfigurationsfiles blockhosts.cfg und hosts.allow können bezogen werden von http://zid-lux1.uibk.ac.at/mirror/blockhosts/2.3.1/

rpm -ilvh BlockHosts-2.3.1-1.noarch.rpm

Konfiguration:

/etc/blockhosts.cfg

# BlockHost loggt nur noch Fehlermeldungen und ob eine IP-Adresse gesperrt oder freigegeben worden ist
VERBOSE = Log.MESSAGE_LEVEL_NOTICE
# Sperrung der IP ab 4 Strafpunkten
COUNT_THRESHOLD = 4
# IP fuer 4 Stunden sperren
AGE_THRESHOLD = 4
# Localhost und UNI-Netz werden nicht geblockt
WHITELIST = [ "127\.0\.0\.1", "138\.232\..*", ]

Bei Verwendung von syslog-ng anstatt syslog
LOGFILES = [ "/var/log/authpriv.log", ] # --> welches Logfile anhand der Regeln durchsucht werden soll

Anpassen und aktivieren der eigenen Regeln für syslog-ng, da dieser eine etwas andere Log-Syntax (log prefix) hat
ALL_REGEXS = { # NOTE: see ENABLE_RULES definition also, not all rules enabled
"my-sshd-Invalid":
r'^.* \[authpriv\.info\] sshd\[.*\]\: (Invalid|Illegal) user .* from {HOST_IP}',
"my-sshd-Fail":
r'^.* \[authpriv\.info\] sshd\[.*\]\: Failed .*? for (invalid user |illegal user )?.* from {HOST_IP}', ..... ab hier folgen die vordefinierten Regeln

Aktivieren der iptables chain blockhosts
IPBLOCK = "iptables"

Wenn in der Datei /etc/blockhosts.cf die blockhosts iptables chain aktiviert ist, dann fügt das Script, falls noch nicht vorhanden, eine eigene Chain namens blockhosts am Ende der vorhanden Regeln hinzu.
Um die unerwünschten IP's gleich zu blocken und somit weitere Logeinträge zu verhindern, sollte die Blockhost Chain am Anfang der Firewallregeln stehen. Daher ist die Chain als einer der ersten Filterregeln selbst anzulegen.


/etc/sysconfig/iptables

Nach der Zeile mit -i lo -j ACCEPT
##############
# BlockHosts #
##############
:blockhosts - [0:0]
-A INPUT -i eth0 -j blockhosts

Nach Anpassung der iptables müssen diese neu geladen werden.
Bei dieser Variante werden alle im Moment bestehenden Verbindungen beibehalten.

iptables-restore < /etc/sysconfig/iptables

Folgende Einträge müssen gemacht werden in
/etc/hosts.allow

# permanent whitelist addresses - these should always be ALLOWED access
ALL: 127.0.0.1 : allow
ALL: 138.232. : allow
#
# next section is the blockhosts section - it will add/delete entries in
# between the two marker lines (#---- BlockHosts Additions)
#
#---- BlockHosts Additions

#---- BlockHosts Additions
#
# das Script soll bei jedem ssh-Login exekutiert werden; ohne weitere Angaben werden
# die blockhosts Logmeldungen an den syslog bzw. syslog-ng weitergegeben
sshd:ALL: spawn /usr/bin/blockhosts.py --echo "%c-%s"

Alternativ mit Angabe eines Logfiles
sshd:ALL: spawn /usr/bin/blockhosts.py -v --echo "%c-%s" >> /var/log/blockhosts.log 2>&1

Nachdem nun alles richtig konfiguriert ist, muss nun das Script einmal manuell ausgeführt werden.

blockhosts.py -v

Somit wird das ganze Logfile durchsucht (da es noch keinen Offset gibt) und laut den erstellten Regeln alle zutreffenden IP's im Bereich "BlockHosts Additions" von /etc/hosts.allow eingetragen. Somit werden auch die drei Einträge Logfile, Offset und FirstLine gesetzt. Pro geblockter IP gibt es zwei Einträge: einmal der für das Blocken der IP und einmal einen mit Zeitstempel (Zeitpunkt der Sperrung) und Counter beginnend mit #bh:

#---- BlockHosts Additions

ALL: 193.171.19.69 : deny

#bh: ip: 193.171.19.69 : 8 : 2008-05-06 10:44:45 CEST

#bh: logfile: /var/log/authpriv.log
#bh: offset: 1289613
#bh: first line:Jul 23 04:03:02 lsa3 [authpriv.info] sshd[23065]: Postponed publickey for valcmd from 138.232.1.75 port 43506 ssh2

#---- BlockHosts Additions


Diese Zeitstempel werden bei jedem Ausführen des Scripts mit der aktuellen Uhrzeit verglichen. Sobald ein Eintrag um die eingestellte Sperrzeit (in Stunden) älter ist, wird dieser gelöscht. Somit kann es vorkommen, dass eine IP länger als die eingestellte Zeit gesperrt bleibt, wenn nach Ablauf der Sperrzeit keine neue ssh-Verbindung von einem Client aufgebaut wird und daher auch das Script nicht ausgeführt wird. Eventuell kann man zusätzlich noch das Script als Cronjob alle stündlich laufen lassen.

 

Manuelles Entfernen von geblockten Hosts:

In der Datei /etc/hosts.allow die zwei Zeilen (deny Eintrag und Timestamp Eintrag) mit der freizuschaltenden IP entfernen.
Durch das Ausführen von blockhosts.py -v wird der iptables Eintrag entfernt.

 

Nach oben scrollen