fbpx
Zaznacz stronę

Fail2Ban repeatoffender – sztuka banowania w dłuższej perspektywie czasu

Jak już wcześniej opisałem podstawową konfigurację tego jakże praktycznego zabezpieczenia jakim jest Fail2Ban, czas przyszedł na dodatkowy gadżet, którym jest tryb „Repeat Offender”, co można śmiało określić, jako banowanie hostów, które często powtarzają próby dostania się do naszych zasobów. Sposób działania tej funkcji jest naprawdę prosty, bowiem zmieniamy parametry logowania i przechowywania logów z demona fail2ban. Oj biada węzłom tora

Po raz kolejny odsyłam do źródeł (GitHub):

https://github.com/mitchellkrogza/Fail2Ban-Blacklist-JAIL-for-Repeat-Offenders-with-Perma-Extended-Banning

Opisuję tutaj co trzeba zrobić, aby ta funkcja zechciała nam działać.

Zaczynamy od modyfikacji ustawień domyślnych „F2B Defaults”, czyli otwieramy w edytorze plik konfiguracyjny:

nano /etc/fail2ban/fail2ban.conf

Gdzieś w okolicach linii 24 tego pliku powinniśmy znaleźć wpis:

loglevel = 3

Z kolei koło linii 34 powinno być:

logtarget = /var/log/fail2ban.log

Dobrze, tak ma być. Jeśli mamy inaczej, to poprawiamy na powyższe wartości.

Następnym krokiem zmieniamy rotację logów:

nano /etc/logrotate.d/fail2ban

W tym pliku zmieniamy wszystko, na:

var/log/fail2ban.log {
missingok
notifempty
monthly
rotate 13
create 0600 root root
postrotate
/usr/bin/fail2ban-client set logtarget /var/log/fail2ban.log 2> /dev/null || true
endscript
}

Oczywiście trzeba będzie zrestartować usługę rsyslog, stosownym poleceniem:

service rsyslog restart

Wpisem, który mamy powyżej (znaczy ponad restartem sysloga), ustalamy rotację logów, raz na miesiąc i magazynowanie ich, po czym, 13-go miesiąca (czytaj po upływie roku) dopiero następuje kasowanie staroci. Ustawiamy to po to, aby zbierać namiary na naszych „hakerów” przez cały rok. Na dłużej chyba nie ma potrzeby. Z resztą, kto by to wszystko chciał przeglądać…

Dodajmy Jail dla funkcji Repeat Offender

nano /etc/fail2ban/jail.local

Na samym końcu pliku dorzucamy kilka linijek kodu:

[repeatoffender]

enabled = true
filter = repeatoffender
action = repeatoffender[name=repeatoffender]
sendmail-whois[name=Repeat-Offender, dest=email@twojadomena.pl, sender=fail2ban@twojadomena.pl]
logpath = /var/log/fail2ban*
maxretry = 10
findtime = 31536000
bantime = -1

Teraz ustawiliśmy filtr, dzięki któremu monitorujemy wcześniejszy krok. Ten filtr ma do wykonania pewną akcję. Ustawiliśmy (maxretry=10), ale oczywiście możemy więcej. Czas „findtime” zdefiniowany jako 31536000 daje nam rok liczony w sekundach. I znów, możesz zmienić sobie tą liczbę na każdą inną, ale jeśli ustawisz więcej, trzeba odpowiednio ustawić rotację logów na czas dostosowany do tego. Można również podać wartość „-1”, co będzie oznaczać na zawsze Funkcję wysyłania maila możemy wyłączyć, ale myślę, że może być ona przydatna.

Następnie tworzymy filtr dla demona F2B:

nano /etc/fail2ban/filter.d/repeatoffender.conf

Poniższa treść musi znaleźć się w tym pliku:

#Fail2Ban configuration file
#
# Author: WireFlare
#
# Ten plik filtra monitoruje plik logu fail2ban, i permanentnie
# banuje adresy ip namolnych atakujących.
#
# Ta wersja działa tylko z iptables.
#

[Definition]
_jailname = repeatoffender
failregex = fail2ban.actions:\s+WARNING\s+\[(?:.*)\]\s+Ban\s+
ignoreregex = fail2ban.actions:\s+WARNING\s+\[%(_jailname)s\]\s+Ban\s+

Powyższy wpis definiuje regułę „wyłapywania” funkcji „repeat offender’a”.

Krokiem następnym trzeba utworzyć akcję – Fail2Ban Action

nano /etc/fail2ban/action.d/repeatoffender.conf

W tym pliku mamy taką treść:

# Fail2Ban configuration file
#
# Author: WireFlare
#

[INCLUDES]

before = iptables-blocktype.conf

[Definition]

# Option: actionstart
# Notes.: command executed once at the start of Fail2Ban.
# Values: CMD
#
actionstart = iptables -N fail2ban-
iptables -A fail2ban- -j RETURN
iptables -I -p -j fail2ban-
# Establish chain and blocks for saved IPs
iptables -N fail2ban-ip-blocklist
iptables -A fail2ban-ip-blocklist -j RETURN
iptables -I -p -j fail2ban-ip-blocklist
cat /etc/fail2ban/ip.blocklist. |grep -v ^\s*#|awk '{print $1}’ | while read IP; do iptables -I fail2ban-ip-blocklist 1 -s $IP -j REJECT –reject-with icmp-port-unreachable; done

