Przed Wami kolejny wpis z serii (4-6 wpisów) mającej zakończyć temat podstawowej konfiguracji serwera, a dotyczących bezpieczeństwa (w podstawowym ujęciu). Dziś w pewnym sensie kontynuacja wpisu dotyczącego firewalla UFW, choć tym razem to nie my będziemy decydować co i kiedy zablokować, a zrobi to za nas na aplikacja, na podstawie wcześniej zdefiniowanych reguł…

Fail2Ban, czyli banowanie za złe zachowanie

Podobnie jak wspomniany UFW, tak również Fail2Ban jest pewnego rodzaju nakładką na IPtables (gdzie tak naprawdę odbywa się blokada), ale w przeciwieństwie do UFW, gdzie sami definiujemy co i jak zablokować/odblokować, to Fail2Ban działa automatycznie, na podstawie reguł, które zdefiniujemy.

Program po prostu działa w tle, analizuje logi wybranych aplikacji, i na podstawie zdefiniowanych reguł szuka „złych zachować” (np. nieudana próba logowania, tzw. brute force) i jeśli natrafi na takie działania, to podejmuje akcje – blokuje takiego delikwenta/bota.

Zastanawiałem się (chwile, bo jednak nie jest to aż tak istotny problem) nad odpowiednikiem angielskiego „jail”, czyli tłumacząc dosłownie, będzie to „więzienie”.

I choć brzmi mi to średnio, to jednak dość dobrze oddaje (przynajmniej w jakimś stopniu) sens działania Fail2Ban, więc niestety musicie – tak jak i ja – w tym poradniku to zaakceptować… ;-)

Instalacja i podstawowa konfiguracja

Instalacja aplikacji w systemach Debian/Ubuntu jest prosta, wystarczy skorzystać z polecenia:

sudo apt-get install fail2ban

Po instalacji możemy przystąpić do podstawowej konfiguracji, czyli… nie będziemy edytować podstawowego pliku konfiguracyjnego:

/etc/fail2ban/fail2ban.conf

Wynika to z tego, że w większości przypadków domyślne ustawienia, które się tam znajdują, będą OK, a zamiast tego lepiej skoncentrować się na:

Wiezienie lokalne

Wprawdzie podstawmy plikiem, w którym moglibyśmy coś zmienić, jest plik::

/etc/fail2ban/jail.conf

To chyba nie znajdziecie miejsca, w którym ktokolwiek będzie polecał takie działanie – plik ten może zostać nadpisany nową wersją przy aktualizacji programu, a tym samym stracicie wszystkie Wasze ustawienia.

Lepszym rozwiązaniem jest skopiowanie tego pliku pod nową nazwą:

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

I wszelkie podstawowe modyfikacje przeprowadzamy później w tym pliku:

sudo nano /etc/fail2ban/jail.local

Podstawowa konfiguracja

To, co od razu warto zmienić/ustawić, to:

[DEFAULT]

# Jeśli masz stały adres IP - możesz go tu wpisać, zamiast aaa.bbb.yyy.zzz
# W innym przypadku skasuj ten fragment
ignoreip = 127.0.0.1/8 aaa.bbb.yyy.zzz
# Domyślny czas blokady w sekundach (86400 = 24 godziny):
bantime = 86400
# Domyslna ilość nieudanych prób, np. logowania:
maxretry = 3
# Czas do resetu licznika nieudanych prób:
findtime = 3600

destemail = [email protected]ń

Warto też spojrzeć na:

# Default banning action (e.g. iptables, iptables-new,
# iptables-multiport, shorewall, etc) It is used to define
# action_* variables. Can be overridden globally or per
# section within jail.local file
#banaction = iptables-multiport
banaction = iptables-allports

# email action. Since 0.8.1 upstream fail2ban uses sendmail
# MTA for the mailing. Change mta configuration parameter to mail
# if you want to revert to conventional 'mail'.
#mta = sendmail
mta = mail

Oraz:

# The simplest action to take: ban only
action_ = %(banaction)s[name=%(__name__)s, port="%(port)s", protocol="%(protocol)s", chain="%(chain)s"]

# ban & send an e-mail with whois report to the destemail.
action_mw = %(banaction)s[name=%(__name__)s, port="%(port)s", protocol="%(protocol)s", chain="%(chain)s"]
%(mta)s-whois[name=%(__name__)s, dest="%(destemail)s", protocol="%(protocol)s", chain="%(chain)s"]

# ban & send an e-mail with whois report and relevant log lines
# to the destemail.
action_mwl = %(banaction)s[name=%(__name__)s, port="%(port)s", protocol="%(protocol)s", chain="%(chain)s"]
%(mta)s-whois-lines[name=%(__name__)s, dest="%(destemail)s", logpath=%(logpath)s, chain="%(chain)s"]

# Choose default action. To change, just override value of 'action' with the
# interpolation to the chosen action shortcut (e.g. action_mw, action_mwl, etc) in jail.local
# globally (section [DEFAULT]) or per specific section
action = %(action_mw)s

W powyższym zapisie mamy ustawione, że w przypadku blokady dostaniemy również wiadomość e-mail, o czym decyduje ten fragment:

action = %(action_mw)s

Konfigurujemy więżenia

Dalej (w tym samym pliku) definiujemy więzienia – część jest już wstępnie zdefiniowana, wystarczy je tylko aktywować i ew zmodyfikować parametry (jeśli zajdzie taka potrzeba).

Sam najczęściej korzystam z więzienia dla szturmujących SSH:

[ssh]

enabled = true
port = 22,ssh,sftp
filter = sshd
logpath = /var/log/auth.log
maxretry = 2

[ssh-ddos]

enabled = true
port = 22,ssh,sftp
filter = sshd-ddos
logpath = /var/log/auth.log
maxretry = 3

Oraz – zależnie od webserwera – Apache2:

[apache] enabled = true port = http,https filter = apache-auth logpath = /var/log/apache**error.log maxretry = 6 [apache-overflows] enabled = true port = http,https filter = apache-overflows logpath = /var/log/apache* var click_object = {"ajax_url":"https:\/\/webinsider.pl\/wp-admin\/admin-ajax.php"};