Marketeers herkennen in SpamAssassin

Sommige marketeers zijn zo gemakkelijk te herkennen dat het onderstaande eigenlijk te simpel is bijna. Zo ook voor een paar marketeers uit onder andere België die netjes headers meesturen om welke mailing het gaat, voor wie, van wie, etc.

header __LOCAL_CAMPAIGN_ID exists:X-CAMPAIGN-ID
header __LOCAL_LIST_UNSUB exists:List-Unsubscribe
header __LOCAL_CONTACT_ID exists:X-ContactID
header __LOCAL_MAILING_ID exists:X-MailingID
meta LOCAL_MARKETING ((__LOCAL_CAMPAIGN_ID && __LOCAL_LIST_UNSUB && __HAS_X_MAILER) || (__LOCAL_CONTACT_ID && __LOCAL_MAILING_ID))
score LOCAL_MARKETING 3.5

Om een slag om de arm te houden blijft de score maar steken op 3.5, maar lijkt voldoende om met andere regels in SpamAssassin te markeren als spam. Dit soort kenmerken beginnen langzaam te lijken op de reclame meuk in een plastic in je brievenbus die dus ook zo de vuilnisbak in kan.

Een Bayesian-filter vullen met data

In een vorige posting werd SpamAssassin zo geconfigureerd dat het Bayesian-filter gebruik maakte van PostgreSQL om de data in op te slaan. Ook werd aangegeven dat er niet automatisch werd geleerd met de optie bayes_auto_learn 0 om zo te voorkomen dat het filter zijn eigen waarheid ging verzinnen van wat spam was en wat niet.

Een manier om aan data te komen voor het filter is door een mailbox met alleen ham en een mailbox met alleen spam regelmatig te importeren. De ham is natuurlijk nog wel gemakkelijk aan te komen door deze mailbox aan te melden op een paar mailinglists en nieuwsbrieven waarvan je weet dat ze te vertrouwen zijn en bijna 100% non-spam zijn en dus geschikt zijn voor de ham mailbox.

Voor spam zelf wordt het wat lastiger. Je kan vertrouwen op wat je gebruikers markeren als spam en dan importeren, maar hierdoor loop je altijd achter de feiten aan. Een makkelijkere en betrouwbare methode is door spamtraps op te zetten, maar het kan even duren voordat deze functioneel zijn. Je kan op sommige websites die jezelf onder beheer hebt de onderstaande string opnemen en hopen dat de robotjes van e-mailverzamelaars het oppakken.

<!-- <a href="mailto:spamtrap@example.org">spamtrap@example.org</a> -->

Het kan lang duren voordat er resultaat is. Een tweede optie kan zijn door in bepaalde groepen zoals bijvoorbeeld in nl.test op usenet te posten en dit kan redelijk snel resultaat opleveren. Een derde optie kan zijn door een PGP-key te uploaden naar de keyservers, maar deze methode is niet aan te bevelen aangezien het echt vervuiling is en je wordt traceerbaar.

Nu je spam en ham netjes in hun eigen mailbox binnenkomen kan je met de volgende commando’s op gestelde tijden je filter opschonen en vullen met spam en ham:

sa-learn -u amavis --force-expire
sa-learn -u amavis --spam --mbox spam.mbox
sa-learn -u amavis --ham --mbox ham.mbox

Zoals te zien is forceer ik dat alles gedaan wordt onder de gebruiker amavis aangezien amavisd-new de daemon is die tussen Postfix en SpamAssassin en ClamAV zit om de mail te scannen, te beoordelen en in geval van een virus ook in quarantine te plaatsen. Er kan binnen SpamAssassin met de optie bayes_sql_override_username amavis in local.cf hetzelfde effect worden afgedwongen.

PostgreSQL voor Bayesian-filtering in SpamAssassin

SpamAssassin beschikt over veel regels om e-mail te doorzoeken en te beoordelen op basis van een score of het spambericht is of een mailbericht. Er bestaat ook een optie om SpamAssassin uit te breiden met extra regels en bestaande te updaten, maar deze wedloop kan nooit worden gewonnen. Gelukkig zijn er meer opties om e-mail te beoordelen, zoals met een Bayesian-filter waarbij de kans wordt berekent of een bericht spam is of niet. Een methode waarbij niet wordt gekeken naar de frequentie dat iets voorkomt en daarmee alleen kan zeggen of een stelling waar is of niet waar is. Er is de mogelijkheid om te zeggen dat een bericht de kans heeft van 20% dat het een spambericht is en daarmee is de kans dus redelijk laag, maar er kan ook uitkomen dat de kans 80% is waarmee het veel aannemelijker is dat het een spambericht is.

De voorwaarde voor een goede werking is om goede statistieken te hebben om zo een kansberekening te maken. En hoewel er discussie bestaat over hoe deze statistieken moeten worden gemaakt lijkt de methode nu te werken om het filter op een regelmatige basis zowel spam- als hamberichten te voeden. Hoe je aan deze berichten komt laat ik nu even buiten beschouwing. De eerste stap op Bayesian-filtering aan te zetten in SpamAssassin is door de volgende aanpassingen te maken in /etc/spamassassin/local.cf:

use_bayes 1
bayes_auto_learn 0

Na deze aanpassing moet een database worden aangemaakt in PostgreSQL en moet worden voorzien van de tabellen die in /usr/share/doc/spamassassin/sql/bayes_pg.sql staan. Hierna moet /etc/spamassassin/local.cf worden uitgebreid met de onderstaande regels om SpamAssassin de database te laten gebruiken.

bayes_store_module Mail::SpamAssassin::BayesStore::PgSQL
bayes_sql_dsn dbi:Pg:dbname=database;host=localhost;port=5432
bayes_sql_username gebruiker
bayes_sql_password wachtwoord

Vanaf dit moment kan SpamAssassin gebruik maken van PostgreSQL om te beoordelen en met spamassassin –lint kan worden gecontroleerd of alles correct werkt.

SpamAssassin-regels voor AOL

Uit sommige spamberichten die niet werden weggefilterd bleek dat sommige partijen een gat hebben gevonden in een script bij AOL welke toestaat om een URL te laten redirecten. De spammer kwestie gebruikt AOL weer om bij DwarfURL te komen welke je dan ook weer doorstuurt. Gelukkig heeft DwarfURL de redirect al gesloten, maar AOL blijft vatbaar zoals zojuist nog getest.

Gelukkig is het niet al te moeilijk om met SpamAssassin een regel erbij te maken zoals hieronder. De score lijkt misschien nog wat dubieus, maar lijkt voorlopig te voldoen.

describe  LOCAL_REDIR_AOL   Open AOL redir-script
rawbody   LOCAL_REDIR_AOL   /\bhttp:\/\/www\.aol\.com\/redir.adp/i
score     LOCAL_REDIR_AOL   1.8

Hopelijk is dit een tijdelijke maatregel maar geeft wel aan dat er eens serieus naar deze diensten cq scripts gekeken moet worden. En het is nu natuurlijk wachten totdat AOL de problemen met dit script oplost.