Postgrey

Úvod

Postgrey je skript napsaný v Perlu, který slouží pro tzv. "greylistování". Greylistování je poměrně účinná metoda proti SPAMu, která využívá toho, že spamboti a další MTA, jež nepracují striktně v souladu s RFC normami se obvykle nepokusí znovu doručit e-mail v případě, že pokus o první doručení nebyl úspěšný. Pokus o první doručení zprávy je díky programu Postgrey SMTP serverem (Postfixem) odmítnut s chybovým kódem 450 ("try again later"), který odesílající straně signalizuje, že se má pokusit doručit tuto zprávu později. Běžný (validní) SMTP server na tuto odpověď zareaguje tím, že danou zprávu uloží do fronty a pokusí se ji doručit později. Spamboti tyto chybové kódy obvykle ignorují, protože je pro ně nezajímavé dostávat ohromné množství vrácených a "bouncovaných" zpráv, takže se již znovu nepokusí danou zprávu poslat. A právě na tomto je založeno "greylistování".

Postgrey při prvním pokusu o doručení dané zprávy vytvoří ve své interní databázi (BerkeleyDB) záznam obsahující trojici údajů - IP adresu klienta a e-mailovou adresu odesílatele a příjemce zprávy. Následně tuto zprávu odmítne přijmout po daný čas, který je standardně nastaven na 5 minut (parametrem --delay=120 jej lze přenastavit).

Výhodou tohoto řešení je obrovská úspora výpočetního výkonu, který je potřebný pro podobné programy sloužící pro boj se SPAMy a viry (například Spamassassin).

Nevýhodou je pozdržení doručení zprávy, které může být od několika minut až po několik hodin (v závislosti na konfiguraci SMTP serveru odesílatele). Na druhou stranu, pozdržena bude pouze první zpráva od daného odesílatele danému příjemci, protože po úspěšném doručení zprávy dojde k vytvoření záznamu v databázi programu Postgrey a další zpráva je tak již doručena bez prodlevy.

Drobnou nevýhodou může být to, že některé servery nepracují korektně v souladu s RFC normami (Kerio MailServer 5.0.5, Novell Groupwise 6.0) nebo jsou špatně nakonfigurované a pak se chybová zpráva o dočasném nedoručení e-mailu může dostat až k uživateli, který z této zprávy může být zmatený nebo se nevalidní SMTP server již nepokusí o znovudoručení zprávy, což je horší případ. Každopádně tyto individuální případy nekorektní komunikace lze řešit pomocí whitelistů, tzn. vyjmutím klienta nebo příjemce e-mailu z greylistování.

Instalace

Program Postgrey je součástí repozitáře RPMForge, takže pokud jej máme nakonfigurován (viz článek o neoficiálních repozitářích pro CentOS), tak instalaci provedeme jednoduše následujícím příkazem:

yum --enablerepo=rpmforge install postgrey

Konfigurace

Máme dvě možnosti jak nakonfigurovat vzájemnou komunikaci mezi programem Postgrey a Postfix. Buď ke komunikaci využijeme klasický síťový TCP socket nebo můžeme použít běžný unixový socket. Tuto konfiguraci nalezneme v souboru /etc/init.d/postgrey (volba OPTIONS), případně ji můžeme předefinovat (což je systémovější způsob) v souboru /etc/sysconfig/postgrey, který si pro tyto účely vytvoříme a jehož obsah může vypadat následovně:

# unix socket
#DBPATH=/var/spool/postfix/postgrey
#SOCKET=$DBPATH/socket
#OPTIONS="--unix=$SOCKET"

# TCP socket
OPTIONS="--inet=127.0.0.1:10023"

Následně je zapotřebí nakonfigurovat Postfix (Postgrey dokáže spolupracovat i s jiným MTA, např. Sendmailem). V hlavním konfiguračním souboru Postfixu, který leží v soubor /etc/postfix/main.cf vytvoříme následující konfiguraci:

smtpd_recipient_restrictions =
        permit_mynetworks,
        permit_sasl_authenticated,
        reject_unauth_destination,
        check_policy_service inet:127.0.0.1:10023,
        permit

Pokud budeme využívat komunikaci přes unixový socket, tak zaměníme předposlední řádek níže uvedeným:

