Lemat, strona prywatna

Wykorzystanie fail2ban do budowania rbla

Jeżeli ktoś używa rbldnsd i pobrał ode mnie tld.gz to zapewne chciałby aby ten plik był uaktualniany. Może więc zaciągać go okresowo z mojego serwera albo wykorzystać własne logi. Fail2ban jest takim fajnym softem, który przegląda logi, szuka pasujących ciągów znaków i potrafi uruchomić zadaną akcję. No to do dzieła.

Przede wszystkim w mail.info muszą się znaleźć takie linie, które będzie wyłapywał fail2ban, czyli:

natomiast ignorujemy te linie, które świadczą o tym, że dany IP już jest w RBLu - zawierają "dynamic.rbl.tld"


plik konfiguracyjny wyłapujący te linie wygląda tak:

# cat /etc/fail2ban/filter.d/tld.conf
# Fail2Ban configuration file

[Definition]

ignoreregex = dynamic.rbl.tld
failregex = NOQUEUE: reject: .*\[<HOST>\]: .*(Login and password required|from=<0-|Helo command rejected: fake EHLO name|helo=<(\[?([0-9]*\.){3}[0-9]*\]?|device.lan|telesp.net.br|anteldata.net.uy|livebox|alicegate|vodafone.it|brasiltelecom.net.br|BThomehub.home|tie.cl)>|HELO_DYNAMIC|HELO_INDICATOR|Recipient address rejected: please use|zen.spamhaus.org)

następnie potrzebny jest programik rblcheck, który sprawdza czy IP jest listowany w RBLu, oczywiście jest też potrzebny działający rbldnsd  z plikiem tld.gz, do którego będziemy dopisywali na końcu IPki

plik konfiguracyjny dopisujący IPki do pliku wygląda tak:

# cat /etc/fail2ban/action.d/tld.conf
# Fail2Ban configuration file
#
# Author: Lemat
#
# $Revision: 001 $
#

[Definition]
actionstart =
actionstop =
actioncheck =
actionban = IP=<ip>; if [ ! `rblcheck -qcs dynamic.rbl.tld $IP` ]; then
            printf %%b "$IP\n" | tee -a /var/lib/rbldns/new >> <file>
            fi
actionunban =

[Init]
file = /etc/bind/tld


No i dopisujemy powyższe pliki do konfiguracji fail2ban

# cat /etc/fail2ban/jail.local

[tld]
enabled = true
filter = tld
action = tld
logpath = /var/log/mail.info
maxretry = 1
bantime = 60

jeżeli poprawnie wszystko zrobiliśmy to wkrótce w /var/log/fail2ban.log znajdziemy taką linię:
2012-02-14 15:58:23,081 fail2ban.actions: WARNING [tld] Ban 189.206.110.14

a adres IP 189.206.110.14 na końcu pliku /etc/bind/tld

po minucie (60 sekund) pojawi się wpis typu Unban dla tego IP, ale można się tym nie przejmować bo akcja usuwania ipka jest pusta (chyba, że ktoś chce to niech sobie zrobi ;) )

Dlaczego po minucie na nie po nieskończenie długim czasie (-1) ? Bo fail2ban trzyma w pamięci bazę danych zablokowanych IPków. Ta baza przyrasta. Zabiera niepotrzebnie pamięć. Restart fail2ban zajmuje coraz więcej czasu.
Rbldnsd co minutę sprawdza czy data i czas pliku się zmieniły. Jeżeli wykryje zmianę to się przeładowuje (nie musimy tego robić za niego).

