Hlavní navigace

SpamBayes: na spam statisticky a dynamicky

27. 10. 2011
Doba čtení: 8 minut

Sdílet

V posledních dvou týdnech sleduji na serverech, kde běží SpamAssassin, podivné propouštění některých spamů nabízejících práci. Několik let dobře fungující detekci spamu, která nepotřebovala žádnou ruční údržbu, bylo potřeba prohlédnout a najít slabé místo. Napadlo mě ale, že bych to mohl vzít z úplně jiného konce.

Určit správně, co je spam a co ham, je věda postavená na vodě. Když půjdeme až do extrému, tak jeden e-mail může být jedním člověkem považován za spam a druhému přijde jako běžná komunikace. To je problém hlavně pro nás administrátory, protože co je obtížně pojmenovatelné, to je také obtížně zjistitelné.

Spam letos v květnu oslavil 33. narozeniny, a tak není divu, že se během těch pár dekád podařilo jakž takž nadefinovat, co to spam je a co není. V technickém slova smyslu to znamená hromadu pravidel, precizně vyvážených, kterými lze ortel na příchozí e-mail téměř s naprostou jistotou určit. Naštěstí si většina spamů vyláme zuby na věcech jako:

  • obsahuje pouze obrázek a navíc roztažený přes 800 pixelů
  • z této IP adresy odešlo dalších 1 000 000 e-mailů se stejným textem
  • text zprávy obsahuje mockrát slovo „viagra“, „money“ a podobně
  • zpráva je odeslána z budoucnosti

A když se dobře podíváte na pravidla SpamAssassinu (SA), zjistíte, že bych mohl pokračovat na dalších tisíci řádcích. SA funguje tak, že každý e-mail projde kontrolou na podle daných pravidel a když nějakému vyhovuje, tak je zprávě přiděleno nějaké skóre, které se sčítá. Skóre se liší podle závažnosti pravidla a dokonce i ty dobré e-maily většinou nějaký ten bod chytí. Když jsou pravidla dobře napsaná a skóre je vyvážené, skončí 99 % spamu tam, kde má. Ke statickým pravidlům se ještě přidávají pluginy, včetně tzv. bayes filtru. Ten se postupem času učí ty správné a ty špatné e-maily a přidává něco málo na skóre.

Podivnosti za poslední dva týdny

Během posledních čtrnácti dnů já a hlavně uživatelé mých serverů pozorujeme spamy, které se dostávají skrze SA, i když by neměly. Většinou jde o nabídky pracovních pozic a SA v jednom z takovýchto případů hlásí toto:

pts rule name              description
---- ---------------------- --------------------------------------------------
1.3 RCVD_IN_RP_RNBL        RBL: Relay in RNBL,
            https://senderscore.org/blacklistlookup/
              [151.26.114.104 listed in bl.score.senderscore.com]
0.0 RCVD_IN_SORBS_DUL      RBL: SORBS: sent directly from dynamic IP address
            [151.26.114.104 listed in dnsbl.sorbs.net]
3.5 BAYES_99               BODY: Bayes spam probability is 99 to 100%
            [score: 1.0000]
1.4 RCVD_IN_BRBL_LASTEXT   RBL: RCVD_IN_BRBL_LASTEXT
            [151.26.114.104 listed in bb.barracudacentral.org]
2.0 FROM_SAME_AS_TO        FROM_SAME_AS_TO
1.0 RDNS_DYNAMIC           Delivered to internal network by host with
            dynamic-looking rDNS
0.7 KHOP_DYNAMIC           Relay looks like a dynamic address 

Pravidlo FROM_SAME_AS_TO jsem doplnil sám a porovnává From a To v hlavičce a při shodě zareaguje. Podobná pravidla SA má, ale obsahuje více podmínek, takže na ně tyto „moderní“ spamy nedosáhnou. Další pravidlo, které se podepsalo o zařazení do spamu, je BAYES99, a to díky mé píli při třídění spamů. Celkem jsem zásahy do pravidel zvýšil skóre ze 4,5 na 10. přičemž limit pro určení, zda jde o spam či ne, je 5. Ale to bohužel není všechno, musel jsem navíc vypnout pravidlo RCVD_IN_DNSWL_HI, které kontroluje IP adresy se svým seznamem a pokud kontrola projde, je zprávě odečteno dalších pět bodů. Popis služby najdete na dnswl.org. Bez mého zásahu by zpráva měla –0,5 bodu a to je na spam, který chodí po desítkách do každé schránky, podezřele málo. Pravidla v SA jsou každý den samozřejmě aktualizovaná, ale nepomáhá to.

