Auf Kommentar antworten

Spam ausfiltern mit (K)Ubuntu, Exim, Dovecot und DSPAM

Nachdem mir dann doch wieder das Spam-Aufkommen in meiner Mailbox auf den Geist ging, war klar: auch mein neues Server-Setup braucht einen Filter. Nur welchen? Nach ein wenig Recherche fiel meine Wahl dieses Mal auf DSPAM, für das es zudem direkten Dovecot-Support in Gestalt eines Plugins gibt.

Das frühere Setup über verschiedene Pseudo-Transport-Blöcke in Exim war recht komplex und außerdem "fragil". Das DSPAM-Setup versprach deutlich klarer und einfacher zu sein (auch wenn mir da die saumiserable Dokumentation, insbesondere des Ubuntu-/Debian-Pakets, beinahe einen Strich durch die Rechnung gemacht hätte). Einen Virenscanner wollte ich mir dieses Mal zudem sparen, da (1) der Anteil Viren-Mails in meiner Mailbox bei ca. 1-2 pro Monat liegt und (2) ich diese Mails normalerweise auch selbst erkenne und direkt lösche. Außerdem benutze ich ja weder Windows noch Outlook.

DSPAM besitzt einen sehr ausgefeilten Filter, der im Ruf steht, deutlich zuverlässiger SPAM zu erkennen als die Konkurrenz. Mit Bogofilter hatte ich in der Vergangenheit schlechte Erfahrungen mit vielen "False Positives" machen müssen, und bei SpamAssassin war die Erkennungsquote eher niedrig in letzter Zeit. Jetzt muß die Zeit zeigen, wie gut sich DSPAM im Vergleich schlägt. Die Zukunft des Projekts war eine Zeitlang wackelig, aber es scheint sich eine aktive Community zu bilden, die den Filter weiterpflegt.

Fangen wir also an, indem wir das DSPAM-Paket installieren (wenn man "--no-install-recommends" wegläßt, wird clamav mitinstalliert, was für reine Spam-Filterung natürlich überflüssig ist) :

apt-get install --no-install-recommends dspam

Danach muß das Unterverzeichnis /var/spool/dspam/opt-in/local angelegt und dem Besitzer dovecot.dovecot zugeordnet werden, mit Gruppen-Schreibrechten (0770). Diese Struktur benutzt DSPAM in der Standard-Konfiguration, um die Filterung zu aktivieren. Man kann es auch auf "Opt Out"-Modus stellen, in welchem Fall die Mails aller Benutzer standardmäßig gefiltert werden, solange sie es nicht explizit abschalten. Für dieses Setup wäre entsprechend /var/spool/dspam/opt-out/local notwendig.

Nun ordnen wir den Benutzer der Gruppe "dspam" zu und erzeugen die passende Opt-In-Datei (im Opt-Out-Fall sollte es genauso funktionieren, nur muß man die Datei .dspam durch .nodspam ersetzen; allerdings habe ich das nicht ausprobiert). Das Verzeichnis opt-in/local muß man ggf. vorher noch anlegen und Schreibrechte für die Gruppe "dspam" vergeben. Der jeweilige Benutzer sollte dann dieser Gruppe zugeordnet werden, so daß er die Opt-In-Markierung selbst setzen kann:

touch /var/spool/dspam/opt-in/local/<BENUTZER>.dspam

Nun noch Exim so einstellen, daß Mails bei lokaler Zustellung durch DSPAM geleitet werden. Hierzu wird z.B. conf.d/transport/20_dovecot_delivery um einen "transport_filter"-Eintrag ergänzt:

dovecot_delivery:
  driver = pipe
  transport_filter = /usr/bin/dspam --mode=tum --process --deliver=innocent,spam --stdout
  command = /usr/lib/dovecot/deliver
  ...

An diesem Punkt sollte eingehende Mail bereits durch DSPAM behandelt werden, erkennbar an den "X-DSPAM"-Headerzeilen. Die Erkennungsquote ist zu Anfang aber gleich null, denn noch ist der Filter ja nicht trainiert. Das kommt aber gleich dran.

Aussortiert werden von DSPAM markierte Mails zum Beispiel mittels Sieve, wenn das entsprechende Dovecot-Plugin aktiv ist. Eine passende Regel sähe dann so aus:

if header :contains "X-DSPAM-Result" "Spam" {
  addflag "\\Seen";
  fileinto "SPAM";
}

Das Training machen wir am bequemsten direkt über Dovecot. Das "Antispam"-Plugin erlaubt es, direkt das Hauptprogramm "dspam" aufzurufen, um Mail-Zuordnungen zu korrigieren. Leider ist es nur in Qellform verfügbar, also müssen wir zunächst GCC installieren. Ist das geschafft, kommen die Dovecot-Header dran:

apt-get install dovecot-dev

Nun das Plugin holen und auspacken. Dann die Datei defconfig nach .config kopieren und darin den dspam-Treiber aktivieren:

BACKEND=dspam-exec

Zum Schluß das Plugin installieren (ggf. vorher Makefile anpassen, so daß antispam.7 unter /usr/share/man/man7/dovecot-ntispam.7 mitinstalliert wird). Das geht am besten mit Hilfe von checkinstall, was automatisch ein .deb-File erzeugt:

checkinstall make install

Damit das Plugin auch benutzt wird, müssen wir es in dovecot.conf aktivieren.

protocol imap {
  ...
  mail_plugins = antispam
  ...
}
...
plugin {
  ...
  antispam_trash = trash;Trash;Deleted Items
}

Der "Trash"-Eintrag ist notwendig, weil es sonst für das Plugin beim Löschen über den Papierkorb so aussieht, als ob die entsprechenden Mails aus dem Spam-Ordner "herausgeschoben" werden, und es deshalb ohne diesen Eintrag die Mails bei DSPAM wieder als Nicht-Spam klassifizieren würde. Jetzt muß noch Dovecot neugestartet werden, und wir sind soweit fertig.

invoke-rc.d dovecot restart

Falsch klassifizierte Mails verschieben wir einfach manuell nach (bzw. weg von) SPAM, woraufhin das Plugin automatisch dspam aufruft, um die Klassifizierung zu korrigieren. Auf diese Art lernt der Filter automatisch mit, ohne das wir irgendwelche weiteren Anstrengungen unternehmen müssen. Der Nachteil dieser Methode soll aber nicht verschwiegen werden: der direkte Aufruf von dspam blockiert Dovecot für kurze Zeit, was für Systeme mit wenigen Nutzern kein Problem darstellt, aber auf "großen" Systemen schnell zu Einbrüchen führen wird. Für den beschriebenen Heim-Server ist das allerdings natürlich kein Problem.

Antworten

Der Inhalt dieses Feldes wird nicht öffentlich zugänglich angezeigt.
  • Internal paths in double quotes, written as "internal:node/99", for example, are replaced with the appropriate absolute URL or relative path.
  • Zulässige HTML-Tags: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Zeilen und Absätze werden automatisch erzeugt.

Weitere Informationen über Formatierungsoptionen