Fail2ban działa z pewnym opóźnieniem, rbldnsd też zaciąga nowy plik z opóźnieniem zatem czasem w logach znajdziemy coś takiego:
2012-02-14 15:03:47,125 fail2ban.actions: WARNING [tld] 41.141.5.26 already banned
nie trzeba się tym przejmować. W końcu IP trafi do RBLa i juz kolejne sesje smtp z tego IP będą odrzucane.
Jeżeli chcemy przeszukać logi w poszukiwaniu IPków, które nie są jeszcze w RBLu ale się nadają to mam na to poniższy skrypt perla:
#!/usr/bin/perl                                 
use Net::DNS;
my $res  = Net::DNS::Resolver->new;
$res->nameservers("127.0.0.2");

$regexp='from=<0-|Helo command rejected: fake EHLO name|helo=<\[?([0-9]*\.){3}[0-9]*\]?>';
chdir '/var/log';

  open(plik,'grep "reject:" mail.info|grep -v "Greylisted for|dynamic.rbl.tld"|grep -iE "'.$regexp.'" mail.info|cut -d"]" -f2|cut -d"[" -f2|');
  while (<plik>) {
        if ( /(\d+)\.(\d+)\.(\d+)\.(\d+)/ ) {
                $ipek=$1.'.'.$2.'.'.$3.'.'.$4;
                $ip{$ipek}++;
                $rev{$ipek}=$4.'.'.$3.'.'.$2.'.'.$1;
                }
        }
  }

foreach $key (keys %ip) {
  if (!(grep $_ eq $key, $trusted)) {
        my $packet = $res->send( $rev{$key}.'.dynamic.rbl.tld', "A");

          if ($packet && $packet->header->ancount==0) {
                printf "%s\n",$key;
                }
        }
  }

Powyższe skrypty używają:
/var/log/mail.info jak plik logów poczty (postfix)
/etc/bind/tld jako plik zawierający strefę rbl.tld, która nakarmiony jest rbldnsd (może to być symlink do /var/lib/rbldns/tld)

Data utworzenia : 2012-02-07, data aktualizacji :2013-11-22

Skomentuj ten tekst

Komentarze:

bódyn
2012-04-29 18:48:44
bantime
jeśli bantime jest mniejszy od zera wtedy nei jest podejmowana akcja unban
Odpowiedź Lemata:
to niestety jest zły pomysł - właśnie uaktualniłem artykuł i opisałem dlaczego.
alex_joe
2012-04-23 23:13:02
Dzięki.
Dzięki za tą poradę i inne w Twoim serwisie (stały czytelnik od kilku lat), odwalam teraz większość spamu i śpię spokojnie. A spamerom też dziękuję, przynajmniej człowiek dokształca się ciągle. Tylko k..wa po co? Jak zliczę wszystkie godziny spędzone na analizach tego ścierwa (czyt. spamu) to mnie szlag trafia, że człowiek traci cenny czas, zamiast np. pobyć z rodziną.
Pozdrowienia dla adminów firm hostingowych, którzy biorą na poważnie zasady RFC i nie przedkładają pseudo wolności ich klientów nad zasady współużytkowania Internetu, a reszcie - weźcie się do roboty albo wyłączcie serwery.
Odpowiedź Lemata:
ja tam podchodzę do tematu spamu komercyjnie - zatrudniają mnie ludzie, którzy chcą "pobyć z rodziną"
bódyń
2012-04-11 10:06:31
fail2ban
Ja zbudowałem przy pomocy fail2ban system w ktorym ubijane sa IP z Helo command rejected i IP blokowane przez sorbs i spamhaus.
Moze komus sie przyda
failregex = NOQUEUE: reject: RCPT from [^\s]+\[\]: 5\d\d .+ Helo command rejected
NOQUEUE: reject: RCPT from [^\s]+\[\]: 554 .+ Recipient address rejected: Access denied
NOQUEUE: reject: RCPT from [^\s]+\[\]: 554 .+ blocked using zen.spamhaus.org
NOQUEUE: reject: RCPT from [^\s]+\[\]: 554 .+ blocked using dul.dnsbl.sorbs.net
Protected by spf
[Nospam-PL.NET]
Seti@Home
www.php.net
© Lemat 2004 - ∞