Aus dem Internet erreichbare Dienste absichern

Egal welcher Dienst direkt aus dem Internet erreichbar ist, früher oder später wird er von Bots, Schadprogrammen, Portscannern usw. identifiziert und ausgespäht. Alle Dienste sollten ständig auf Sicherheitslücken überwacht und mit bereitgestellten Updates versorgt werden. Die manuelle Überwachung aller vorhandenen Logfiles ist sehr mühselig und fehleranfällig. Ich empfehle daher, sich mit logwatch (Perl-Script) und fail2ban (Python-Programm) zu beschäftigen. Sie sind in der Lage, bei entsprechender Konfiguration, alle wesentlichen Dienste auf fehlerhafte Anmeldeversuche, brute-force Attacken auf Passwörter und andere Hackversuche zu untersuchen und bei Wiederholungen zu unterbinden.

Logwatch ist für alle Server, die 24/7 laufen und nicht ständig über ein zentrales Überwachungstool, wie z.B. Nagios u.ä., überwacht werden, eine einfache Alternative zur manuellen Log-Auswertung. In der Default-Konfiguration werden täglich alle Logfiles, die der Server besitzt, auf wesentliche Informationen geprüft. Dies sind z.B. Anmeldungen per ssh, Fehlermeldungen von Laufwerken, Kernel-Meldungen usw. Die Zusammenfassung kann auf der Konsole ausgegeben werden. Empfohlen ist die Ausgabe als E-Mail, der Absendername und die Empfängeradresse lassen sich in der Konfiguration angeben, wie auch der Detailgrad der Meldungen.

Die Durchsicht der empfangenen E-Mails ist mit vergleichsweise kleinem Zeitaufwand verbunden und geben Aufschluss über den Zustand der Soft- und Hardware. Schleichende Hardwaredefekte und mögliche erfolgreiche Einbruchsversuche können so erkannt werden bevor der Server vollständig ausfällt oder Hacker größeren Schaden anrichten.

Fail2ban ist das Gegenmittel, um nicht erwünschte Verbindungen aus dem Internet zu den Diensten zu unterbinden. Fail2ban ist ein sehr mächtiger und wirkungsvoller Gegner für unerwünschte Bots, Script-Kiddies, Portscanner, Hacker usw. Seine Vielseitigkeit erfordert aber eine angepasste Konfiguration, ohne weitere Einstellungen ist nach der Installation nur die Überwachung des ssh-Servers aktiv.

Zusätzlich zur vorhandenen Datei in /etc/fail2ban/jail.d/defaults-debian.conf legen wir im gleichen Verzeichnis die Datei apache.conf (die Endung .conf ist wichtig für alle aktiven Einstellungsdateien hier) an. Sie enthält jeweils die Namen der vorbereiteten Jails (in eckigen Klammern, wie [apache-badbots] usw.) mit den (geänderten statt default) Einstellungen darunter, wie „enabled = true“. Wie zusätzliche neue Filter und Jails konfiguriert werden, ist in vielen Beiträgen im Netz schon behandelt worden. Etwas Einarbeitung in die Materie ist dabei erforderlich. Als ein Beispiel, welches bei mir zum Einsatz kommt, habe ich Jail und Filter für das Auffinden und Blockieren von Seiten mit 400-er Rückmeldung (Page not found usw.) eingefügt:

Im Verzeichnis /etc/fail2ban/jail.d

apache-404.conf
[apache-404]                                                                                                                                                                                                                             
 
enabled = true
port = http,https
filter = apache-404
# logpath = %(apache_error_log)s
logpath = %(apache_access_log)s
bantime = 5h
# findtime = 600
maxretry = 3

Im Verzeichnis /etc/fail2ban/filter.d

apache-404.conf
# Fail2Ban apache-404 filter
#
[INCLUDES]
# Read common prefixes. If any customizations available -- read them from
# apache-common.local
before = apache-common.conf
 
[Definition]
 
