Fail2ban beschermt je Linux-VPS door IP's te bannen waarvandaan pogingen worden gedaan om je VPS binnen te dringen. Fail2ban scant de logbestanden van je VPS om te bepalen welke IP's gebannen worden (e.g. /var/log/apache/error_log). Er wordt gescand op te veel foutieve password-pogingen, zoeken naar exploits, etcetera.
Daarnaast is het ook mogelijk om automatisch een rapport naar jezelf en de eigenaar van het aanvallende IP te laten sturen. Fail2ban komt met filters voor verscheidene services (Apache, Courier, SSH, etcetera).
Fail2ban installeren
sudo dnf -y update
sudo dnf -y install epel-release
sudo dnf -y install fail2ban
sudo systemctl enable fail2ban
sudo systemctl start fail2ban
sudo yum -y update
sudo yum -y install epel-release
sudo yum -y install fail2ban
sudo systemctl enable fail2ban
sudo systemctl start fail2ban
sudo apt -y update
sudo apt -y install fail2ban
sudo systemctl enable fail2ban
sudo systemctl start fail2ban
sudo apt -y update
sudo apt -y install fail2ban
sudo systemctl enable fail2ban
sudo systemctl start fail2ban
Fail2ban configureren
Standaard gebruikt Fail2ban /etc/fail2ban/jail.conf om vast te stellen welke acties het wanneer uitvoert. Eventuele aanpassingen die je in jail.conf maakt worden echter overschreven bij updates van Fail2ban. Dit is niet het geval bij het bestand /etc/fail2ban/jail.local. Daarnaast krijgt de inhoud van jail.local voorrang op die van jail.conf. Je gebruikt dan ook het bestand jail.local om een configuratie voor Fail2ban op te zetten.
Gebruik alleen de delen uit de configuratie hieronder die van toepassing zijn op jouw VPS! Gebruik je geen Exim, voeg dat deel dan niet toe. Hetzelfde geld voor het Postfix-deel. Het SASL-deel gebruik je alleen als je gebruikmaakt van onze mailservice.
Stap 1
Maak eerst het bestand jail.local aan:
sudo nano /etc/fail2ban/jail.local
Stap 2
Voeg onderstaande code toe en pas de waardes aan naar eigen behoefte. Een toelichting van de opties vind je onder de code (tip: gebruik Putty en copy-paste de inhoud hieronder). Let vooral op dat je de banaction aanpast waar nodig (het voorbeeld beschrijft CentOS 7.4+, CentOS 8 en AlmaLinux).
Pas onderstaande gegevens (sender, destemail en ignoreip) aan naar je eigen gegevens en gebruik enkel de jails van software die je daadwerkelijk op je VPS gebruikt (e.g. Exim of Postfix, maar niet beide. Je kunt controleren welke je gebruikt op je VPS met het commando systemctl status exim / postfix).
Gebruik je onze VPS mailservice? Voeg dan het stukje onder '[sasl]' toe en zie stap 5 verder hieronder.
[DEFAULT]
# Ban for X amount of time
bantime = 604800
findtime = 3600
sender = fail2ban@voorbeeld.nl
destemail = admin@voorbeeld.nl
action = %(action_mwl)s
banaction = iptables-multiport
maxretry = 3
ignoreip = jeipadres
[sshd]
enabled = true
port = ssh
# vervang hierboven ssh door je ingestelde SSH poort nummer.
[exim]
enabled = true
filter = exim
logpath = /var/log/exim/mainlog
# gebruik je cPanel? Vervang dan bovenstaande regel door logpath = /var/log/exim_mainlog
# voor debian, gebruik je /var/log/exim4/mainlog
[postfix]
enabled = true
port = smtp, ssmtp
filter = postfix
failregex = \[<HOST>]: 535 Incorrect authentication data
logpath = /var/log/maillog
[dovecot]
enabled = true
port = pop3,pop3s,imap,imaps
filter = dovecot
logpath = /var/log/maillog
[sasl]
enabled = true
port = smtp,ssmtp,imap2,imap3,imaps,pop3,pop3s
filter = sasl
logpath = /var/log/maillog
Toelichting Fail2Ban jail.local configuratie
Fail2ban gebruikt zogeheten 'Jails'. Een jail kun je zien als de configuratie voor een specifiek stuk software op je VPS waarin je zaken definieert zoals welke service en poort er gebruikt wordt en welke log file gescand wordt door Fail2ban. Hierboven is bijvoorbeeld het stukje onder [Exim] een jail.
[Default]
- bantime: Een bantime van 60 is 1 minuut, 3600 1 uur, 86400 1 dag en 604800 1 week, etcetera.
- findtime: Hiermee defnieer je hoever in het verleden Fail2ban je logbestanden controleert. Standaard staat dit op 600 (10 minuten). Als een IP één aanval uitvoert iedere 10 minuten zou Fail2ban dit niet aanmerken omdat pas bij vijf aanvallen (zie maxretry) binnen 10 minuten actie ondernomen wordt.
- sender (optioneel): Het e-mailadres dat notificaties van Fail2ban-acties verstuurt naar de aanvaller. Het configureren van een uitgaande mailserver en een mailadres op je VPS dat je hiervoor kunt gebruiken, valt buiten de scope van deze handleiding.
- destemail (optioneel): Je eigen e-mailadres waar notificaties van Fail2ban-acties naar worden gestuurt. Het configureren van een uitgaande mail server en een mailadres op je VPS dat je hiervoor kunt gebruiken valt buiten de scope van deze handleiding.
- action (optioneel): De defaultoptie %(action_)s bant het IP van de aanvaller. Daarnaast stuurt %(action_mwl)s een e-mailnotificatie inclusief WHOIS-data en logfile-data.
-
banaction: Met banaction geef je aan welke firewall je gebruikt. Ufw is bijvoorbeeld de standaard voor Ubuntu en Debian. Je kunt in jail.local firewalld of iptables als volgt specificeren:
-
firewalld: banaction = firewallcmd-ipset
Let op: firewallcmd-ipset werkt niet meer vanaf CentOS 7.3 en nieuwer. Gebruik bij CentOS 7.3+ en AlmaLinux banaction = iptables-multiport - iptables: banaction = iptables-multiport
- ufw: banaction = ufw
-
firewalld: banaction = firewallcmd-ipset
- maxretry: Hier kun je het aantal maximale pogingen aangeven dat iemand mag doen (bijvoorbeeld foutieve aanmeldpogingen) voor de actie onder 'action' wordt uitgevoerd. Wij raden aan dit vrij laag te zetten, bijvoorbeeld op 3 en over minimaal een periode van 1 - 2 uur (onder findtime) in te stellen. Er zijn namelijk veel bots die niet meer dan +- 5 keer per +- 1.5 uur aanvallen.
- sshd enabled: Hiermee worden ssh-verbindingspogingen gemonitord en IP's gebannen wanneer zij meer pogingen doen dan onder maxretry is gedefinieerd.
- ignoreip: Geef hier je eigen IP op. Als je je wachtwoord vergeet, dan wordt je IP na het aantal pogingen onder 'maxretry' niet direct gebannen. Gebruik je onze TCP-monitoring? Voeg dan de IP's 87.253.155.102 en 80.69.67.10 ook toe.
[SSHD] (SSH server)
- enabled: Schakelt de beveiliging in voor je SSH(D)-verbinding
- port: Hier geef je op welke poort beveiligd wordt. Met de waarde 'ssh' vertel je Fail2ban de ingestelde SSH-poort te gebruiken.
[exim] (uitgaande mail)
- enabled: Schakelt de beveiliging in voor je Exim-verbinding
- filter: Geeft aan welk filter gebruikt wordt. Voor Exim is geen filter aanwezig en maak je apart aan in stap 3 en 4.
- failregex: Dit zijn foutmeldingen waar de log gedefinieerd onder 'logpath' op doorzocht wordt.
- logpath: Het logbestand dat Fail2ban doorzoekt. Let op: dit kan per systeem verschillen. cPanel en DirectAdmin gebruiken beide Exim en hanteren bijvoorbeeld verschillende locaties voor de mail log. Controleer deze dan ook van tevoren en pas die aan naar de daadwerkelijke locatie.
[postfix] (uitgaande mail)
- enabled: Schakelt de beveiliging in voor je Postfix-verbinding
- port: Hier geef je op welke poort beveiligd wordt. Met de waarde 'smtp, ssmtp' vertel je Fail2ban de ingestelde SMTP-poort te gebruiken.
- filter: Geeft aan welk filter gebruikt wordt. Fail2ban komt met een aantal filters die in /etc/fail2ban/filter.d/ zijn opgenomen, waaronder het postfix fillter die hier aangeroepen wordt.
- failregex: Dit zijn foutmeldingen waar de log gedefinieerd onder 'logpath' op doorzocht wordt.
- logpath: Het logbestand dat Fail2ban doorzoekt.Let op: dit kan per systeem verschillen. Controleer deze dan ook van tevoren en pas die aan naar de daadwerkelijke locatie.
[dovecot] (inkomende mail)
- enabled: Schakelt de beveiliging in voor je Dovecot-verbinding
- port: Hier geef je op welke poort beveiligd wordt. Met de waarde 'pop3, pop3s, imap, imaps' vertel je Fail2ban de ingestelde pop3- en imap-poorten te beveiligen.
- filter: Geeft aan welk filter gebruikt wordt. Fail2ban komt met een aantal filters die in /etc/fail2ban/filter.d/ zijn opgenomen. In dit geval wordt het meegeleverde dovecot filter gebruikt.
- logpath: Het logbestand dat Fail2ban doorzoekt.
[SASL] (bij gebruik van relay, zoals onze VPS-mailservice)
- enabled: Schakelt de beveiliging in voor SASL (authenticatie en data beveiligingssysstem in internet protocollen)..
- port: Hier geef je op welke poort beveiligd wordt. Met de waarde 'smtp,ssmtp,imap2,imap3,imaps,pop3,pop3s' vertel je Fail2ban de bijbehorende poorten te scannen op de meldingen in het logpath, zoals gefefinieerd in het (sasl) filter.
- filter: Geeft aan welk filter gebruikt wordt, in dit geval het sasl-filter. Het sasl-filter is niet standaard aanwezig en maak je aan in stap 5 en 6.
- logpath: Het logbestand dat Fail2ban doorzoekt.
Stap 3
Gebruik je Exim (e.g. bij onze DirectAdmin en cPanel images), dan breid je de bestaande Exim configuratie eerst uit. Zo niet, ga dan door naar stap 7.
sudo nano /etc/fail2ban/filter.d/exim.conf
Stap 4
Voeg onderstaande inhoud aan het failregex-deel toe en sla de wijzigingen op door achtereenvolgens op ctrl + x > y > enter te drukken:
\[<HOST>\]: 535 Incorrect authentication data
Het geheel zou er dan onder [Definition] ongeveer als volgt uit moeten zien:
[Definition]
failregex = ^%(pid)s %(host_info)ssender verify fail for <\S+>: (?:Unknown user|Unrouteable address|all relevant MX records point to non-existent hosts)\s*$
^%(pid)s \w+ authenticator failed for (?:[^\[\( ]* )?(?:\(\S*\) )?\[\](?::\d+)?(?: I=\[\S+\](:\d+)?)?: 535 Incorrect authentication data( \(set_id=.*\)|: \d+ Time\(s\))?\s*$
^%(pid)s %(host_info)srejected RCPT [^@]+@\S+: (?:relay not permitted|Sender verify failed|Unknown user|Unrouteable address)\s*$
^%(pid)s SMTP protocol synchronization error \([^)]*\): rejected (?:connection from|"\S+") %(host_info)s(?:next )?input=".*"\s*$
^%(pid)s SMTP call from \S+ %(host_info)sdropped: too many nonmail commands \(last was "\S+"\)\s*$
^%(pid)s SMTP protocol error in "AUTH \S*(?: \S*)?" %(host_info)sAUTH command used when not advertised\s*$
^%(pid)s no MAIL in SMTP connection from (?:[^\[\( ]* )?(?:\(\S*\) )?%(host_info)sD=\d\S+s(?: C=\S*)?\s*$
^%(pid)s (?:[\w\-]+ )?SMTP connection from (?:[^\[\( ]* )?(?:\(\S*\) )?%(host_info)sclosed by DROP in ACL\s*$
\[<HOST>\]: 535 Incorrect authentication data
ignoreregex =
Stap 5
Gebruik je de VPS mailservice, maak dan nog een configuratiebestand aan voor de SASL jail. Zo niet, ga dan door naar stap 7.
sudo nano /etc/fail2ban/filter.d/sasl.conf
Stap 6
Voeg onderstaande inhoud aan het bestand toe en sla de wijzigingen op door achtereenvolgens op ctrl + x > y > entete drukken:
# Fail2Ban configuration file
#
# $Revision$
[Definition]
# Option: failregex
# Notes.: regex to match the password failures messages in the logfile. The
# host must be matched by a group named "host". The tag "" can
# be used for standard IP/hostname matching and is only an alias for
# (?:::f{4,6}:)?(?P[\w\-.^_]+)
# Values: TEXT
#
failregex = (?i): warning: [-._\w]+\[<HOST>\]: SASL (?:LOGIN|PLAIN|(?:CRAM|DIGEST)-MD5) authentication failed(: [A-Za-z0-9+/ ]*)?$
# Option: ignoreregex
# Notes.: regex to ignore. If this regex matches, the line is ignored.
# Values: TEXT
#
ignoreregex =
Herstart Fail2ban om de wijzigingen te verwerken:
sudo systemctl restart fail2ban
Geavanceerd / optioneel: oplopende Fail2ban-bantijd
Om te voorkomen dat Fail2ban erg fanatiek optreed en permanent een legitieme gebruiker blokkeert die even niet op zijn wachtwoord komt, is het mogelijk om als alternatief in te stellen om eerst een uur te blokkeren, vervolgens een dag, een week, etcetera.
Stap 1
Maak eerst het bestand /etc/fail2ban/filter.d/f2b-repeat.conf aan:
sudo nano /etc/fail2ban/filter.d/f2b-repeat.conf
Stap 2
Voeg de volgende inhoud toe:
[INCLUDES]
before = common.conf
[Definition]
failregex = \]\s+ban\s+<HOST>
ignoreregex = \[f2b-repeat.*\]\s+ban\s+<HOST>
Stap 3
Voeg in je jail.local bestand tussen de '[Default]' en '[SSHD]' passage de '[f2b-repeat]' passages uit het voorbeeld hieronder toe. Let op dat je in jouw configuratie in de [DEFAULT] passage alleen de bantime en findtime aanpast (optioneel ook de maxretry) maar verder niets:
[DEFAULT]
# Ban for X amount of time
bantime = 3600
findtime = 86400
sender = fail2ban@voorbeeld.nl
destemail = admin@voorbeeld.nl
action = %(action_mwl)s
banaction = iptables-multiport
maxretry = 3
ignoreip = jeipadres
[f2b-repeat2]
enabled = true
filter = f2b-repeat
bantime = 86400
findtime = 604800
logpath = /var/log/fail2ban.log
maxretry = 3
[f2b-repeat3]
enabled = true
filter = f2b-repeat
bantime = 604800
findtime = 2592000
logpath = /var/log/fail2ban.log
maxretry = 3
[f2b-repeat4]
enabled = true
filter = f2b-repeat
bantime = 2592000
findtime = 15552000
logpath = /var/log/fail2ban.log
maxretry = 3
Je verhoogt de findtime zodat Fail2ban verder terugkijkt bij nieuwe pogingen. Zo zorg je ervoor dat Fail2ban herhalende aanvangers herkent, maar ook steeds strenger controleert.
Stap 4
Geef je zoals hierboven de directory van het logbestand van Fail2ban op, dan zal Fail2ban niet starten. Dit kun je oplossen door eerst het Fail2ban.log-bestand aan te maken:
sudo touch /var/log/fail2ban.log
Stap 5
Vervolgens kun je Fail2ban (her)starten:
sudo systemctl restart fail2ban
Geavanceerd / optioneel: extra filters / jails
Fail2ban komt met een aantal filters/jails die je terugvindt in /etc/fail2ban/filter.d/ :
Stap 1
Bekijk de standaard filters/jails met:
ls /etc/fail2ban/filter.d/
Je ziet een overzicht zoals hieronder:
Kies de naam van het filter dat je wilt gebruiken, bijvoorbeeld apache-auth.conf
Stap 2
Open je jail opnieuw:
sudo nano /etc/fail2ban/jail.local
Stap 3
Je voegt nu het filter jail toe aan met de volgende syntax:
[jailname]
enabled = true
filter = jailname
logpath = /var/log/jelogbestand
- [jailname]: Vervang deze naam door een naam naar keuze zodat je deze eenvoudig herkent als je de status van Fail2ban controleert.
- enabled: Moet altijd true zijn, anders staat je jail niet aan.
- filter: Geef hier de naam op van de jail die je gekozen hebt. Heb je bijvoorbeeld bij Stap 1 apache-auth.conf uitgekozen, vul hier dan apache-auth in.
- logpath: Hier geef je op welk bestand Fail2ban scant om te zoeken naar aanvallen op je VPS.
Aanvullende tips en commando's:
De status van Fail2ban controleer je met het commando:
sudo fail2ban-client status
De logs van Fail2ban bekijk je met een van de volgende commando's:
sudo nano /var/log/fail2ban.log
sudo vi /var/log/fail2ban.log
sudo cat /var/log/fail2ban.log
Wil je controleren of Fail2ban nog aan staat, gebruik dan:
sudo systemctl status fail2ban
Je herstart Fail2ban na een wijziging met:
sudo systemctl restart fail2ban
Handmatig bannen / unbannen
Handmatig bannen
Als iemand heel geduldig is en één keer per uur probeert in te loggen, kun je er ook voor kiezen zijn/haar IP handmatig te bannen. Kies hiervoor eerst een jail, die je terugziet in de output van het commando:
sudo fail2ban-client status
Gebruik daarna het volgende commando om een IP te bannen, waarbij je 'JAIL' vervangt door de gekozen jail en xxx.xxx.xxx.xxx door het aanvallende IP-adres:
sudo fail2ban-client -vvv set JAIL banip xxx.xxx.xxx.xxx
Handmatig unbannen
Het kan gebeuren dat iemand onbedoelt geband wordt, bijvoorbeeld na meerdere keren een verkeerd wachtwoord te hebben opgegeven voor het verbinden via SSH (gebruik de VPS-console als je zelf geband bent). Je kunt in dat geval een IP-adres weer unbannen met het commando:
sudo fail2ban-client set JAIL unbanip xxx.xxx.xxx.xxx
Vervang 'JAIL' door de jail waar het IP-adres voor geband is en xxx.xxx.xxx.xxx door het aanvallende IP-adres.
Weet je niet zeker in welke jail het IP-adres is opgenomen? Bekijk dan je fail2ban log, bijvoorbeeld met het commando:
sudo nano /var/log/fail2ban.log
Zoek het specifieke IP-adres in het geopende logbestand door achtereenvolgens ctrl + w (whereis in nano) in te drukken en daarna het IP-adres op te geven waar je op wil zoeken.
De installatie en configuratie van Fail2ban op je VPS is hiermee voltooid. Je VPS is nu beveiligd tegen bruteforce-aanvallen!
Mocht je aan de hand van dit artikel nog vragen hebben, aarzel dan niet om onze supportafdeling te benaderen. Je kunt hen bereiken via de knop 'Neem contact op' onderaan deze pagina.