Benutzer-Werkzeuge

Webseiten-Werkzeuge


Seitenleiste

Was fehlt?

Es liegt in der Natur der Sache: Ein Wiki ist niemals fertig. Wir geben uns große Mühe, mit der Entwicklung Schritt zu halten; lassen Supportanfragen direkt in neue Artikel einfließen … aber auch wir sind nicht perfekt. Wenn du hier nicht fündig wirst: Nicht schmollen - Bescheid sagen! Unter hallo@uberspace.de steht dir unser Team gerne bereit. Hand drauf!

mail:dspam

DSPAM

DSPAM ist ein sehr vielseitiges Programmpaket zur Spamabwehr, das auf dem Prinzip eines Bayesschen Filter beruht (ein statistisches Filter aufbauend auf dem Bayesschen Wahrscheinlichkeitsbegriff). Dabei werden Mails nicht im Ganzen bewertet, sondern in Einzelteile zerlegt (Token genannt, z.B. Header-Elemente oder einzelne Wörter aus dem Body), die einzeln bewertet werden und deren Bewertung dann für die letztliche Beurteilung herangezogen werden. DSPAM kombiniert dies mit einer Datenbank und ist dadurch lernfähig, in der Lage sich sehr genau auf seine Nutzer einzustellen, auch über viele Jahre hinweg weiter zu lernen und sich an Veränderungen sowohl des Spams (z.B. wenn ein neues Potenzmittel auf den Markt kommt) als auch der User (z.B. wenn ein User eine neue Sprache lernt und darin zu kommunizieren beginnt) anzupassen.

Begriffsklärung

Bevor wir uns im weiteren darauf stützen, eine kleine Begriffsklärung.

Spam

Unerwünschte Mails. Den Begriff hat bestimmt jede(r) schonmal gehört. Der Name geht zurück auf ein Dosenfleischprodukt, das viele Leute nicht mögen und das in Deutschland auch als Frühstücksfleisch bekannt ist. Es ist ein Kunstwort das sich aus Spiced, chopped Pork and hAM (gewürzter und gehackter Schinken) zusammen setzt. Die britische Komikergruppe Monty Python machte in den 1970er Jahren einen sehr einprägsamen Sketch über Spam (das Dosenfleisch) in dem das Wort Spam über 132 mal vorkommt, unter anderem in dem verzweifelten Ausruf „I don't want any Spam! I DON'T LIKE SPAM!!!“. Der Legende nach geht der Begriff Spam (für unerwünschte Mails) auf eben diesen Sketch über Spam (das Dosenfleisch) zurück, weil Spam (die unerwünschten Mails) die Angewohnheit haben in unverhältnismäßig großen Mengen einzutreffen und immer unbeliebt zu sein.

Ham

Eigentlich: Schinken. – Nachdem der Begriff Spam für unerwünschte Mails aufgekommen war, wurde in Analogie dazu auch der Begriff Ham für erwünschte Mails eingeführt. Da dieser Begriff im deutschen Sprachraum nicht so häufig ist, wollten wir ihn hier einmal erläutern, bevor wir ihn im folgenden verwenden.

Funktionsweise

Wie schon erwähnt betrachtet DSPAM Mails nicht im Ganzen, sondern zerlegt sie in viele Einzelteile (Token), die es sich erstmal alle merkt. Am Anfang seiner Tätigkeit kann DSPAM Spam und Ham nicht unterscheiden und stellt daher beides zu. User müssen dann DSPAM mitteilen, welche Mails sie als Spam oder Ham bewerten (beides ist gleichermaßen wichtig) und so lernt DSPAM mit der Zeit, welche Token für die Spam-Beurteilung relevant sind und welche nicht (z.B. sind Wörter wie „und, oder, der, die, das“ usw. eher irrelevant, eher verdächtige Schlüsselwörter wie „Viagra“ und eher unverdächte wie „Geburtstagsfeier“ hingegen besonders interessant) und wie diese Token zu bewerten sind. Aus diesen Informationen baut sich DSPAM mit der Zeit eine Datenbank von interessanten Token und ihrer Bewertung durch die User auf, anhand derer es dann mit zunehmender Genauigkeit Mails beurteilen kann. Mails werden dann also weiterhin in Tokens zerlegt, darunter werden die interessanten Token für die Spam-Bewertung herangezogen und aus dem Gesamtbild das sich daraus ergibt bildet DSPAM sich dann ein Urteil über die jeweilige Mail.

Darüber hinaus wendet DSPAM noch ein paar andere Tricks an, um sich die Arbeit zu erleichtern und für die User zuverlässiger zu funktionieren. So führt es z.B. temporäre Whitelisten, auf denen es Absender einträgt die User immer wieder als Ham-Absender bewertet haben (aber sobald eine Mail eines solchen Absenders als Spam bewertet wird, wird derjenige von der Whitelist erstmal wieder gestrichen).