# datepattern = %%d/%%b/%%Y:%%H:%%M:%%S %%z
datepattern = %%d/%%b/%%Y:%%H:%%M:%%S
 
 
 
badagents = 360Spider|ZmEu|Auto Spider 1.0|zgrab/[0-9]*\.[0-9a-zA-Z]*|Wget\(.*\)|MauiBot.*|AspiegelBot.*|SemrushBot.*|PHP/.*
 
 
failregex = ^<HOST> - .* "(GET|POST|HEAD).*HTTP.*" (404|400|403|408) .*$
            ^<HOST> - .* "\\x.*" (404|400|403|408) .*$
            ^<HOST> - .* "-" (404|400|403|408) .*$
 
ignoreregex =.*(robots.txt|favicon.ico|jpg|png)

Alle nicht aufgeführten Einstellungen werden von den default Einstellungen von fail2ban übernommen.

Auch hier gibt es bereits Filter und Jails, die zu den Diensten passen (dovecot, postfix, sieve, postfix-sasl). Sie brauchen nur in einer eigenen Datei in /etc/fail2ban/jail.d aktiv geschaltet werden.

Im Verzeichnis /etc/fail2ban/jail.d

eigen.config
[postfix]
 
enabled = true
 
[dovecot]
 
enabled = true
 
[sieve]
 
enabled = true
 
[postfix-sasl]
 
enabled = true

Die täglichen E-Mails mit den Logfile Auswertungen ergeben mit der Zeit, dass es immer wieder bestimmte IP-Adressen und -Bereiche sind, die im Raster der Verbindungen auffallen. Damit die Logfiles nicht zu groß werden und die Server nicht unnötig belastet werden, ist Feinabstimmung gefragt. Zunächst schaut man sich die Häufigkeit und die Bannzeiten an. Manchmal genügt es, wenn für bestimmte Jails die Zeit für die Blockade einfach erhöht wird (bantime). Nach längerer Zeit habe ich mich entschlossen, da noch rabiater vorzugehen und Adressen und Bereiche dauerhaft zu sperren. Für IPv4-Adressen gibt es im Netz bereits Anleitungen für Blacklists, sowohl für einzelne IPs als auch für Blöcke (/24,/16,/8). Leider sind die Jails und Filter dafür nur für IPv4-Adressen nutzbar, es fehlt die Anbindung an ip6tables. Die aktuellen Versionen von fail2ban können jedoch auch mit IPv6-Adressen umgehen und sie auch blockieren, aber erst einmal nur für einzelne Adressen.

Wie sinnvoll ist die Sperrung einer einzelnen IPv6-Adresse, wenn normalerweise jeder mindestens ein /64 Netz zugewiesen bekommt? Wenn eine Adresse gesperrt ist, nimmt er eben eine andere aus seinem zugewiesenen Bereich. Bots, Spammer und andere 'böse Buben' sollte man großflächig aussperren können!

Fail2ban hat dafür sogar eine Lösung an Bord, die nicht auf den ersten Blick ersichtlich ist: Der Jail heißt [recidive] und ist standardmäßig deaktiviert. Seine Einstellungen sind auch noch nicht für die dauerhafte Sperrung geeignet, bantime und findtime sind wesentlich zu verlängern (bantime = 365d, findtime = 1w), damit eine quasi dauerhafte Sperrung erfolgt, wenn diese Regel greift. Nun wird dafür das fail2ban.log ausgewertet, was noch lange nicht zur dauerhaften Sperrung von Adressen führt. Es gibt jedoch die manuelle Möglichkeit, auf der Kommandozeile mit fail2ban-client set recidive banip <IP-Adresse/Range> einen Eintrag zu erzeugen, der für 365 Tage eine Sperrung vornimmt. Gut an diesem Befehl ist, dass er sowohl mit IPv4-Adressen und -Bereichen funktioniert als auch mit IPv6-Adressen und -Bereichen. Wenn also unliebsame Besucher der Server sich mit IPv6 austoben möchten, so kann ich einfach ganze Bereiche sperren.

(rw)