Fail2ban je nástroj pro ochranu serveru proti útokům na přihlašování (například na SSH) nebo na webový server (pokud je konfigurován k tomu). Jeho hlavním účelem je detekovat opakované neúspěšné pokusy o přihlášení nebo jiné nebezpečné akce, a následně brání útočníkům pomocí dynamického blokování jejich IP adres.

Blokuje útočníka manipulací s pravidly firewallu. Obvykle v Linuxu je k tomu využíván nástroj iptables. Když fail2ban identifikuje podezřelou aktivitu na základě nastavených pravidel a filtrů, mění firewall pravidla, aby blokovalo spojení z dané IP adresy.

Instalace

Začneme instalací balíčku

sudo apt install fail2ban

Dále zkopírujeme soubor pro default nastavení

sudo cp /etc/fail2ban/jail.{conf,local}

Je dobré odkomentovat whitelist vybraných adres

ignoreip = 127.0.0.1/8 ::1

Určete, jak dlouho má být IP adresa zablokována (m| h| d).

bantime = 30d

Dále se nastavuje, jak dlouho se má počítat doba od dalšího pokusu

findtime = 1d

A nakonec maximální počet neúspěšných pokusů povolených během doby findtime

maxretry = 3

Dále v souboru najdeme sekci *JAILS* s nastavením blokování základních služeb (ssh, Apache apod.) V tomto případě stačí změnit hodnotu enabled=true

...
#
# JAILS
#

#
# SSH servers
#

[sshd]
# To use more aggressive sshd modes set filter parameter "mode" in jail.local:
# normal (default), ddos, extra or aggressive (combines all).
# See "tests/files/logs/sshd" or "filter.d/sshd.conf" for usage example and details.
#mode   = normal
port    = ssh
logpath = %(sshd_log)s
backend = %(sshd_backend)s
enabled = true
ignoreip = 127.0.0.1/8 1.2.3.4
filter = sshd

Zde můžete přidávat další služby nebo je přidat do samostatného souboru do složky jail.d

Nastavení nové služby

Tip: Pravidla lze nastavit například přes webové rozhraní Webminu

V základní nastavení je hlídán pouze přístup přes SSH. Další služby je nutné doplnit ručně. Nyní vytvoříme pravidlo pro službu NextCloud.

[nextcloud]
backend = auto
enabled = true
port = 80,443
protocol = tcp
filter = nextcloud
maxretry = 3
bantime = 300d
findtime = 43200
logpath = /var/www/html/cloud.domain.org/logs/access.log

A vytvoříme potřebné filtry obsahující failregex a datepattern

[Definition]
_groupsre = (?:(?:,?\s*"\w+":(?:"[^"]+"|\w+))*)
failregex = ^\{%(_groupsre)s,?\s*"remoteAddr":"<HOST>"%(_groupsre)s,?\s*"message":"Login failed:
^\{%(_groupsre)s,?\s*"remoteAddr":"<HOST>"%(_groupsre)s,?\s*"message":"Trusted domain error.
datepattern = ,?\s*"time"\s*:\s*"%%Y-%%m-%%d[T ]%%H:%%M:%%S(%%z)?"

Aplikaci lze ovládat i přes příkazovou řádku.

Restart služby

sudo systemctl restart fail2ban

V příkazové řádce můžeme sledovat status

sudo fail2ban-client status sshd

Můžeme povolit vybranou adresu

sudo fail2ban-client set sshd unbanip 1.2.3.4

Nebo naopak vybranou adresu zablokovat

sudo fail2ban-client set sshd banip 1.2.3.4
+