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
nebo192.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