Pro porovnání uvedu, že ještě 3 týdny zpátky dostávaly podobné e-maily skóre 10, 20, 30 i víc, a to jsem do něj nemusel jakkoli zasahovat. Podobné zkušenosti mají i jiní uživatelé.

Blocklisty

Rozhodl jsem se trochu pozměnit strategii. Nejsem zrovna kovaný v úpravě pravidel SA a nedokáži objektivně zhodnotit globální účinky na filtr, pokud něco změním. DNSWL v tomto případě zklamalo, a to nejen mě. Na svých stránkách píší, že mají v databázi 100 000 dobrých mail serverů a v takovém množství asi holt něco proklouzne, ale k čemu pak taková služba je. Řekl jsem si, že bude lepší, když podivné mail servery odstřihnu úplně a dal jsem stoprocentní rozhodovací právo ZEN databázi od SpamHaus. Druhým v pořadí, kdo může e-mail na mých serverech odstřelit, je SpamCop Blocking List.

Pokud se nějaká IP adresa na jeden z těchto block listů dostane, pravděpodobně její uživatelé objeví problém dříve a jinde. Navíc se o odstřelení závadného e-mailu postará Postfix, který má možnost druhou stranu během přenosu zprávy informovat, že má smůlu a musí problém řešit. SA používá podobné blocklisty, ne-li úplně stejné, ale postižené e-maily „jen“ dostanou větší skóre a mají šanci se dostat až k uživateli.

Pokud si chcete svůj postfix nastavit podobně, pomůže vám v tom konfigurační direktiva smtpd_recipien­t_restriction­s.

smtpd_recipient_restrictions =  permit_sasl_authenticated,
                permit_mynetworks,
                reject_unauth_destination,
                reject_non_fqdn_sender,
                reject_non_fqdn_recipient,
                reject_unknown_sender_domain,
                reject_unknown_recipient_domain,
                reject_unauth_pipelining,
                reject_unauth_destination,
                reject_rbl_client zen.spamhaus.org,
                reject_rbl_client bl.spamcop.net 

Na prvních dvou řádcích přijmete e-maily z vašich sítí a případně od autorizovaných uživatelů. Na dalších řádcích najdete omezení pro předávání e-mailů na jiný server (tzv. relay) nebo třeba pokud e-mail neobsahuje správně formátované From v hlavičce. K tomu se dozvíte více v dokumentaci k Postfixu. Poslední dva řádky pak odmítnou všechny e-maily, které byly odeslány z IP adres, jež jsou k nalezení v uvedených databázích.

Nemyslím si, že je v tomto případě řešení pravidlo RCVD_IN_DNSWL_HI vypnout, protože další pravidla na něj spoléhají. Kdybych pravidla upravil a ta náhodou fungovala dobře, další aktualizace oficiálních pravidel by mohla vším zas zamíchat. A proto jsem začal hledat jiný nástroj.

SpamBayes

Už od doby, co jsem na Linuxu, nemám rád Perl. A protože SA a vůbec hromada dalších starých nástrojů jsou v Perlu napsané, rozzářily se mi oči, když jsem objevil SpamBayes. Není to tak úplně náhrada SA, protože funguje na jiném principu, filtruje podle toho, co uživatel v minulosti označil za spam či ham. Celému procesu se běžně říká bayes filter. To znamená, že SpamBayes (SB) nebude fungovat hned, ale je potřeba ho něco naučit. To většinou nebude problém, protože všichni máme schránku plnou spamů a hamů a pokud ne, stačí ji na viditelném místě zveřejnit. E-mailů na naučení ani není potřeba moc, vystačíte si s několika stovkami a filtr začne prakticky hned fungovat. Spolehlivost je pak závislá na tom, jak dobře filtr učíte. Jako bonus možná oceníte, že je SB proti SA rychlejší.

Protože se SB rozhoduje na základě toho, co si vybrali uživatelé, tak u velkého počtu schránek, které vám nepatří, je prakticky nemožné označovat za ham inbox. Uživatelé často spamy neřeší nebo je ani neumí řešit, a tak by se vám mohlo jednoduše stát, že byste měli stejné e-maily naučené jako ham i spam. V takovém případě ale velmi dobře funguje učení se hamu z odchozích zpráv. Na druhou stranu, když máte schránku nebo pár schránek jen pro sebe, můžete si dovolit učení se i z inboxu a měli byste se dopídit ke stejnému výsledku.

