Mit dem freien Anti Spam Filter "bogofilter" automatisch E-Mail Spam blocken.
Ohne Spamfilter kommt heute eigentlich keiner mehr aus. Doch was soll man tun gegen diese Plage?
Für Linux möchte ich hier die zwei gängigsten Tools vorstellen, wobei ich auf das zweite dann im Detail eingehen werde.
SpamAssassin
SpamAssassin ist ein freier Spamblocker, der auf zwei unterschiedliche Arten funktioniert:
Zum einen gibt es eine blacklist von "badwords", deren Vorkommnisse in E-Mails mit Negativ-Punkten "bestraft" wird. Diese Punkte summieren sich auf, und ab einer frei einstellbaren Grenze wird die E-Mail als Spam gekennzeichnet oder sogar gleich entsorgt.
Nun sind Spammer allerdings sehr erfinderisch und verändern die Wörter in ihren Mails, so dass sie zwar für das Auge noch lesbar sind, aber nicht mehr dem hinterlegten badword entsprechen, zum Beispiel werden Buchstaben durch ähnlich aussehende Zahlen ausgetauscht und aus "Spamfilter" wird "5pamfi1ter".
Diese Filtertechnik disqualifiziert sich meines Erachtens von selbst:
- Sie erkennt abgewandelte Wörter nur schwer
- Sie ist nicht Context-Aware, d.h. sie erkennt nicht, in welchem Zusammenhang ein Wort benutzt wird, so kann es für einen Arzt durchaus Sinnvolle Mails mit P*t**z-steigernden Mittelchen geben
- Sie lernt nicht automatisch und muss umständlich gepflegt werden
Die zweite Betriebsart von SpamAssassin ist der sogenannte Bayes-Filter und basiert auf einem statistischen Verfahren zur Klassifizierung einer Mail als Spam oder Ham (Schinken).
Mit dem Bayes-Filter hat man ein äußerst effizientes Mittel, das selbständig lernt, nicht mit einem Wörterbuch konfiguriert werden muss und das auch bei verunstalteten Wörtern gut funktioniert.
Allerdings ist der SpamAssassin nicht gerade Ressourcen schonend, weswegen ich einen anderen Spam-Filter mit Bayes-Funktion empfehle:
bogofilter
Bogofilter ist ein reinrassiger Bayes-Filter. Im Grunde funktioniert er nach folgendem Prinzip:
Ein Text wird unabhängig von Wortgrenzen in kleine Schnipsel mit immer gleicher Länge zerlegt.
Beispielsweise bekommt man aus dem zwanzig Zeichen langen Text "Beispiel Spam E-Mail" und einer Schnipsel-Länge von vier die folgenden fünf "Tokens": "Beis", "piel", " Spa", "m E-" und "Mail".
Da die Wörter je nach Mail an verschiedenen Stellen im Text stehen, ist auch die Schnittstelle innerhalb der Wörter unterschiedlich, und man erhält viele verschiedene Teilwörter. Dadurch fallen einzelne Veränderungen in einem Wort nicht so sehr ins Gewicht. Das Wort kann immer noch erkannt werden.
Wirft man dem bogofilter nun eine Reihe von "guten" Mails und eine Reihe von "bösen" Mails vor, so setzt der Filter die einzelnen Schnipsel in Bezug zueinander und berechnet für jede Mail, ob sie eher wie eine böse Spam oder eine gute Ham aussieht. Mit jeder neuen Mail lernt der Spam Blocker dazu und wird von mal zu mal stärker.
Schließlich wird die Mail mit einem weiteren Header versehen z.B. "X-Bogosity: Spam, tests=bogofilter", anhand dessen wir mit procmail die Mail dann automatisch in den Junk-Folder verschieben oder gleich löschen können.
Da immer wieder die Frage aufkommt "Wieso verschiebt bogofilter die Mail nicht", hier nochmal etwas deutlicher: Bogofilter markiert die Mails lediglich, das Verschieben muss ein nachgelagerter Prozess - in unserem Fall procmail - übernehmen.
Voraussetzungen
- IMAP Konto: Im Prinzip lässt sich bogofilter sowohl auf POP3 als auch auf IMAP Konten anwenden, ich beschränke mich hier der Einfachheit halber auf IMAP im "Maildir-Format".
- procmail: Zum "Weg-Sortieren" setze ich voraus, dass procmail bereits funktionsfähig installiert ist.
- cron: In regelmäßigen Abständen muss der Lernprozess angestoßen werden, cron ist auf jedem System bereits vorinstalliert
IMAP Konto
Der IMAP Account sollte auf "Maildir" basieren, d.h. jede Mail wird als einzelne Datei in Unterverzeichnissen abgelegt. Im Prinzip funktioniert es mit einer Änderung an der .procmailrc auch mit dem "mbox-Format", aber Maildir ist ohnehin die bessere Wahl ;-)
Wir benötigen drei spezialisierte Ordner:
- Spam
- Ham
- Junk
In den Ordner "Spam" verschieben wir von Hand die Mails, die noch nicht automatisch als Spam erkannt wurden (false negative).
Im Ordner "Junk" landen automatisch die erkannten Spam Mails.
In den Ordner "Ham" verschieben wir von Hand die Mails aus dem Ordner "Junk", die fälschlicherweise als Spam erkannt wurden (false positive).
/usr/local/bin/antispam.sh
#!/bin/bash
# Verwendung auf eigene Gefahr!
bogofilter=/usr/bin/bogofilter
procmail=/usr/bin/procmail
for mail_file in $(find ~/Maildir/.Ham/{cur,new,tmp} -type f)
do
${bogofilter} -Sn < "${mail_file}" &&
${procmail} < "${mail_file}" &&
rm -f "${mail_file}"
done
for mail_file in $(find ~/Maildir/.Spam/{cur,new,tmp} -type f)
do
${bogofilter} -Ns < "${mail_file}" &&
rm -f "${mail_file}"
done
~/.procmailrc (bzw. /etc/procmailrc für systemweite Filterregeln)
#
# Verwendung auf eigene Gefahr!
#
:0fw
| bogofilter -u -e -p
:0 H:
* ^X-Bogosity: Spam, tests=bogofilter
$HOME/Maildir/.Junk/new
Crontab
Mit "crontab -e" kann ein Benutzer seine private crontab bearbeiten.
Wir benötigen folgende Zeile:
*/5 * * * * /usr/local/bin/antispam.sh