Die Kombination all dieser Mechanismen machen DSPAM zu einem sehr leistungsfähigen Spamfilter. Das kommt insbesondere Usern zugute die in Mails häufig mit Begriffen hantieren, die bei oberflächlicher Betrachtung auf Spam hinweisen könnten, etwa Mitarbeiter von pharmazeutischen Unternehmen, Personen die auch in Fremdsprachen oder gar fremden Schriftsystemen per Mail kommunizieren usw. DSPAM hat – richtig angelernt – normalerweise keine Grenzfälle, an denen seine Beurteilung grundsätzlich versagt, sondern erzielt für alle User gute Ergebnisse.

Um das zu schaffen, muss DSPAM aber auch angelernt werden, d.h. es benötigt eine ganze Reihe von Mails und eine Beurteilung durch die User, um sich auf deren Anforderungen einzustellen. Als Faustregel gilt hier: nach ca. 100 Mails beginnt DSPAM halbwegs sinnvoll zu filtern, nach etwa 2.500 Mails sollte es allmählich seine maximale Effizienz erreichen. Hierbei ist es überaus wichtig, DSPAM sowohl mit Positiv- als auch mit Negativbeispielen zu füttern (und zwar gleichermaßen), DSPAM muss unterscheiden lernen und daher beide Seiten kennen.

Unser Beispiel-Setup

DSPAM unterstützt sehr viele unterschiedliche Betriebsmodi und hat neben der Spamabwehr auch noch einige andere Funktionen (wie gesagt: es ist sehr vielseitig), wir bevorzugen die Nutzung als einfachen Filter im Zusammenspiel mit maildrop. Dieser Modus hat den Vorteil, dass DSPAM so nicht nur für einzelne Useraccounts, sondern sogar für einzelne Mailboxen an- und ausgeschaltet werden kann. (Wobei hierzu gesagt werden muss, dass DSPAM trotzdem pro Useraccount eine gemeinsame Datenbank für alle Mailboxen verwaltet und nicht einzelne Datenbanken pro Mailbox.) Die erweiterten Funktionen von DSPAM, wie etwa die zur Generierung von Statistiken und hübschen Graphen, nutzen wir nicht und werden auch im folgenden nicht erläutert.

Die erwähnte Datenbank die DSPAM sich anlegt legt es in Eurem Home-Verzeichnis unter ~/.dspam/ ab. Es besteht prinzipiell auch die Möglichkeit diese Datenbank in MySQL, Sqlite oder PostgreSQL abzulegen, aber da dies weitere Schritte erfordert (und nicht unbedingt performanter ist), lassen wir das an dieser Stelle aus.

Damit die User nicht selbst auf der Kommandozeile DSPAM mit Mails zum Lernen füttern müssen, empfehlen wir im folgenden ein Setup das mit IMAP-Ordnern arbeitet und Usern so ermöglicht auch über Mail-Clients mit DSPAM zu kommunizieren. (Das setzt natürlich voraus, dass die User IMAP nutzen, das im folgenden beschriebene Setup funktioniert mit POP3 nicht.)

Wir legen dazu folgende Ordnerstruktur an:

\
 \___ Inbox
  \
   \___ 0 Spamfilter
         \
          \___ als Ham lernen
           \
            \___ als Spam erkannt
             \
              \___ als Spam lernen

Die Namen machen eigentlich schon deutlich, worum es hier geht.

  • DSPAM legt alles was es für Spam hält im Ordner als Spam erkannt ab (der ein Unterordner von 0 Spamfilter ist, die Null haben wir dem Namen vorangetellt, damit der Ordner in einer Ordnerliste möglichst weit oben steht), es löscht Spam nicht, lehnt ihn auch nicht ab und lässt ihn nicht bouncen. User sollten regelmäßig in diesen Ordner schauen, ob aus Versehen Ham drin gelandet ist und um alten Spam zu löschen.
  • Alles was es für Ham hält, stellt DSPAM ganz normal in den Posteingang bzw. die Inbox zu.

Die User sortieren Mails nach dem Aschenputtel-Prinzip „die Guten ins Töpfchen, die schlechten ins Kröpfchen“:

  • Mails welche von Usern in den Ordner als Spam lernen gelegt werden, wird DSPAM analysieren und anschließend löschen.
  • Mails welche von Usern in den Ordner als Ham lernen gelegt werden, wird DSPAM analysieren und anschließend löschen.

Spam der im Posteingang gelandet ist, kann also einfach in den Ordner als Spam lernen verschoben und anschließend vergessen werden, DSPAM kümmerst sich darum.

