Spamassassin-Traning mit Dovecot's IMAPSieve-Plugin schlägt fehl

Debian macht sich hervorragend als Web- und Mailserver. Schau auch in den " Tipps und Tricks"-Bereich.
Antworten
derlym
Beiträge: 27
Registriert: 17.11.2006 23:08:53

Spamassassin-Traning mit Dovecot's IMAPSieve-Plugin schlägt fehl

Beitrag von derlym » 31.10.2018 13:06:30

Hallo zusammen,

für die Spamabwehr nutze ich auf meinem Mailserver Spamassassin (mit MySQL-Backend) als Postfix-Milter. Damit Nutzer den Filter selbstständig trainieren können, ist sa-learn über Dovecots IMAPSieve-Plugin angebunden. Meine Konfiguration entspricht soweit der Beispielkonfiguration aus dem Dovecot-Wiki.

Auf den ersten Blick scheint es keine Probleme zu geben: Beim Verschieben einer Mail in den Spam-Ordner wird das entsprechende Sieve-Skript aufgerufen, dieses ruft erfolgreich das Shellscript auf und dieses wiederum überreicht die Mail an sa-learn. Nun der Haken: Es sieht so aus, als würde Spamassassin die gelernten Token nicht speichern. Aufgefallen ist es dadurch, dass Spamassassin immer wieder dieselben Spammails durchlässt, obwohl diese bereits mehrfach als Spam markiert wurden. Das Problem lässt sich verifizieren, indem eine Mail, die durch den Nutzer in das Spam-Verzeichnis verschoben wurde (und somit bereits bekannt sein sollte), erneut manuell über die Shell an sa-learn übergeben wird. Das Ergebnis des Shellaufrufs ist wider Erwarten:

Code: Alles auswählen

Learned tokens from 1 message(s) (1 message(s) examined)


Zu Debug-Zwecken habe ich das Shellscript angepasst:

Code: Alles auswählen

#!/bin/sh

curUser=$(whoami)
user=${1}
mail="$(cat -)"

result=`echo "$mail" | /usr/bin/sa-learn -u $user -D --spam 2>&1`

echo "curUser: $curUser\nResult: $result\nUser: $user\nNachricht:\n\n$mail" | sendmail root
Ergebnis: Dovecot übermittelt die zu lernende Mail korrekt über STDIN. Als Parameter ${1} ist der Mailempfänger gesetzt. Aufgerufen wird das Script über den Kontext des Nutzers "vmail". sa-learn liest die Mail offenbar auch erfolgreich ein:

Code: Alles auswählen

...
Oct 31 11:34:56.585 [2521] dbg: bayes: baa517a4b89f38e7a73491cdae87643ef0e1d915@sa_generated already learnt as opposite, forgetting first
Oct 31 11:34:56.585 [2521] dbg: plugin: Mail::SpamAssassin::Plugin::Bayes=HASH(0x561800fd0240) implements 'forget_message', priority 0
Oct 31 11:34:56.585 [2521] dbg: check: pms new, time limit in 299.984 s
Oct 31 11:34:56.702 [2521] dbg: bayes: tokenized body: 327 tokens
Oct 31 11:34:56.703 [2521] dbg: bayes: tokenized uri: 144 tokens
Oct 31 11:34:56.703 [2521] dbg: bayes: tokenized invisible: 0 tokens
Oct 31 11:34:56.704 [2521] dbg: bayes: tokenized header: 42 tokens
Oct 31 11:34:56.988 [2521] dbg: bayes: tokenized body: 327 tokens
Oct 31 11:34:56.989 [2521] dbg: bayes: tokenized uri: 144 tokens
Oct 31 11:34:56.989 [2521] dbg: bayes: tokenized invisible: 0 tokens
Oct 31 11:34:56.989 [2521] dbg: bayes: tokenized header: 42 tokens
Oct 31 11:34:57.077 [2521] dbg: bayes: seen (baa517a4b89f38e7a73491cdae87643ef0e1d915@sa_generated) put
Oct 31 11:34:57.105 [2521] dbg: bayes: learned 'baa517a4b89f38e7a73491cdae87643ef0e1d915@sa_generated', atime: 1540974680
Oct 31 11:34:57.106 [2521] dbg: plugin: Mail::SpamAssassin::Plugin::Bayes=HASH(0x561800fd0240) implements 'learner_close', priority 0
Learned tokens from 1 message(s) (1 message(s) examined)
Wird dieselbe Mail anschließend jedoch über die Shell erneut an sa-learn übergeben, so erscheint dort wieder die Ausgabe Learned tokens from 1 message(s) (1 message(s) examined). Umgekehrt zeigt ein "sa-learn --forget -u ...": Forgot tokens from 0 message(s) (1 message(s) examined)

Auffällig ist: Bei einer Einlieferung über Dovecot lautet die Rückgabe von sa-learn stets Learned tokens from 1 message(s) (1 message(s) examined) - auch, wenn die Mail bereits zuvor über die Shell gelernt wurde. Wird das Skript hingegen über die Shell aufgerufen, so ist die Ausgabe (nach dem initialen Lernen) richtigerweise Learned tokens from 0 message(s) (1 message(s) examined). Der Shell-Aufruf lautet wie folgt:

Code: Alles auswählen

cat spam.txt | sudo -H -u vmail bash -c '/usr/lib/dovecot/sieve/sa-learn-spam.sh anonym@empfaeng.er'
So langsam bin ich mit meinem Latein am Ende. Hat noch jemand eine Idee, wo das Problem liegen könnte?


Der Vollständigkeit halber hier noch die übrige Konfiguration:

Code: Alles auswählen

plugin {
  # https://wiki2.dovecot.org/HowTo/AntispamWithSieve
  sieve_plugins = sieve_imapsieve sieve_extprograms

  # From elsewhere to Spam folder
  imapsieve_mailbox1_name = Junk
  imapsieve_mailbox1_causes = COPY
  imapsieve_mailbox1_before = file:/usr/lib/dovecot/sieve/report-spam.sieve

  # From Spam folder to elsewhere
  imapsieve_mailbox2_name = *
  imapsieve_mailbox2_from = Junk
  imapsieve_mailbox2_causes = COPY
  imapsieve_mailbox2_before = file:/usr/lib/dovecot/sieve/report-ham.sieve

  sieve_pipe_bin_dir = /usr/lib/dovecot/sieve

  sieve_global_extensions = +vnd.dovecot.pipe +vnd.dovecot.environment
}
Sieve-Skript:

Code: Alles auswählen

require ["vnd.dovecot.pipe", "copy", "imapsieve", "environment", "variables"];

if environment :matches "imap.user" "*" {
  set "username" "${1}";
}

pipe :copy "sa-learn-spam.sh" [ "${username}" ];

Benutzeravatar
whisper
Beiträge: 3150
Registriert: 23.09.2002 14:32:21
Lizenz eigener Beiträge: GNU Free Documentation License
Kontaktdaten:

Re: Spamassassin-Traning mit Dovecot's IMAPSieve-Plugin schlägt fehl

Beitrag von whisper » 31.10.2018 19:01:55

Ich habe einen Debian Stretch Server mit ispconfig als Verwaltungsoberfläche.
Hier ist bayes auch integriert, aber nicht so wirklich arbeitsfähig.
Durch deinen Beitrag hier angeregt, habe ich mich damit mal beschäftigt.
Ich habe eine Möglichkeit gefunden händisch die SPAMs in den vmail Postfächern als SPAM zu lernen. Anstat immer die 40 example Spams, die seit Jahren nicht mehr wurden, (wie auch, wenn immer die examples verwendet wurden) sinds nun mehr als 400.
Ich habe das auf eine "dreckige" Art gemacht, die nicht empfehlenswert ist.
Wenn du Interesse hast, melde dich per PN. Öffentlich muss ich das erst mal verarbeiten und verbessern, ich will hier keine "dreckigen" Lösungen verbreiten, die dann von x-beliebigen "Admins" umgesetzt werden und auf lange Zeit unverändert bleiben....

Benutzeravatar
weshalb
Beiträge: 1265
Registriert: 16.05.2012 14:19:49

Re: Spamassassin-Traning mit Dovecot's IMAPSieve-Plugin schlägt fehl

Beitrag von weshalb » 01.11.2018 11:34:52

whisper hat geschrieben: ↑ zum Beitrag ↑
31.10.2018 19:01:55

Ich habe eine Möglichkeit gefunden händisch die SPAMs in den vmail Postfächern als SPAM zu lernen.
Wie meinst du das? Ich mache es so, dass es zwei globale Ordner gibt, die jeder MailUser sieht. Einmal Spamlearn und einmal Nospam.

Dort kann jeder selbst die Mails reinsortieren und einmal am Tag lerne ich über ein Script die Mails an und verschiebe sie gleichzeitig in jeweils einen Ornder außerhalb des Mailsystems.

Benutzeravatar
whisper
Beiträge: 3150
Registriert: 23.09.2002 14:32:21
Lizenz eigener Beiträge: GNU Free Documentation License
Kontaktdaten:

Re: Spamassassin-Traning mit Dovecot's IMAPSieve-Plugin schlägt fehl

Beitrag von whisper » 01.11.2018 12:14:21

weshalb hat geschrieben: ↑ zum Beitrag ↑
01.11.2018 11:34:52

Wie meinst du das? Ich mache es so, dass es zwei globale Ordner gibt, die jeder MailUser sieht. Einmal Spamlearn und einmal Nospam.

Dort kann jeder selbst die Mails reinsortieren und einmal am Tag lerne ich über ein Script die Mails an und verschiebe sie gleichzeitig in jeweils einen Ornder außerhalb des Mailsystems.
Globale Ordner? !! Hhm, das ich da noch nicht drauf gekommen bin... :roll: 8)

Benutzeravatar
weshalb
Beiträge: 1265
Registriert: 16.05.2012 14:19:49

Re: Spamassassin-Traning mit Dovecot's IMAPSieve-Plugin schlägt fehl

Beitrag von weshalb » 01.11.2018 17:48:37

