Bayesian-filtering na ongeveer een jaar

In mei 2009 besteede ik in postings PostgreSQL voor Bayesian-filtering in SpamAssassin en Een Bayesian-filter vullen met data de nodige aandacht aan Bayesian-filtering, maar hoe staat het er nu voor? En het eerste wat zal opvallen is de titel, want er staat “na ongeveer een jaar” en de postings waren in mei. Dit klopt, maar gelukkig was de opzet van Bayesian-filtering met een PostgreSQL-backend al eerder opgezet om zeker te zijn dat het zinvol was.

Een jaar later is goed te zeggen dat de keuze voor het starten van een Bayesian-filter een goede keuze was. Veel spamberichten welke normaal gesproken niet door SpamAssassin zouden worden herkent worden nu als spam gemarkeerd. Ook het snelle leren van nieuwe type spamberichten gaat redelijk vlot, hoewel je wel voldoende berichten moet voeden aan het systeem. Naarmate de tijd vorderde ging de interval dat sa-learn draaide van eenmaal per dag naar elke zes uur, naar elke vier uur en uiteindelijk naar elk uur om bij te blijven. Zeker nadat de spamdomeinen geen bescherming meer hadden van de Spamhaus regels in de mailserver.

De komende maanden zal er een herimplementatie moeten komen van het statistiekensysteem om zo duidelijk te krijgen wat de belangrijkste regels in SpamAssassin zijn en of het mogelijk is om zonder oa SURBL, URIBL en Spamhaus te kunnen, maar ook welke SARE-regels nog zinvol zijn. Een andere optie is om te kijken of een herintroductie van Spamikaze kan plaats vinden om bepaalde e-mails toch op basis van een eigen blacklist/whitelist af te handelen.

DKIM verifiëren

DKIM aka DomainKeys Identified Mail is een alternatief op SPF aka Sender Policy Framework en hoewel het lastiger is op te zetten aan de verzenderkant is het wel goed te gebruiken als ontvanger. Zeker omdat oa grote partijen zoals Google en Yahoo het ook gebruiken om hun e-mail te versturen. Gelukkig zijn er ook steeds meer kleinere partijen die DKIM gebruiken.

Op Debian kan door het installeren van Mail::DKIM het oa worden gebruikt door SpamAssassin en Amavisd-new.

$ sudo apt-get install libmail-dkim-perl

Voor SpamAssassin om gebruik te maken van DKIM hoeft in het bestand /etc/spamassassin/v312.pre de volgende regel staan zonder #-teken ervoor.

loadplugin Mail::SpamAssassin::Plugin::DKIM

Je kan los een DKIM-proxy installeren om een header te laten toevoegen of de DKIM-signature voldoet, maar als je al al gebruikt maakt van Amavisd-new dan kan het al automatisch worden gedaan door Amavisd-new. Zorg dat in het bestand /etc/amavis/conf.d/50-user de volgende regel staan en herstart de daemon.

$enable_dkim_verification = 1;

Je zal nu zien dat de volgende regels zien verschijnen in /var/log/mail.log:

Dec 29 20:36:45 server amavis[7162]: Module Mail::DKIM 0.32
Dec 29 20:36:45 server amavis[7162]: DKIM code loaded

Als je bijvoorbeeld RoundCube gebruikt dat kan je met DKIM verification plugin de status automatisch laten weergegeven als de gebruiker zijn e-mail leest. Het zal je ook opvallen waar het voorlopig niet verstandig is om e-mail te rejecten op basis van een invalide DKIM signature. Bij sommige mailinglisten worden extra regels aan de body van de e-mail toegevoegd waardoor het signature niet meer valide is.

Marketeers en Tweets

Het was te verwachten uiteraard, maar bij het bekijken waarom sommige spamberichten niet netjes naar de Junk-folder viel me iets grappigs op. Sommige partijen zijn begonnen om niet alleen hun responses te monitoren met Google Analytics, maar laten nu ook automagisch een Tweet aanmaken om zo hoger op sommige lijsten te scoren. Of het fair is laat ik even in het midden, maar het lijkt wel langzaam een trend te worden om Twitter-achtige dingen te gebruiken in marketing en de kans dat gebruikers dit naar elkaar doorsturen is vrij klein.

describe LOCAL_TWEET Mailing with Tweet-API
rawbody __A_LOCAL_TWEET /\bhttp:\/\/api\.tweetmeme\.com\/share\?url/i
rawbody __B_LOCAL_TWEET /\bunsubscribe\b/i
meta LOCAL_TWEET ( __A_LOCAL_TWEET && __B_LOCAL_TWEET )
score LOCAL_TWEET 0.001

Met de bovenstaande ruleset voor SpamAssassin is te controleren wat de impact gaat zijn. Een paar dagen loslaten op de honeypot die het bayesianfilter van kenmerken voorziet zou voldoende moeten zijn om te kijken wat de score daadwerkelijk moet gaan zijn en of het effectief is.

Spammers worden slimmer?

Spammers aanmelden bij SpamCop lijkt effectief te zijn. Ze leren snel bij, want veel mailservers gaan voor je dicht als je geen actie onderneemt. Helaas blijkt Spamcop te veel weg te filteren waardoor de ontvanger van de klacht niet kan zien wie de aanmelder is zodat ze actie kunnen ondernemen. Of filteren ze niet te veel weg?

Waarom zou een marketeer^Wspammer moeten weten wie er klaagt over zijn ongevraagde meuk. De eerste reden kan zijn om die persoon uit de lijst te halen om de klachten omlaag te krijgen. De tweede reden kan zijn om juridische cq persoonlijke vervolging, want B2B moet toch mogen? Dank u overheid. Ik kan al niet wachten totdat het 1 oktober is.

Nu kan je met de hand de extra headers uit de e-mail halen voordat deze naar SpamCop gaat, want ze voegen nu een hele lijst headers van X-SubscriberID toe. Ze zijn sowieso niet heel erg slim, want echte spammers voegen stealth-identifiers toe zodat je het niet weet dat je wordt gemonitord.

Gelukkig is er SpamAssassin welke je kan opvoeden en een kleine uitbreiding zorgt ervoor dat er meer naar de spambox worden verhuist. Want om elk domein met de hand te gaan blacklisten en weigeren op de mailservers is tegenwoordig ondoenlijk.

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

De vraag die overblijft of SpamCop nog een toekomst heeft, maar ook deze partijen beter hun berichten kunnen laten sturen naar een spamtrap zodat het bayesianfilter ze beter kan leren.

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.