Instalace

Instalaci nebudu nějak protahovat a uvedu jen debianí:

# apt-get install spambayes

Na dalších distribucích to bude podobné. Pokud ne, tak můžete použít utilitku pip:

# pip install spambayes

Použití

Po nainstalování hledejte v systému následující utilitky:

  • sb_filter.py
  • sb_mboxtrain.py

Ty postačí na vytvoření databáze a filtrování zpráv. K dispozici toho je samozřejmě mnohem víc, včetně POP3 proxy nebo IMAP klienta, který ve schránce projede všechny e-maily a označkuje je svou hlavičkou. Takový postup je dobrý spíše pro jednotlivé uživatele a ne pro servery, takže tu pouze zanechám odkaz, kde najdete víc informací.

Základem je mít vytvořenou čistou databázi.

$ sb_filter.py -d ~/.hammie.db -n 

A nastrkat do ní data o vašich zprávách.

$ sb_mboxtrain.py -d ~/.hammie.db -s ~/.maildir/.spam/ -g ~/.maildir/.Sent/ 

Za parametrem -g uveďte maildir nebo mailbox s hamem a za -s to samé se spamem. Dobře uděláte, když si podobný řádek dáte do cronu, případně ho ještě rozšíříte, aby se učil na více schránkách.

Filtrování je pak už hračkou, stačí k tomu roura.

$ sb_filter.py -d ~/.hammie.db < mail.txt 

Do kontrolovaného e-mailu bude přidána hlavička podobná těmto:

X-Spambayes-Classification: spam; 1.00
X-Spambayes-Classification: unsure; 0.29
X-Spambayes-Classification: ham; 0.08 

V případě maildropu tak není nic jednoduššího, než přidat následující řádky do ~/.mailfilter.

xfilter "sb_filter.py -d $HOME/.hammie.db"

if (/^X-Spambayes-Classification: spam.*/)
{
    to "./.maildir/.spam"
} 

U procmailu je to podobné, jenom se souborem ~/.procmailrc. Vzhledem k tomu, že procmail nepoužívám, dovolím si použít příklad z návodu odkazovém výše.

:0fw:hamlock
| sb_filter.py -d $HOME/.hammie.db

:0
* ^X-Spambayes-Classification: spam
${MAILDIR}/spam 

Další možností, jak zaháčkovat do mailového řetězu SB, je v Postfixu. V souboru master.cf upravíme jeden z prvních řádků tak, aby vypadal takto:

smtp      inet   n   -   n   -   -   smtpd
  -o content_filter=spambayes: 

Na konec stejného souboru umístíme toto:

spambayes unix  -   n   n   -   -   pipe
  user=nobody argv=/usr/local/bin/hammiewrapper.sh
$sender $recipient 

A když to máme, tak do /usr/local/bin/ham­miewrapper.sh zkopírujeme tento skript:

#!/bin/sh
sb_filter.py \
-d /var/spambayes/hammie.db -f \
| /usr/sbin/sendmail -f $* 

Postup je převzat taktéž z dokumentace na webu projektu a nejsem si úplně jistý, zda se e-mail nedostane do lokální smyčky. Všimněte si také umístění databáze.

Pokud jste nikdy s content_filter v postfixu nepracovali, doporučuji zaháčkovat SB v maildropu nebo procmailu. Dá vám to větší rozlet v případě nějakých dalších požadavků.

CS24 tip temata

Závěr

Nejsem zatím ve fázi, kdy bych mohl říct, že je uvedená konfigurace bez chyby. SpamBayes používám jen chvíli a zatím jen u své schránky, kde označuje velmi úspěšně spamy, ale méně úspěšně ignoruje maily z newsletterů. Časem se určitě najde někdo, kdo mi bude tvrdit, že mám moc restriktivní pravidla a on nemůže odeslat e-mail na nějakou mnou hostovanou schránku. Pokud také na někoho takového narazíte, tak vězte, že problém má on, a to ne jen u vás. Být uveden na jednom z block listů znamená zařadit se do spamu třeba i na Seznamu, se kterým komunikuje ohromné množství lidí z celé naší země.

Nakonec se zeptám, narazili jste na problémy se spamem během října? Jak jste je řešili?

Autor článku

Adam Štrauch je redaktorem serveru Root.cz a svobodný software nasazuje jak na desktopech tak i na routerech a serverech. Ve svém volném čase se stará o komunitní síť, ve které je již přes 100 členů.