Mein Datenhaufen zu IT und Elektronik Themen.

RSPAMD automatisch SPAM / HAM lernen mit Dovecot und IMAPSieve

Bei jedem Spamfilter kann es vorkommen, dass Spam durchrutscht oder eine echte Nachricht fälschlicherweise als Spam eingestuft wird. Rspamd bietet über das Webinterface die Möglichkeit, trainiert zu werden. Hier kann man einfach den Quellcode jeder E-Mail kopieren und Rspamd mitteilen, ob es sich dabei um Spam (SPAM) oder um eine legitime Nachricht (HAM) handelt. Dieses Vorgehen ist jedoch ungeeignet, um den Spamfilter effektiv zu trainieren.

Wünschenswert wäre folgende Lösung: Immer wenn ein Benutzer eine E-Mail in den Ordner „Junk“ verschiebt, sollte diese E-Mail automatisch von Rspamd als Spam gelernt werden. Zusätzlich sollte jede E-Mail, die der Benutzer aus dem „Junk“-Ordner herausholt, als Ham gelernt werden.

Genau dieses Szenario möchte ich hier kurz beschreiben. Das Hostsystem ist ein FreeBSD; Linux-User müssen daher bei den Pfaden wie /usr/local aufpassen! Ebenfalls lauscht mein Rspamd-Worker nicht auf einem Unix-Socket, sondern auf der IP 127.0.0.3, da er in einer Jail-Umgebung läuft.

Beginnen wir mit der Konfiguration für Dovecot.

20-imap.conf:

protocol imap {
  mail_plugins = $mail_plugins sieve
}

90-plugin.conf:

plugin {
  sieve_plugins = sieve_imapsieve sieve_extprograms

  # From elsewhere to Spam folder or flag changed in Spam folder
  imapsieve_mailbox1_name = Junk
  imapsieve_mailbox1_causes = COPY FLAG
  imapsieve_mailbox1_before = file:/usr/local/etc/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/local/etc/dovecot/sieve/report-ham.sieve

  sieve_pipe_bin_dir = /usr/local/libexec/dovecot

  sieve_global_extensions = +vnd.dovecot.pipe
}

/usr/local/etc/dovecot/sieve/report-spam.sieve:

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

if environment :is "imap.cause" "COPY" {
    pipe :copy "sa-learn-spam.sh";
}

# Catch replied or forwarded spam
elsif anyof (allof (hasflag "\\Answered",
                    environment :contains "imap.changedflags" "\\Answered"),
             allof (hasflag "$Forwarded",
                    environment :contains "imap.changedflags" "$Forwarded")) {
    pipe :copy "sa-learn-spam.sh";
}

/usr/local/etc/dovecot/sieve/report-ham.sieve:

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

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

if string "${mailbox}" [ "Trash", "train_ham", "train_prob", "train_spam" ] {
  stop;
}

pipe :copy "sa-learn-ham.sh";

Natürlich nicht vergessen, die beiden neuen Sieve-Skripte für Sieve zu kompilieren:

# sievec /usr/local/etc/dovecot/sieve/report-spam.sieve
# sievec /usr/local/etc/dovecot/sieve/report-ham.sieve

Es fehlen nur noch die beiden Shell-Skripte, um die Mails an Rspamd weiterleiten zu können.

/usr/local/libexec/dovecot/sa-learn-spam.sh:

#!/bin/sh
exec /usr/local/bin/rspamc -h 127.0.0.3:11334 learn_spam

/usr/local/libexec/dovecot/sa-learn-ham.sh:

#!/bin/sh
exec /usr/local/bin/rspamc -h 127.0.0.3:11334 learn_ham

Beide müssen ausführbar sein:

# chmod +x /usr/local/libexec/dovecot/sa-learn-spam.sh /usr/local/libexec/dovecot/sa-learn-ham.sh

Wenn ich nun eine E-Mail in den Ordner „Junk“ verschiebe, lernt Rspamd diese automatisch als Spam:

2020-05-04 11:21:02 #92071(controller) <b91225>; csession; rspamd_controller_check_password: allow unauthorized connection from a trusted IP 127.0.0.3
2020-05-04 11:21:02 #92071(controller) <b91225>; csession; rspamd_message_parse: loaded message; id: <FNgLHBeARhiVYgEegF_-Pw@ismtpd0002p1lon1.sendgrid.net>; queue-id: <undef>; size: 49053; checksum: <f5e2fc59515e1da33d532c6f03f6f6f0>
2020-05-04 11:21:02 #92071(controller) <b91225>; csession; rspamd_mime_part_detect_language: detected part language: de
2020-05-04 11:21:02 #92071(controller) <b91225>; csession; rspamd_mime_part_detect_language: detected part language: de
2020-05-04 11:21:02 #92071(controller) <b91225>; csession; rspamd_controller_learn_fin_task: <127.0.0.3> learned message as spam: FNgLHBeARhiVYgEegF_-Pw@ismtpd0002p1lon1.sendgrid.net