Ist mit Dovecot ganz easy:
nano /etc/dovecot/local.conf
##public folder
namespace {
type = public
separator = .
prefix = Spamlern.
location = maildir:/var/vmail/public/.Spamlern
subscriptions = yes
}
##public folder
namespace {
type = public
separator = .
prefix = NoSpam.
location = maildir:/var/vmail/publicNoSpam/.NoSpam
subscriptions = yes
}
EDIT: Die Ordner müssen natürlich vorher händisch angelegt und die entsprechenden Rechter vergeben werden.
Zuletzt geändert von weshalb am 01.11.2018 19:19:19, insgesamt 1-mal geändert.

Benutzeravatar
weshalb
Beiträge: 1265
Registriert: 16.05.2012 14:19:49

Re: Spamassassin-Traning mit Dovecot's IMAPSieve-Plugin schlägt fehl

Beitrag von weshalb » 01.11.2018 19:15:59

derlym hat geschrieben: ↑ zum Beitrag ↑
31.10.2018 13:06:30
Nun der Haken: Es sieht so aus, als würde Spamassassin die gelernten Token nicht speichern. Aufgefallen ist es dadurch, dass Spamassassin immer wieder dieselben Spammails durchlässt, obwohl diese bereits mehrfach als Spam markiert wurden. Das Problem lässt sich verifizieren, indem eine Mail, die durch den Nutzer in das Spam-Verzeichnis verschoben wurde (und somit bereits bekannt sein sollte), erneut manuell über die Shell an sa-learn übergeben wird.
Dazu fällt mir noch ein, dass du zwar eine Menge anlernen kannst, doch Spamassassin um die 300 negativ sowie 300 positiv angelernte Mails benötigt, bevor da was passiert.

Das siehst du dann auch im Header der Mail.

derlym
Beiträge: 27
Registriert: 17.11.2006 23:08:53

Re: Spamassassin-Traning mit Dovecot's IMAPSieve-Plugin schlägt fehl

Beitrag von derlym » 03.11.2018 10:53:06

Danke für eure Antworten.
whisper hat geschrieben:Wenn du Interesse hast, melde dich per PN.
Ich schreibe dir gleich eine Nachricht.
weshalb hat geschrieben: Dazu fällt mir noch ein, dass du zwar eine Menge anlernen kannst, doch Spamassassin um die 300 negativ sowie 300 positiv angelernte Mails benötigt, bevor da was passiert.
Lernwerte hat Spamassassin genug. Das Filtering an sich funktioniert auch sehr gut - nur werden gelernte Werte neuer Mails, die von einem Nutzer händisch in das Junk-Verzeichnis verschoben werden, anscheinend nicht gespeichert.

Benutzeravatar
whisper
Beiträge: 3150
Registriert: 23.09.2002 14:32:21
Lizenz eigener Beiträge: GNU Free Documentation License
Kontaktdaten:

Re: Spamassassin-Traning mit Dovecot's IMAPSieve-Plugin schlägt fehl

Beitrag von whisper » 04.11.2018 15:02:30

@
derlym hat geschrieben: ↑ zum Beitrag ↑
03.11.2018 10:53:06
Ich schreibe dir gleich eine Nachricht.
Ich hatte dir gleich geschrieben, die PN liegt noch in Ausgang :-(

Benutzeravatar
weshalb
Beiträge: 1265
Registriert: 16.05.2012 14:19:49

Re: Spamassassin-Traning mit Dovecot's IMAPSieve-Plugin schlägt fehl

Beitrag von weshalb » 05.11.2018 08:06:04

derlym hat geschrieben: ↑ zum Beitrag ↑
03.11.2018 10:53:06
weshalb hat geschrieben: Dazu fällt mir noch ein, dass du zwar eine Menge anlernen kannst, doch Spamassassin um die 300 negativ sowie 300 positiv angelernte Mails benötigt, bevor da was passiert.
Lernwerte hat Spamassassin genug. Das Filtering an sich funktioniert auch sehr gut - nur werden gelernte Werte neuer Mails, die von einem Nutzer händisch in das Junk-Verzeichnis verschoben werden, anscheinend nicht gespeichert.
Bei mir liegen die angelegten Bayes unter
/var/lib/spamassassin/.spamassassin/
Da exitieren folgende Dateien:
bayes_journal
bayes_seen
bayes_toks


Somit lautet der Befehl bei mir, um Spammails anzulernen:
sa-learn --dbpath=/var/lib/spamassassin/.spamassassin/bayes --spam --showdots /pfad/zur/den/Spammails/
Wenn irgendwas nicht stimmt, würde der Befehl nicht ausgeführt werden.

Nach dem Anlernen kann man sich unter /var/lib/spamassassin/.spamassassin/ die einzelnen Bayes Dateien anschauen. Hat sich das Datum und die Größe dieser Dateien verändert, kannst du davon ausgehen, dass da was angelernt wurde.

Der Pfad zu den Bayes ist bei mir unter
/etc/spamassassin/local.cf
hinterlegt.

Poste die einfach mal.

Und was noch viel wichtiger ist, poste mal die Ausgabe von
sa-learn --dump magic

Antworten