Dies ist die archivierte Version des Blogs vom 05.01.2017. Aktuelle Beiträge findest du unter thomas-leister.de
 

Möglicherweise ist die Erkennungsrate von Spamassassin zu Beginn nicht zufriedenstellend und einige Spammails werden nicht erkannt, obwohl Spamassassin aktuell ist. Die Trefferquote kann verbessert werden, indem Spamassassin anhand bereits vorhandener Mails „trainiert“ wird. Der Software werden sowohl Spammails als auch normale, erwünschte Mails zur Analyse übergeben. Spamassassin lernt so mit der Zeit, wie eine Spammail aussieht und welche E-Mails erwünscht sind.

Für das Training wird das Tool „sa-learn“ genutzt, welches mit Spamassassin mitgeliefert wird. Ich gehe im Folgenden davon aus, dass Spamassassin in Kombination mit dem Amavis Filterframework genutzt wird. Unter /root/scripts wird das Bash-Skript „sa-learn.sh“ angelegt, das diesen Inhalt hat:

#!/bin/bash

sa-learn --spam --progress --username amavis --dbpath /var/lib/amavis/.spamassassin /var/vmail/mailboxes/*/*/mail/Spam/cur/*
sa-learn --ham --progress --username amavis --dbpath /var/lib/amavis/.spamassassin /var/vmail/mailboxes/*/*/mail/Sent/cur/*

Die erste Zeile führt dazu, dass Spamassassin die E-Mails z.B. in /var/vmail/mailboxes/domain.tld/user/mail/Spam/cur als Spam kennen lernt (–spam). In der zweiten Zeile werden mit „–ham“ harmlose, selbst verfasste E-Mails kennen gelernt. Die *-Zeichen im Pfad bewirken, dass alle Unterverzeichnisse durchlaufen werden (also alle Mailboxen aller Domains).

Das Script wird mittels

# chmod u+x /root/scripts/sa-learn.sh

ausführbar gemacht und via

# crontab -e

in die Cronjobs des root-Users aufgenommen und täglich ausgeführt:

### Daily Spamassassin learning
@daily /root/scripts/sa-care.sh

Wunder sollte man von der Lernprozedur nicht erwarten, doch in Einzelfällen (und bei dauerhafter Spambelastung mit einem bestimmten E-Mail-Typ) kann man damit einen gewissen Effekt erreichen.


Post published on 3. Juli 2014 | Last updated on 18. April 2016
Tags:               

Diesen Blog unterstützen

Wenn Dir der Beitrag gefallen hat, freue ich mich über einen kleinen Obolus :-) Bitcoin QR Code

PayPal-Seite: https://www.paypal.me/ThomasLeister
Meine Bitcoin-Adresse: 15z8 QkNi dHsx q9WW d8nx W9XU hsdf Qe5B 4s

Siehe auch: Unterstützung

Informationen zum Autor

Thomas Leister

Geb. 1995, Kurzhaar-Metaller, Geek und Blogger. Nutzt seit Anfang 2013 ausschließlich Linux auf Desktop und Servern. Student der Automobilinformatik an der Hochschule für angewandte Wissenschaften in Landshut.

29 thoughts on “Spamassassin trainieren / Erkennungsrate verbessern

  • „Damit das Hand automatisch in festen Zeitintervallen ausgeführt wird“
    ^ da ist glaube ich was falsch

  • Das ist eine gute Idee mit dem Script. Allerdings sollte man es noch erweitern und die gelernten Mails löschen. Wenn man den Ordner SENT verwendet ist es natürlich schlecht. Es kommt aber öfters vor, dass eine Mail als Spam gekennzeichnet wird, welche kein Spam ist. Daher lasse ich zwei Ordner von Dovecot anlegen (LearnSpam und LearnNoSpam). Das script läuft über diese beiden Ordner. Der User kopiert seine Mails entsprechend dort rein.

    Gruß
    Steffen

  • Hallo, Thomas,
    sorry, aber wie du deine for-Schleifen benutzt, ist falsch. Verbring einfach ein wenig Zeit in #bash auf Freenode ;-)

    TL;DR: Ersetze for USER in $(ls); do durch for USER in *; do und alles wird gut :)

    Mitunter willst du dein Script auch nicht für alle ausführbar machen (chmod +x sa-practise.shchmod u+x sa-practise.sh?)

    • Hi,

      was Bash Script angeht, bin ich relativ unerfahren. Danke für deine Hinweise!
      Wer das Script ausführt ist eigentlich recht egal… aber nur dem Besitzer die Rechte zu geben ist sicherlich die sauberere Lösung ;)

      LG Thomas

  • Ich möchte mich nochmal für die tollen Tutorials bedanken. Ich habe bis jetzt alles von Anfang bis Ende mit den Tutorials von hier durchgearbeitet. Nun möchte ich den Spamassassin trainieren, aber komme nicht weiter.
    Bei mir sind im Ordner ../mail/ kein „Spam“ oder „cur“ -Ordner. Es gibt verschiedene Dateien die Spam, Entwurf, Gesendet usw. heißen. Deshalb weiss ich nicht wie ich hier weitermachen soll.
    Ist mit folgendem Pfad sa-learn –ham /pfad/zur/Mailbox/Sent die Datei Gesendet im Ordner ../mail/ gemeint?
    Ist dieser Vorgang für jeden Besitzer einer Mailadresse separat zu machen oder braucht man das nur einmal für alle User im System zu machen?

    Ich würde mich über jede Hilfe sehr freuen.

    • Hi, die „Spam“ und „Cur“ Ordner sollten beim ersten Login des Benutzers angelegt werden. Bei „sa-learn“ ist der Pfad zum gesendet Ordner gemeint – ganz egal wie der heißt ;) Das kann je nach verwendetem E-Mail Client unterschiedlich sein. Der Vorgang muss für jede Mailbox (also jeden User) extra durchgeführt werden. Deshalb gibt es am Ende des Beitrags ein Script, das alle Mailboxen automatisch durchläuft und die beiden sa-Befehle ausführt.

      LG Thomas

  • alles schön und gut, aber bei mir ist anscheinend einiges schief gegangen. Wenn ich einen neuen Benutzer zum Datenbank hinzufüge und mich mit diesen einlogge, habe ich im Webmail nur ein Spam- und Inbox-Ordner.
    Und wenn ich über die Konsole mit „ls -l“-Befehl ins /var/mail/domain/username/mail reinschaue, dann sehe ich folgenden Eintrag:
    -rw-rw—- 1 vmail vmail 4449 Okt 20 18:36 Spam

    Ich schaue mir die ganze Tutorials nochmal an, war so glücklich, dass alle Fehlerfrei lief, schaade.

    • Okay, die Ordner „Gesendet“ und „Entwürfe“ entstehen nach dem ersten Entwurf. Aber trotzdem sind diese eben über die Konsole gesehen immer noch keine Ordner und es gibt keinen Ordner Namens „cur“.

      • Ich habe statt den Ordner „cur“ einfach den „Gesendet“ Ordner genommen. Spam ist bei mir zwar eine komische Datei, aber beim Ausführen des Befehls gab es keine Fehlermeldung. Deshalb habe ich den Rest mit so ins Cronjob übernommen.
        Seltsam ist, dass die Mailadressen, die ich im spam-Ordner hatte und von denen eigentlich gelernt wurde, dass sie Spam sind, mir immer noch Mails zusenden könnten und diese in Inbox landen.
        Liegt das vielleicht an meine komischen Spam-dateien? Welches Merkmal merkt sich der Spamassassin, damit er das nächstes Mal die Spam aussortieren kann, tut er das Anhand der Mailadressen oder doch etwas anderes?
        Hoffentlich war das meine letzte Frage und nochmals vielen Dank für all die schönen Anleitungen.

        • Hi,

          Spamassassin berechnet aus mehreren Parametern einen sog. Spam-Score. Kontrolliert wird der absendende Server und vor allem der Inhalt einer E-Mail. Es wird nach bestimmten Phrasen gesucht, die in Spammails vorkommen. Möglicherweise braucht es etwas Zeit (und einige korrekt markierte / verschobene Mails) bis der bayessche Filter Spam zuverlässig erkennt.

          LG Thomas

  • Also das Skript an sich funktioniert.
    Aber wenn ich über meine Roundcube-Installation die Mails in den Spam-Ordner lege, werden diese nicht unter …/domain/user/mail/spam abgelegt, sondern unter …/domain/user/mail/.spam

  • Auch wenn der Beitrag schon einige Montate alt ist, das Thema stand lange auf meiner Todo Liste und kann jetzt abgehakt werden, vielen Dank!

    Weißt du, wie sich das manuelle oder per Cron gesteuerte Aufrufen von sa-learn und die Spamassassin-Einstellung „bayes_auto_learn“ zusammen verhalten? Ich würde denken, dass es sicherlicht nicht schadet, zusätzlich deinen Rat zu befolgen und sa-learn einen Ordner mit (hoffentlich) 100% Spam und einen mit 100% nicht-Spam zu geben, aber hat damit schon jemand positive oder negative Erfahrungen gemacht?

  • Das Skript in /etc/cron.weekly darf keine File Extension haben, da run-parts in diesem Ordner nur Skripte ohne File Extension ausführt (also ohne .sh).
    Das Skript in /etc/cron.weekly muss also sa-practise heißen, und nicht sa-practise.sh

  • Hey danke für das Script, habe es noch etwas angepasst, damit ich nicht alle Postfächer einer Domain sondern nur einzelne Postfächer berücksichtige:

    #!/bin/sh

    MAILS="mustermann@domain.de musterfrau@domain.de musterkind@domain.de"

    for MAILS in $MAILS; do
    ### durchsucht z.b. /var/qmail/mailnames/domain.de/mustermann/Maildir/.Junk/cur/ je nach Email Adresse ###
    sa-learn --spam --progress "/var/qmail/mailnames/${MAILS#*@}/${MAILS%@*}/Maildir/.Junk/cur/"
    sa-learn --ham --progress "/var/qmail/mailnames/${MAILS#*@}/${MAILS%@*}/Maildir/cur/"
    done

    Läuft super auf CentOS 6.x mit Plesk 12.x

    Nun bekomme ich aber täglich eine Mail von Anacron (hab das File in cron.daily gepackt) mit dem Ergebniss:

    /etc/cron.daily/sa-learn.sh:

    100% Completed 23.23 msgs/sec in 00m00s
    Learned tokens from 3 message(s) (3 message(s) examined)
    ...............
    95% Completed 25.45 msgs/sec in 00m00s
    Learned tokens from 22 message(s) (22 message(s) examined)
    Learned tokens from 0 message(s) (0 message(s) examined)

    85% Completed 21.67 msgs/sec in 00m00s
    Learned tokens from 6 message(s) (6 message(s) examined)
    Learned tokens from 0 message(s) (0 message(s) examined)
    .......................................................................................................................................................................
    91% Completed 16.76 msgs/sec in 00m09s
    Learned tokens from 167 message(s) (167 message(s) examined)

    100% Completed 121.68 msgs/sec in 00m00s
    Learned tokens from 2 message(s) (2 message(s) examined)

    100% Completed 18.64 msgs/sec in 00m00s
    Learned tokens from 7 message(s) (7 message(s) examined)

    Weiß jemand wie ich diese Mails deaktivieren kann?

  • Hallo Steven,

    einfach in den Cronjob in die oberste Zeile ein:

    MAILTO=““

    setzen.

  • Moin Thomas,

    Wie kann ich spamassassin die gelernten wieder verlernen lassen. Hab aus versehen eine falsche Mail im Spam gehabt?

    Cheers Blake

  • Hi Thomas,

    vielen Dank auch wieder für dieses HowTo.
    Ich habe bei mir zwei Ordner erstellt: SpamToLearn und SpamFalse in die ich die jeweiligen Mails reinschiebe. Diese beiden Ordner möchte ich für sa-learn verwenden.
    Was muss ich denn in Deinem Script ändern, damit die erlernten Mails nach einem sa-learn durchjlauf aus den jeweilgen Ordner lösche?

    Danke Dir. :-)

    • Nach dem letzten sa-learn Kommando (und vor dem „done“) führst du einfach noch diese zwei rm-Kommandos aus:

      rm -r /var/vmail/$DOMAIN/*/mail/SpamToLearn/*
      rm -r /var/vmail/$DOMAIN/*/mail/SpamFalse/*

      Hab das nicht getestet – ggf musst du den Pfad anpassen (je nachdem, wo sich die beiden Ordner befinden). Dann ist noch darauf zu achten, dass der User, unter dem du das Script ausführst, ausreichend Rechte zum Löschen hat. Also am besten vmail oder root nehmen.

      LG Thomas

  • Hallo Thomas,

    vielen Dank für das Tutorial. :-)
    Kann ich denn in irgendeinem Logfile nachsehen, ob per Cron das sa-learn erfolgreich ausgeführt wurde und ob Regeln eingelesen wurden bzw. neue Spamregeln für Spaassassin erstellt wurden?

  • Hallo Thomas,

    danke für Deine tollen Tutorials!

    Ich habe amavis und spamassassin nach Deiner Anleitung installiert und konfiguriert: Postfix: Amavis Spamfilter mit Spamassassin und Sieve

    In dieser Config stimmt der Teil imho nicht bzw. bringt nichts:

    (Wenn ihr Spamassassin zusammen mit Amavis verwendet, solltet ihr nach dem „–spam“ noch ein „–username=amavis“ anhängen, damit die Trainingsdaten an der richtigen Stelle gespeichert werden und dort von Amavis verwendet werden können! Das gilt für alle sa-learn-Befehle)

    Stattdessen ist folgender Parameter notwendig: –dbpath /var/lib/amavis/.spamassassin

    So scheint es bei mir jedenfalls zu funktionieren mit dem Lernen!

  • gilt das „–username=amavis“ auch für das skript?

    also muss es :

    #!/bin/sh

    DOMAINS=“domain1 domain2 domain3″

    for DOMAIN in $DOMAINS; do
    echo „Entered Domain $DOMAIN“
    ### Learn Spam ###
    echo „Learning SPAM“
    sa-learn –spam –username=amavis –progress „/var/vmail/$DOMAIN/*/mail/Spam/“
    ### Learn Ham ###
    echo „Learning HAM“
    sa-learn –ham –username=amavis –progress „/var/vmail/$DOMAIN/*/mail/cur/“
    done
    service spamassassin reload

    mit einem oder mit zwei „-“ ?

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.