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