# Option: actionstop
# Notes.: command executed once at the end of Fail2Ban
# Values: CMD
#
actionstop = iptables -D -p -j fail2ban-
iptables -F fail2ban-
iptables -X fail2ban-
# Remove chain and blocks for saved IPs to prevent duplicates on service restart
iptables -D -p -j fail2ban-ip-blocklist
iptables -F fail2ban-ip-blocklist
iptables -X fail2ban-ip-blocklist

# Option: actioncheck
# Notes.: command executed once before each actionban command
# Values: CMD
#
actioncheck = iptables -n -L | grep -q 'fail2ban-[ \t]’

# Option: actionban
# Notes.: command executed when banning an IP. Take care that the
# command is executed with Fail2Ban user rights.
# Tags: See jail.conf(5) man page
# Values: CMD
#
actionban = VERIFY=”*”
ADD=” # fail2ban/$( date '+%%Y-%%m-%%d %%T’ ): Perma-Banned”
FILE=/etc/fail2ban/ip.blocklist.
grep -q „$VERIFY” „$FILE” || iptables -I fail2ban- 1 -s -j DROP
grep -q „$VERIFY” „$FILE” || echo „$ADD” >> „$FILE”

# Option: actionunban
# Notes.: command executed when unbanning an IP. Take care that the
# command is executed with Fail2Ban user rights.
# Tags: See jail.conf(5) man page
# Values: CMD
#
actionunban = # Do nothing becasuse their IP is in the blocklist file

# To manually unban from the ip blocklist file run this command:
# Be warned that if the ip is in log rotated files it must be whitelisted
#
# sed -i '/^/d’ /etc/fail2ban/ip.blocklist.repeatoffender
#

[Init]

# Default name of the chain
#
name = default

# Option: protocol
# Notes.: internally used by config reader for interpolations.
# Values: [ tcp | udp | icmp | all ] Default: tcp
#
protocol = tcp

# Option: chain
# Notes specifies the iptables chain to which the fail2ban rules should be 
# added
# Values: STRING Default: INPUT
chain = INPUT

Teraz krótko, co tym wpisem tutaj zrobiliśmy.

A funkcji „actionstart” tworzy się dodatkowy łańcuch iptables. Właściwie to dwa. Jeden dodaje do listy „niedawno zablokowanych” a drugi to lista już wcześniej zablokowanych IP’ków. Mamy również polecenia odczytu z listy zablokowanych adresów IP i stosujemy te wpisy iptables do łańcucha ip-blocklist.

W „actionstop” dodaliśmy łańcuch IP-blocklist do oryginalnego łańcucha, aby usunąć łańcuch z iptables w razie wznowienia demona fail2ban. Wszystko tak, aby nie dostać duplikatów tych adresów.

W „actionban” ustaliliśmy zmienne do weryfikacji, czy dany adres IP jest już na liście zbanowanych, czy nie. Na blogu autorów, napisano bardzo ciekawe pytanie – skoro dany adres IP ma być banowany na stałe, to po co skrypt ma sprawdzać, czy jest już ten IP, czy nie? Odpowiedź okazuje się być banalnie prosta. Jeśli załóżmy uruchomimy ponownie serwer, lub samą usługę, fail2ban będzie miał skąd „odczytać” listę już zbanowanych. Oczywiście proces ten jest bardziej złożony, ale dociekliwych zachęcam do przeczytania bloga autorów. Link u góry strony.

W „actionunban” w zasadzie nie robi się nic, ponieważ blokujemy delikwentów definitywnie na „amen”

Jeszcze kilka dodatków

Załóżmy, że chcemy odblokować któregoś IP’ka, więc przydatne będzie jakieś proste w obsłudze polecenie pozwalające to zrobić. Chłopaki z Wireflare pomyśleli również i o tym.

Moglibyśmy wpisać dość skomplikowaną komendę typu:

sed -i '/^<ip>/d' /etc/fail2ban/ip.blocklist.repeatoffender

W tym poleceniu zamiast literek „ip” podajemy stosowny adres. Ale, zróbmy sobie odpowiedni pliczek wykonywalny. Niezbędna zatem będzie taka czynność:

nano removeoffender.sh

Do tego pliku wklejamy taką zawartość:

#!/bin/bash

sed -i "\|$1|d" /etc/fail2ban/ip.blocklist.repeatoffender
echo "$1 removed from Repeat Offender Blocklist"

sed -i "\|$1|d" /var/log/fail2ban.log
echo "$1 removed from Current Fail2Ban Log"

sed -i "\|$1|d" /var/log/fail2ban.log-*
echo "$1 removed from Rotated Fail2Ban Logs"

Zachowujemy ten wpis, dodajemy prawa wykonywalności poleceniem:

chmod +x removeoffender.sh

Więc jeśli chcemy odblokować konkretny adres (pojedynczy lub całego segmentu sieci) wydajemy polecenie:

./removeoffender.sh 192.168.0.0

To już niemal wszystko. Pozostało tylko przeładowanie usługi:

service fail2ban reload
service fail2ban restart

Rozpisałem się tutaj całkiem sporo, ale temat wart jest tego trudu. Jeśli wszystko dobrze zrobisz, będziesz się cieszyć całkiem sprawnym mechanizmem blokującym dostęp nachalnym „baranom” do zasobów naszego serwera.

Jak zwykle w przypadku tego typu artykułu, proszę o komentarze czy gdzieś nie popełniłem jakiegoś błędu, lub coś przypadkiem pominąłem, bądź popełniłem literówkę lub błąd merytoryczny. Starałem się opisać to w miarę prostym językiem, choć nie jest to zawsze proste.