Ham der im Ordner als Spam erkannt gelandet ist, sollten sich die User zunächst in den Posteingang verschieben und anschließend in den Ordner als Ham lernen kopieren (das Kopieren ist an der Stelle wichtig, denn DSPAM wird diese Kopie nach seiner Analyse aus dem Ordner als Ham lernen löschen).

DSPAM sagen was es falsch und richtig gemacht hat

Wie bereits erwähnt muss DSPAM erstmal lernen Ham von Spam zu unterscheiden und es benötigt auch später immer wieder mal Feedback, ob es mit seinen Bewertungen noch richtig liegt, denn Spam verändert sich mit der Zeit und DSPAM ist daher auf lebenslanges Lernen angelegt. Um das Unterrichten von DSPAM möglichst leicht zu machen haben wir bereits im vorigen Schritt ein paar zusätzliche Ordner angelegt, nämlich die Ordner „als Spam lernen“ und „als Ham lernen“, die beide wie auch schon „als Spam erkannt“ Unterordner von „0 Spamfilter“ sind.

Nun legen wir einen runwhen-Job an, der stündlich nach solchen Ordnern sucht und das was er dort findet DSPAM nochmal vorlegt. Führe dazu bitte diese Befehle einzeln auf der Kommandozeile aus und beobachte, ob sie erfolgreich ausgeführt werden (falls nicht, melde Dich bei uns):

[julia@amnesia ~]$ test -d ~/service || uberspace-setup-svscan
[julia@amnesia ~]$ runwhen-conf ~/etc/dspam-learn "/usr/local/bin/dspam-learn"
[julia@amnesia ~]$ sed -i -e "s/^RUNWHEN=.*/RUNWHEN=\",M=`awk 'BEGIN { srand(); printf("%d\n",rand()*60) }'`\"/" ~/etc/dspam-learn/run
[julia@amnesia ~]$ ln -s ~/etc/dspam-learn ~/service

Der erste Befehl prüft ob Du schon ein ~/service-Verzeichnis hast und ruft uberspace-setup-svscan auf wenn nicht. Der zweite legt einen runwhen-Job an der das Skript dspam-learn ausführt. Der dritte stellt ein, dass dieses Skript einmal stündlich läuft, wobei die Minute in der es laufen wird hier einmalig zufällig festgelegt wird. Der vierte Befehl schließlich aktiviert diesen runwhen-Job.

dspam-learn ist selbstverständlich Free and Open Source Software. Es steht unter der GPL, Du kannst es gerne studieren, kopieren, verändern und zu den gleichen Konditionen weitergeben.

DSPAM fit halten

DSPAM sammelt mit der Zeit einiges an Mailsignaturen und Tokens an und dies lässt seinen Datenbestand in ~/.dspam/ früher oder später erheblich anschwellen. Für all diejenigen die DSPAM mit einem MySQL- oder PostgreSQL-Storage-Backend verwenden, gibt es um dem entgegenzuwirken das Tool dspam_clean. Für diejenigen die das Hash-Storage-Backend verwenden (wie wir es in dieser Anleitung zeigen) funktioniert dieses Tool aber leider nicht. Statt dessen wird in der Dokumentation empfohlen regelmäßig alte Signaturen wegzuräumen und das Tools cssclean anzuwenden. Um das etwas zu erleichtern haben wir das Skript dspam_clean_hashdb geschrieben, das Du einmal täglich mit runwhen ausführen kannst.

Dieses Skript erledigt beide Schritte für Dich: Zuerst ruft es find auf und entfernt damit alle Signatur-Dateien die älter als 14 Tage sind. (Diese Dateien braucht DSPAM nur dann, wenn Du ihm Mails zum Umlernen vorlegst – 14 Tage nach Empfang einer Mail ist das eh nicht mehr sinnvoll.) Anschließend ruft es cssclean auf. (cssclean arbeitet sich durch Deine Token-Sammlung und verpasst allen Token die noch keinen haben einen Zähler, bei allen die schon einen haben zählt es den Zähler bei jeden Durchgang eins hoch. Wenn DSPAM nun Mails beurteilt und dabei bestimmte Token verwendet, dann setzt es die Zähler dieser Token auf Null zurück. So bleiben die Zähler der wirklich nützlichen Token stets relativ niedrig, während die Zähler aller eher unnützen Token unaufhörlich ansteigen – bis cssclean irgendwann anhand des Zählerstandes entscheidet diese Token ganz zu löschen.) Alles zusammen sollte Deine DSPAM-Installation schlank und effizient halten.

[julia@amnesia ~]$ test -d ~/service || uberspace-setup-svscan
[julia@amnesia ~]$ runwhen-conf ~/etc/dspam_clean_hashdb "/usr/local/bin/dspam_clean_hashdb"
[julia@amnesia ~]$ sed -i -e "s/^RUNWHEN=.*/RUNWHEN=\",H=`awk 'BEGIN { srand(); printf("%d\n",rand()*24) }'`\"/" ~/etc/dspam_clean_hashdb/run
[julia@amnesia ~]$ ln -s ~/etc/dspam_clean_hashdb ~/service
dspam_clean_hashdb ist selbstverständlich Free and Open Source Software. Es steht unter der GPL, Du kannst es gerne studieren, kopieren, verändern und zu den gleichen Konditionen weitergeben.