Verschiebe ich eine E-Mail aus dem Ordner „Junk“ heraus, wird sie, wie gewünscht, als Ham gelernt:

2020-05-04 11:20:51 #92071(controller) <a7fe42>; csession; rspamd_controller_check_password: allow unauthorized connection from a trusted IP 127.0.0.3
2020-05-04 11:20:51 #92071(controller) <a7fe42>; csession; rspamd_message_parse: loaded message; id: <FNgLHBeARhiVYgEegF_-Pw@ismtpd0002p1lon1.sendgrid.net>; queue-id: <undef>; size: 49053; checksum: <f5e2fc59515e1da33d532c6f03f6f6f0>
2020-05-04 11:20:51 #92071(controller) <a7fe42>; csession; rspamd_mime_part_detect_language: detected part language: de
2020-05-04 11:20:51 #92071(controller) <a7fe42>; csession; rspamd_mime_part_detect_language: detected part language: de
2020-05-04 11:20:51 #92071(controller) <a7fe42>; csession; rspamd_controller_learn_fin_task: <127.0.0.3> learned message as ham: FNgLHBeARhiVYgEegF_-Pw@ismtpd0002p1lon1.sendgrid.net

Fragen? Einfach fragen!

Ach, und was man nicht mehr verwenden sollte: das Antispam-Plugin – das ist „tot“.

5 Kommentare

  1. Markus

    Die Idee ist gut, aber bei mir funktioniert das nicht. Verschiebe ich eine Mail aus dem Spamordner, wird sie kurz darauf wieder dorthin zurück veschoben….

    • kernel-error

      Geht nicht, ist eine eher schwierige Problembeschreibung…

      • Patrick Niebeling

        Ich kann das jedoch bestätigen. Bei mir landet die Mail auch immer wieder im Junk Folder. Hier ein Lograuszug:

        Jan 16 15:27:31 server01 dovecot: imap(user@example.com): sieve: pipe action: piped message to program `learn-ham.sh‘
        Jan 16 15:27:31 server01 dovecot: imap(user@example.com): sieve: left message in mailbox ‚INBOX‘
        Jan 16 15:27:31 server01 dovecot: imap(user@example.com): Logged out in=255 out=1805 deleted=0 expunged=0 trashed=0 hdr_count=0 hdr_bytes=0 body_count=0 body_bytes=0
        Jan 16 15:27:31 server01 dovecot: imap-login: Login: user=, method=PLAIN, rip=::1, lip=::1, mpid=4017682, TLS, session=
        Jan 16 15:27:31 server01 dovecot: imap(user@example.com): Logged out in=850 out=78142 deleted=0 expunged=0 trashed=0 hdr_count=20 hdr_bytes=35198 body_count=0 body_bytes=0
        Jan 16 15:27:32 server01 dovecot: imap(user@example.com): sieve: pipe action: piped message to program `learn-spam.sh‘
        Jan 16 15:27:32 server01 dovecot: imap(user@example.com): sieve: left message in mailbox ‚Junk‘

        • kernel-error

          In deinem Setup scheint die E-Mail, trotz Markierung als Ham, immer wieder im Junk-Ordner zu landen. Das kann passieren, wenn der Lerneffekt von Rspamd und Dovecot nicht korrekt umgesetzt wird. Hier einige Ansätze, um das Verhalten zu überprüfen und anzupassen:

          Debugging des Sieve-Prozesses: Aktivere in Dovecot das Sieve-Logging auf einem höheren Level, um detailliertere Informationen zum Ablauf des learn-ham.sh und learn-spam.sh zu erhalten. Füge mail_debug = yes in deiner Dovecot-Konfiguration hinzu und schaue, ob das Skript tatsächlich als Ham oder Spam registriert wird.

          sa-learn Skripte prüfen: Teste die Skripte sa-learn-spam.sh und sa-learn-ham.sh manuell, um sicherzustellen, dass sie die Rückgabe von Rspamd korrekt verarbeiten. Führe die Befehle direkt aus und überprüfe die Rückmeldung von rspamd, um sicherzustellen, dass es tatsächlich als Ham bzw. Spam gelernt wird.

          Ordnerkonfiguration: Möglicherweise verhindert die COPY-Aktion in der report-ham.sieve, dass die E-Mail vollständig aus dem Junk-Ordner verschoben wird. Versuche, in der Konfiguration sicherzustellen, dass nach der Markierung als Ham kein Rückkopieren in den Junk-Ordner erfolgt.

          Rspamd-Lerneinstellungen: Stelle sicher, dass Rspamd so konfiguriert ist, dass es das Verschieben von E-Mails zwischen Ordnern als Lernevent registriert. Eventuell sind bestimmte Einstellungen oder Module erforderlich, um das korrekte Lernen von Ham und Spam in Rspamd zu gewährleisten.

          Insg. aber vielleicht etwas, was wir nicht über Kommentare klären sollten 😀

  2. Stryker2008

    Hier klappt das. Danke!

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

© 2024 -=Kernel-Error=-

Theme von Anders NorénHoch ↑