Greylistd pogromca spamu
data: 2009-11-04Aby jeszcze efektywniej zwalczać spam, postanowiliśmy wdrożyć na serwerach dodatkową warstwę ochronną. Jak się okazało, warstwa ta jest bardzo prosta do wdrożenia i nie zaburza ogólnej pracy serwera pocztowego.
Warstwą, o której mowa jest greylista. Jej zadaniem na początku sesji SMTP jest sprawdzenie trzech wartości w swojej bazie: adresu nadawcy, adresu odbiorcy, adresu IP serwera wysyłającego wiadomość. Jeśli takich wartości w bazie nie ma, automatycznie zwraca do serwera status "451 GREYLISTED".Poprawnie skonfigurowany serwer SMTP musi po otrzymaniu takiego statusu spróbować dostarczyć wiadomość raz jeszcze przynajmniej 10 minut później. Kolejna próba dostarczenia ponownie sprawdza w bazie trzy podane wyżj wartości. Tym razem greylista widzi, że znajdują się na liście oczekującej więc dostarcza maila do adresata. Informacje o nadawcy natomiast zapisywane są na białej liście więc wszystkie kolejne wiadomości od tego adresata do tego nadawcy z tego samego IP serwera będą dostarczane bez dodatkowych opóźnień.
Co sprawia, że ten tak banalny mechanizm jest tak skuteczny? Otóż przejęte serwery SMTP, lub wirusy rozsyłające spam, nie sprawdzają statusów doręczenia wiadomości w obawie przed trafieniem zawirusowanych adresów IP na globalne spamlisty. Wysyłają więc w ciemno miliony wiadomości z nadzieją, że chociaż kilku uda się dotrzeć.
Działanie greylisty pozwala na zaoszczędzenie cykli procesora oraz pamięci RAM potrzebnych na faktyczną analizę maili.
Do implementacji wykorzystaliśmy napisanego w Pythonie demona greylistd (http://projects.puremagic.com/greylisting/). W konfiguracji exima w sekcji acl_smtp_rcpt, wystarczy dodać na samym dole następujące wpisy:
defer message = $sender_host_address is greylisted. Please try again later.
log_message = GREYLISTED
domains = +relay_domains : +local_domains
!senders = : postmaster@*
!hosts = : +relay_hosts : \
${if exists {/etc/greylistd/whitelist-hosts}\
{/etc/greylistd/whitelist-hosts}{}} : \
${if exists {/etc/virtual/whitelist-hosts}\
{/etc/virtual/whitelist-hosts}{}}
!authenticated = *
verify = recipient/callout=5s,use_sender,defer_ok
condition = ${readsocket{/var/run/greylistd/socket}\
{--grey $sender_host_address $sender_address $local_part@$domain}{5s}{}{false}}
Działanie oczywiście obserwować można w logach exima. Statystyki dostępne po wydaniu komendy "greylist stats".
Na serwerach, którymi się zajmujemy skuteczność tego rozwiązania waha się od 94,5% do 97,6%, co zdecydowanie eliminuje uciążliwy spam.