für Bastlerinnen und Bastler

Grundsätzlich kannst Du mit DSPAM natürlich noch viel mehr machen.

Eine Idee wäre zum Beispiel die Mails die über den Ordner als Ham lernen DSPAM nochmal vorgelegt werden nicht zu löschen, sondern in einen Archiv-Ordner zu legen, dann könnte der Schritt mit dem vorherigen Kopieren der Mails entfallen. Dafür müsstest Du Dir aber ein eigenes dspam-learn schreiben, bzw. von unserem Ableiten (was Du gerne tun kannst, deswegen steht es unter der GPL).

DSPAM bietet auch noch umfangreiche Statistik-Funktionen, die Du natürlich auch gerne nutzen kannst.

weiteres Anlernen

Hin und wieder werden wir gefragt, ob lernfähigen Spamfiltern nicht auch Sammlungen von Spam vorgelegt werden können um sie zu trainieren. Wieviel das bringt hängt sehr vom Spamfilter ab. Bei DSPAM geht das in der Tat, es ist dabei aber äußerst wichtig, dass DSPAM sowohl Spam als auch Ham vorgelegt bekommt. Außerdem nützt dieses Trainieren nur dann etwas, wenn es sich auch tatsächlich um Mails handelt die die betreffenden User erhalten haben. Terabyte-große Spamsammlungen aus dem Internet nützen nichts. (Mal abgesehen davon, dass unsere Server und damit wir das auch nicht so toll fänden.)

Unser oben beschriebenes Setup mit den Ordnern eignet sich aber für solches Trainieren nicht, da wir in unserem Skript dspam-learn davon ausgehen, dass in den Ordnern Mails landen, die DSPAM bereits einmal gesehen hat und nun nochmal vorgelegt bekommt, weil es lernen soll wie die User diese bewerten. In unserem Setup kann DSPAM also nur aus Mails lernen, die es schon einmal beurteilt hat. Die beiden DSPAM-Aufrufe aus dem Skript sehen dann auch so aus:

[julia@amnesia ~]$ nice -n 19 ionice -c3 /package/host/localhost/dspam/bin/dspam --class=spam --source=error --stdout < "${file}";
[julia@amnesia ~]$ nice -n 19 ionice -c3 /package/host/localhost/dspam/bin/dspam --class=innocent --source=error --stdout < "${file}";

Um nun DSPAM mit Mails anzulernen die es noch nicht gesehen hat, muss DSPAM von Hand aufgerufen werden und mit den jeweiligen Mails gefüttert werden, etwa so:

[julia@amnesia ~]$ nice -n 19 ionice -c3 /package/host/localhost/dspam/bin/dspam --class=spam --source=inoculation --stdout < datei-mit-spammails;
[julia@amnesia ~]$ nice -n 19 ionice -c3 /package/host/localhost/dspam/bin/dspam --class=innocent --source=corpus --stdout < datei-mit-hammails;

Relevant ist hierbei vor allem die source-Angabe, die DSPAM zu verstehen gibt, worum es sich handelt.

Aufgepasst: ionice -c3 funktioniert unter CentOS 5 noch nicht, da musst Du das entweder weglassen oder ionice -c2 -n7 nehmen.

Debugging

Falls Du nachvollziehen willst was DSPAM tut oder einem Fehler auf der Spur bist, hast du bei DSPAM verschiedene Möglichkeiten:

  • DSPAM schreibt ein Log in ~/.dspam/$USER.log.
  • Du kannst unser Skript dspam-learn manuell ausführen und seine Tätigkeit beobachten (z.B. mit strace). Es hat einen -v-Schalter, der es veranlasst sich verbose zu verhalten, also geschwätzig zu sein. Außerdem hat es einen -n-Schalter der es in einen dry run mode versetzt bei dem es nichts ändert und nur anzeigt, was es tun würde.
  • Gleiches gilt selbstverständlich auch für dspam_clean_hashdb.
  • Sollte Dein Problem nicht bei DSPAM liegen sondern bei Maildrop, schau Dich mal auf unserer Maildrop-Seite um.

Außerdem schreibt DSPAM Statistiken, die du mit …

[julia@amnesia ~]$ /package/host/localhost/dspam/bin/dspam_stats $USER
julia          TP:  6997 TN: 13842 FP:   431 FN:  1454 SC:     0 NC:     0

… abrufen kannst.

mail/dspam.txt · Zuletzt geändert: 2014/10/29 08:14 von uber