check_policy_service unix:/var/spool/postfix/postgrey/socket

V direktivě smtpd_recipient_restrictions můžete mít samozřejmě více voleb než jsem uvedl. Pozor na správné pořadí těchto voleb, protože pokud byste například uvedli volbu reject_unauth_destination až po volbě check_policy_service, tak se můžete snadno stát hrdými majiteli "open relay" serveru.

Teď již jen stačí spustit program postgrey:

service postgrey start

a pomocí programu chkconfig nebo ntsysv zajistit jeho automatické spouštění při startu serveru.

Na závěr nezapomeneme restartovat Postfix:

service postfix start

a máme hotovo...

Kontrola správné funkčnosti

Pokud máme vše správně nastavené, tak bychom měli v logu SMTP serveru, tedy v souboru /var/log/maillog nalézt záznamy podobné níže uvedenému:

Dec  1 17:28:19 www postgrey[1927]: action=greylist, reason=new, client_name=unknown, 
client_address=151.16.229.254, sender=balkanise@hangdrum.com, recipient=test@tachec.org
Dec  1 17:28:19 www postfix/smtpd[23213]: NOQUEUE: reject: RCPT from unknown[151.16.229.254]: 
450 4.2.0 <test@tachec.org>: Recipient address rejected: 
Greylisted, see http://postgrey.schweikert.ch/help/tachec.org.html;
from=<balkanise@hangdrum.com> to=<test@tachec.org> proto=SMTP helo=<gjkzv.auckke.com>

V logu nalezneme informace i o čase po který bylo doručení dané zprávy pozdrženo.

V RPM balíčku pro Postgrey je obsažen program postgreyreport, který slouží pro získávání informací týkajících se programu Postgrey z logů SMTP serveru.

cat /var/log/maillog | /usr/sbin/postgreyreport

Whitelisty

Postgrey podporuje tzv. "whitelist", tzn. seznam IP adres, domén nebo e-mailových adres na něž se nebude aplikovat greylistování.

V souboru /etc/postfix/postgrey_whitelist_clients jsou uvedeny IP adresy, domény, případně regulární výrazy pro klienty, kteří mají problém s greylistováním a tudíž se na tyto klienty greylistování nebude aplikovat.

Adresy klientů mohou být v tomto souboru uvedeny buď pomocí:

  • doménového jména (smtp1.google.com)
  • IP adresy (209.85.237.25 nebo 192.168.1.0/24)
  • regulárního výrazu (/^.*-out-.*\.google\.com$/)

Vlastní údaje týkající se klientů, na něž se nebude aplikovat greylistování bychom měli uvádět do souboru /etc/postfix/postgrey_whitelist_clients.local, kdy máme jistotu, že nedojde k přepsání těchto informací při případné instalaci novější verze programu Postgrey.

V souboru /etc/postfix/postgrey_whitelist_recipients jsou uvedeny e-mailové adresy příjemců pro něž nechceme použít greylistování. Tyto adresy mohou být uvedeny pomocí jednoho z následujících tvarů:

  • doménové jméno v adrese (tachec.org)
  • adresa@ (test@)
  • adresa@domena (test@tachec.org)
  • /regex/

Pokud máme velký počet uživatelů a chceme povolit greylistování pouze pro pár vybraných uživatelů, tak se jako lepší řešení nabízí konfigurace greylistů pro jednotlivé uživatele v Postfixu než vyjmenovávání všech uživatelů, kteří greylistování nechtějí používat, v souboru /etc/postfix/postgrey_whitelist_recipients.

V hlavním konfiguračním souboru Postfixu (/etc/postfix/main.cf) vytvoříme následující konfiguraci:

smtpd_restriction_classes = greylist
greylist = check_policy_service inet:127.0.0.1:10023

smtpd_recipient_restrictions =
        permit_mynetworks,
        permit_sasl_authenticated,
        reject_unauth_destination,
        check_recipient_access hash:/etc/postfix/greylist_users,
        permit

Obsah souboru /etc/postfix/greylist_users bude vypadat následovně:

test@tachec.org      greylist
pokus@tachec.org     greylist

Ještě je potřeba vytvořit binární (hash) podobu tohoto souboru, což provedeme tímto příkazem:

postmap /etc/postfix/greylist_users
Naposledy změněno: 6.12.2008 16:55