Fail2ban

Fail2ban is een Linux tool om Brute Force aanvallen en andere ongewenste loginpogingen te blokkeren. De software is in hoge mate configureerbaar en heeft als voordeel boven sommige vergelijkbare tools dat het zich niet beperkt tot alleen SSH: het kan met SASL, Postfix, HTTP en meer protocollen werken.

Installatie

Wie zoals ik Fail2ban op Centos wil installeren, zal eerst de EPEL repository moeten downloaden, omdat Fail2ban niet beschikbaar is vanaf Centos zelf:

rpm -Uvh http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-7.noarch.rpm

Vervolgens installeren met Yum:

yum install fail2ban

Configuratie

De belangrijkste configuratie van Fail2ban wordt gedaan in jail.local. Dit bestand wordt verkregen door jail.conf te kopieren:

cp /etc/fail2ban/fail2ban.conf /etc/fail2ban/jail.local

Dit bestand is verdeeld in versnchillende secties, te beginnen met de default instellingen:

[DEFAULT]

# "ignoreip" can be an IP address, a CIDR mask or a DNS host. Fail2ban will not
# ban a host which matches an address in this list. Several addresses can be
# defined using space separator.
ignoreip = 127.0.0.1
# "bantime" is the number of seconds that a host is banned.
bantime  = 600
# A host is banned if it has generated "maxretry" during the last "findtime"
# seconds.
findtime  = 600
# "maxretry" is the number of failures before a host get banned.
maxretry = 3

Zoals hierboven te zien zijn de default instellingen behoorlijk zelfverklarend en behoeven dan ook geen uitleg, behalve misschien dat maxretry letterlijk is wat het zegt (en niet helemaal wat de uitleg zegt): toegestaan aantal inlogpogingen -1 oftewel, aantal toegestane pogingen na de eerste mislukte inlogpoging. 

De overige secties (jails noemt Fail2ban ze) in jail.local behandelen de verschillende requesttypen en de verschillende varianten daarvan. SSH met gebruikmaking van iptables of TCPwrappers of opfw (de standaard FreeBSD firewall). Om de eerste eens te bekijken:

# This jail corresponds to the standard configuration in Fail2ban 0.6.
# The mail-whois action send a notification e-mail with a whois request
# in the body.

[ssh-iptables]
enabled  = true
filter   = sshd
action   = iptables[name=SSH, port=ssh, protocol=tcp]
           sendmail-whois[name=SSH, dest=root, sender=fail2ban@example.com]
logpath  = /var/log/secure
maxretry = 5

De betekenis van de verschillende configuratie-opties:

sshp-iptablesNaam van deze sectie
enabledDeze configuratie-sectie is actief of niet
filterDit filter (in de map ./filter.d) wordt toegepast
actionDeze instructies worden uitgevoerd wanneer de remote host gebanned moet worden
logpathHet logbestand dat door het filter wordt gescand
maxretryZie default sectie hierboven

Voor zowel de filters en de actions als voor de gehele jails geldt dat ze in theorie eenvoudig vervangen of aangevuld kunnen worden door zelfgeschreven versies. 

Permanente bans

Als ik één gemis zou moeten aanwijzen in het gebruik van Fail2ban dan is het de onmogelijkheid om out-of-the-box bans permanent te maken. Zogauw de server ge-reboot wordt (of wanneer op een andere manier de iptables rules ge-reload worden) dan zijn alle bans verdwenen en zijn opnieuw maxtretry+1 inlogpogingen nodig om een host te bannen. Geen onoverkomelijkheid, maar wel een minpuntje. Maar zoals gezegd is Fail2ban in hoge mate configureerbaar en ook voor het gemis aan permanente bans is de oplossing nabij.

Wanneer je bijvoorbeeld voor de ssh-iptables jail de bans permanent wilt maken, ga je alsvolgt te werk:

In /etc/fail2ban/jail.local zien we dat de action setting van de ssh-iptables jail is iptables
In /etc/fail2ban/action.d openen we het conf-bestand met dezelfde naam, dus iptables.conf.

In dit bestand maken we een tweetal aanpassingen:

...
actionstart = iptables -N fail2ban-
              iptables -A fail2ban- -j RETURN
              iptables -I INPUT -p  -m multiport --dports  -j fail2ban-
              # Persistent banning of IPs
              cat /etc/fail2ban/ip.blacklist | while read IP; do iptables -I fail2ban- 1 -s $IP -j DROP; done
...
actionban =   iptables -I fail2ban- 1 -s  -j DROP
              # Persistent banning of IPs
              echo '' >> /etc/fail2ban/ip.blacklist
...

Onder de actionstart- en onder de actionban-sectie voegen we een regel toe (zie onder # Persistent banning of IPs). De regel onder actionban wordt uitgevoerd wanneer een host word gebanned en print het IP-adres van de host naar het bestand ip.blacklist. De regel onder actionstart wordt uitgevoerd wanneer Fail2ban wordt gestart en leest de IP-adressen uit ip.blacklist in en plaatst ze als rules in iptables.
[Voorbeeldcode is een bewerking van die op looke.ch]