Adaptacyjny firewall pocztowy

Tym razem pokusiliśmy się o mały wyskok w kierunku techno-bloga. Wierzymy, że temat jest ciekawy i wtajemniczonym może się przydać. Omówimy kwestię budowy adaptacyjnego firewalla dla serwera pocztowego. Zadanie, które chcemy zrealizować to:

Jeśli z danego adresu IP w ciągu zadanego okna czasowego będzie więcej niż X błędnych logowań do usługi POP3, SMTP, itp, to chcemy zablokować takie IP na godzinę, gdyż jest duża szansa, że mamy do czynienia z atakiem "brute force".

Mimo, że zadanie nie jest skomplikowane, zwykle nastręcza jednak wielu problemów, takich jak odpowiednie agregowanie zdarzeń aby wychwycić ich nagromadzenie w zadanym oknie czasowym. Proces ten powinien się jeszcze odbywać w czasie rzeczywistym, wsteczna analiza logów na nic się tu nie zda.

Reguły na firewallu iptables

Zacznijmy od konfiguracji samego firewalla iptables. Żeby móc łatwo dodawać i usuwać reguły bez ryzyka wpłynięcia na inne mechanizmy filtrowania, najlepiej utworzyć sobie osobny łańcuch, np. 'banned':

# iptables -N banned

i oczywiście musimy puścić przez niego ruch przychodzący do serwera:

# iptables -A INPUT -i eth0 -j banned

Skrypty do zarządzania firewallem

Teraz musimy napisać skrypty, które będą nam blokowały i odblokowywały niepożądane adresy IP. Adres ten będziemy przekazywali jako parametr do tych skryptów:

skrypt lock.sh:

#!/bin/bash
IP=$1
iptables -A banned -s $IP/32 -p tcp -m tcp -j REJECT --reject-with icmp-port-unreachable
echo "/path/to/unlock.sh $IP" | at -v "now + 1 hours" 2>&1

skrypt unlock.sh:

#!/bin/bash
IP=$1
iptables -D banned -s $IP/32 -p tcp -m tcp -j REJECT --reject-with icmp-port-unreachable

Jak łatwo zauważyć pierwszy ze skryptów dodaje regułę iptables, która zablokuje wszelki ruch przychodzący ze wskazanego IP, ale także doda za pomocą polecania 'at' odroczone o 1 godzinę wywołanie skryptu 'unlock', który zdejmie załozoną blokadę. Dzięki temu uzyskujemy efekt czasowego zablokowania potencjalnie niebezpiecznego IP, co zwykle skutecznie utrudni atak. Oczywiście skrypty te można dalej rozbudowywać dodając do nich mechanizm białej listy oraz powiadamianie administratora o zablokowaniu danego adresu IP. Simple Event Correlator (SEC)

Pozostał nam ostatni i zarazem najbardziej wysublimowany element całego systemu, czyli mechanizm wykrywający ataki. Mozna do tego celu zastosować program SEC (Simple Event Correlator), który analizuje na bieżąco logi i w przypadku wykrycia pewnych nietypowych sytuacji uruchamia zdefiniowane akcje. Więcej o programie można znaleźć na stronie oraz stronie. Reguły, które musimy przygotować w naszym wypadku, to:

type=SingleWithThreshold
ptype=RegExp
pattern=.*: LOGIN FAILED, user=([^,]*), ip=\[(::ffff:)?(.*)\]
desc=POP_$3
action=shellcmd /path/to/lock.sh "$3"
window=600
thresh=10

type=SingleWithThreshold
ptype=RegExp
pattern=.*smtpd(.*): warning: (.*)\[(.*)\]: SASL LOGIN authentication failed: authentication failure
desc=SMTP_$3
action=shellcmd /path/to/lock.sh "$3"
window=600
thresh=10

Pierwsza z nich reaguje na sytuację kiedy z jednego adresu IP w ciągu 10 minut było więcej niż 10 nieudanych prób logowania do serwera POP3/IMAP. Druga w analogiczny sposób wychwytuje błędne logowania do serwera SMTP (autentykacja SASL). Teraz mamy już praktycznie wszystko czego nam potrzeba do realizacji naszego celu. Wystarczy uruchomić program SEC aby zaczął analizować spływające logi:

# sec.pl -detach -conf=rules.conf -input=/var/log/mail.log -log=/var/log/sec.log

Spowoduje to uruchomienie w tle procesu SEC, który będzie śledził logi dodawane do pliku /var/log/mail.log na bieżąco (w czasie rzeczywistym). Powodzenia i oby powyższy mechanizm nie miał zbyt wiele do roboty.

Źródło: 3e internet software house