Nerviges Brute Force

Nachdem immer wieder irgendwelche Brutforce Angriffe in meinen Logs aufgetaucht sind, habe ich mich entschlossen prinzipiell etwas dagegen zu unternehmen. Die üblichen Mechanismen root Remotelogins zu verweigern und Portnocking auf bestimmten Diensten sind manchmal einfach nicht umsetzbar …

In früheren Ansätzen habe ich auf iptables zurückgegriffen, hier ein Beispiel für SSH:

iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -m recent --update --seconds 60 --hitcount 4 --rttl  --name SSH -j LOG --log-prefix "SSH_brute_force "
iptables -A INPUT -p tcp --dport 22 -m recent --update --seconds 60  --hitcount 4 --rttl --name SSH -j DROP

Mitlerweile existieren gute Mechanismen und Tools die es einem sehr einfach ermöglichen, auf solche Angriffe zu reagieren. Ein solches Tool möchte ich hier vorstellen: fail2ban

Fail2Ban ist ein kleines Programm, das Logfiles verschiedenster Programme überwacht und basierend auf Einträgen in den Logfiles Ereignisse auslöst. Es kann sowohl im Hintergrund (als Dämon) als auch im Vordergrund laufen.

Allgemeines

Fail2ban ist vergleichbar mit DenyHosts, aber im Gegensatz zu DenyHosts, kann fail2ban so konfiguriert werden, dass jeder Dienst der Loginversuche in eine Log-Datei schreibt überwacht und ausgewertet werden kann und anstelle der Verwendung von /etc/hosts.deny um IP-Adressen zu blockieren nutzt fail2ban iptables. Das macht das Ganze etwas flexibler im Einsatz.

Installation

Unter Debian mittels:

apt-get install fail2ban

Nach der Installation finden wir unter /etc/fail2ban das Konfigurationsverzeichnis.

Konfiguration

Das Standardverhalten von fail2ban wird in der Datei /etc/fail2ban/jail.conf festgelegt. Ein Blick zeigt, dass die verwendete Syntax ziemlich einfach zu handhaben ist. Der [DEFAULT] Abschnitt, gilt auch für alle anderen Abschnitte, es sei denn, dass die dort festgelegten Optionen in anderen Abschnitten überschrieben werden.

Einige der Konfigurationsoptionen:

  • ignoreip: Dies ist eine durch Leerzeichen getrennte Liste von IP-Adressen, die nicht blockiert werden.
  • bantime: Zeit in Sekunden, die ein Host blockiert wird (600 Sekunden = 10 Minuten).
  • maxretry: max. Anzahl der fehlgeschlagenen Loginversuche, bevor ein Host blockiert wird.
  • filter: Ausdruck durch den fail2ban Logeintrag und eventuelle Aktion zuordnet.
  • logpath: Das von fail2ban zu verwendende Logfile.

Um fail2ban nun an unsere Bedürfnisse anzupassen, legen wir mittels touch eine neue Datei namens jail.local an. Bitte die datei jail.conf nicht ändern!

Nachstehend versuche ich soviel als mögliche Beispielkonfigurationen darzustellen, also bitte nicht wahllos übernehmen, sondern nur die Abschnitte die man benötigt, bzw. dessen Dienst auch installiert ist.

vi /etc/fail2ban/jail.local

[DEFAULT]

# "ignoreip" IP-Adresse oder CIDR Notation oder DNS host
ignoreip = 127.0.0.1 192.168.1.1
bantime  = 600
maxretry = 3

backend = polling
destemail = root@localhost
action = iptables[name=%(__name__)s, port=%(port)s]

[ssh]

enabled = true
port    = ssh
filter  = sshd
logpath  = /var/log/auth.log
maxretry = 5

[apache]

enabled = true
port    = http
filter  = apache-auth
logpath = /var/log/apache*/*error.log
maxretry = 5

[apache-noscript]

enabled = true
port    = http
filter  = apache-noscript
logpath = /var/log/apache*/*error.log
maxretry = 5

[vsftpd]

enabled  = true
port     = ftp
filter   = vsftpd
logpath  = /var/log/auth.log
maxretry = 5

[proftpd]

enabled  = true
port     = ftp
filter   = proftpd
logpath  = /var/log/auth.log
failregex = proftpd: \(pam_unix\) authentication failure; .* rhost=<HOST>
maxretry = 5

[wuftpd]

enabled  = true
port     = ftp
filter   = wuftpd
logpath  = /var/log/auth.log
maxretry = 5

[postfix]

enabled  = true
port     = smtp
filter   = postfix
logpath  = /var/log/mail.log
maxretry = 5

[sieve]

enabled  = true
port     = sieve
filter   = sieve
logpath  = /var/log/mail.log
maxretry = 3

[cyrus-imap]

enabled  = true
port     = imap2,imap3,imaps,pop3,pop3s
filter   = cyrus-imap
logpath  = /var/log/mail.log
maxretry = 5

[courierpop3]

enabled  = true
port     = pop3
filter   = courierlogin
failregex = courierpop3login: LOGIN FAILED.*ip=\[.*:<HOST>\]
logpath  = /var/log/mail.log
maxretry = 5

[courierimap]

enabled  = true
port     = imap2
filter   = courierlogin
failregex = imapd: LOGIN FAILED.*ip=\[.*:<HOST>\]
logpath  = /var/log/mail.log
maxretry = 5

[sasl]

enabled  = true
port     = smtp
filter   = sasl
failregex = warning: [-._\w]+\[<HOST>\]: SASL (?:LOGIN|PLAIN|(?:CRAM|DIGEST)-MD5) authentication failed
logpath  = /var/log/mail.log
maxretry = 5

192.168.1.1 dient als ein Beispiel für eine statische IP-Adresse, die nicht blockiert werden soll. Ich habe die max. Anzahl der fehlgeschlagenen Loginversuche für alle Dienste auf 5 gesetzt. Darüber hinaus werden IP Adressen 10 Minuten gesperrt.

Nachdem wir unsere Konfiguration angepasst haben muss fail2ban neugestartet werden.

/etc/init.d/fail2ban restart

Das war es für das erste. Fail2ban schreibt sein Log in /var/log/fail2ban.log, dort kann die funktionsweise udn ob IP’s geblockt werden kontrolliert werden:

2008-06-17 19:49:09,466 fail2ban.actions: WARNING [apache] Ban 1.2.3.4
2008-06-17 20:08:33,213 fail2ban.actions: WARNING [sasl] Ban 1.2.3.4

Genauso kann man die iptables Regeln überprüfen:

iptables -vnL

Links