E-mails filtern mit dovecot-sieve

Aus

E-Mails auf dem Server mit dovecot-sieve filtern

Basierend auf diesem Thread im Forum wollte ich mir auch mal die E-Mail Filter auf dem Server ausprobieren. Danke @ Purzel :-D ;-)

Purzel hat seine Beschreibung aber für die alten Versionen der Firmware geschrieben. Dort gab es noch keine Mailstation und damit Postfix und Dovecot von Synology. Mit der Mailstation in der heutigen Firmware müssten einige Dinge anders gemacht werden

What's that?

Mit dem dovecot-sieve wird es möglich Filter (mit regulären Ausdrücken) auf Emails am Dovecot anzusetzen. Damit wird es möglich eingehende Emails auf dem IMAP Server in definierte Verzeichnisse zu verschieben oder gleich zu löschen (vorteilhaft im Zusammenspiel mit einem Spamassassin auf der DS). Grundsätzlich läuft das "Sieb" am IMAP Server. Da aber Dovecot ein sogenannter LDA (Local Delivery Agent) ist, kann man auch den Postfix (SMTP) Server dazu bringen seine Emails (direkt an die DS gesendet) nicht mehr direkt in die Mailboxen einzustellen, sondern die Emails zur Einstellung in die Mailboxen an Dovecot zu übergeben. Damit sind auch die Emails am SMTP Port im Filterprozess. Dazu muss aber auf der DS (zumindest für Dovecot von Synology) noch der lokale Zustellprozess (deliver) aus den Quellen von Dovecot kompiliert werden. Das ist einer der Unterschiede zur Beschreibung von Purzel, da sich seine Beschreibung auf den ipkg-Dovecot bezieht. Im Folgenden soll es um diese Unterschiede gehen. Also Purzels Post zusammen mit den hier gezeigten Unterschieden sollte Euch zum Ziel führen ;-)

Neuigkeiten in DSM4.3

(Zumindest) seit DSM 4.3 ist DC-Sieve endlich brauchbar in der Firmware enthalten. Es schadet aber nicht, den ganzen Artikel zu lesen, um über alle Eventualitäten informiert zu sein!

Prinzipiell reicht es nun, das File ~/.dovecot.sieve zu erstellen (siehe weiter unten; Informationen zur Syntax gibt es in Wikipädia, Dovecot-Sieve und RFC3028).

Voraussetzungen

Als Grundvoraussetzung gilt das gleiche wie für ipkg Pakete, obwohl wir für Dovecot-Sieve kein Paket aus ipkg installieren müssen

 * ipkg für die jeweilige Prozessorarchitektur ist installiert
 * Zugriff auf die Shell Konsole via telnet oder ssh als root
 * Texteditor mit korrekten UNIX-Zeilenendzeichen (\n und nicht \r\n): z.B. vi oder nano

Zusätzlich müssen auf der DS noch ein C-Compiler, die Development-Tools und die DB Library installiert werden, bevor mit der Arbeit an Dovecot-Sieve begonnen werden kann

$ ipkg update
$ ipkg install gcc
$ ipkg install optware-devel
$ ipkg install libdb

Wenn das Paket gcc nicht existiert dann kann man versuchen den Compiler via cross-native einzuspielen (falls vorhanden). Sollte sich kein Compiler einspielen lassen, dann kann man dieses Sieb leider nicht verwenden! Desweiteren werden die Quellcodes von Deovecot und auch Dovecot-Sieve benötigt. Dabei ist es wichtig die korrekten Versionen zu verwenden, welche Purzel in seinem Post angegeben hat.

$ cd /volume1/public
$ wget http://www.dovecot.org/releases/1.0/dovecot-1.0.15.tar.gz
$ wget http://www.dovecot.org/releases/sieve/dovecot-sieve-1.0.3.tar.gz
$ gzip -d ./dovecot-1.0.15.tar.gz
$ tar xvf ./dovecot-1.0.15.tar
$ gzip -d ./dovecot-sieve-1.0.3.tar.gz
$ tar xvf ./dovecot-sieve-1.0.3.tar

Installation

Bei der Installation ist folgendes wichtig: Sowohl dovecot als auch dovecot-sieve müssen erstellt werden.

Dabei ist wichtig, dass nur die Befehle configure und make, ABER kein make install gemacht werden!!!

Dovecot kompilieren

Dovecot-Sieve erwartet den kompletten Quellcode von Dovecot. Da Dovecot aber auf der DS nicht komplett vorhanden ist, muss man zuerst Dovecot aus den Quellen "erstellen". (wichtig: kein make install machen)

$ cd /volume1/public/dovecot-1.0.15
$ ./configure --prefix=/volume1/@appstore/MailServer && make

Obiger Code wird Dovecot so vorbereiten, dass dovecot-sieve damit arbeiten kann. Das --prefix=.. sorgt dafür, dass die Pfade in den Binaries korrekt gesetzt werden.
Wenn configure oder make nicht durchlaufen solltet ihr euch diesen Post anschauen. Thanks @ goetz

Dovecot-Sieve installieren

Nachdem der Dovecot vorbereitet wurde, kann man an die eigentliche Installation von dem Sieb gehen. Auch hierbei darf kein make install gemacht werden.

$ cd /volume1/public/dovecot-sieve-1.0.3
$ ./configure --prefix=/volume1/@appstore/MailServer --with-dovecot=../dovecot-1.0.15
$ make

Dieser Code erstellt alle benötigten Module, welche dann an die korrekten Orte kopiert werden müssen. Das --prefix=.. sorgt für die richtigen Pfade in den Binaries.

Module kopieren

In Purzels Post kopiert er die Dateien in eine Dovecot Installation einer ipkg Version. Mit der Default Mailstation der Synology Firmware müssen andere Verzeichnisse gewählt werden, die ich im folgenden erwähnen möchte. Die ersten 4 Dateien liegen unter src/.libs/ im Dovecot-Sieve-Verzeichnis. Das Ziel muss zuerst erstellt werden, damit es in die Struktur der Firmware passt.

$ mkdir -p /lib/dovecot/lda

Damit kann man die Zielverzeichnisse dann mit den Modulen nutzen

lib90_cmusieve_plugin.la  -> /lib/dovecot/
lib90_cmusieve_plugin.lai -> /lib/dovecot/lda/
lib90_cmusieve_plugin.a   -> /lib/dovecot/lda/
lib90_cmusieve_plugin.la  -> /lib/dovecot/lda/
lib90_cmusieve_plugin.so  -> /lib/dovecot/lda/

Die folgenden zwei Dateien liegen in src/libsieve/ des Dovecot-Sieve-Verzeichnisses. Deren Zielverzeichnisse existieren bereits.

sievec                    -> /volume1/@appstore/MailServer/libexec/dovecot/
sieved                    -> /volume1/@appstore/MailServer/libexec/dovecot/

Local Delivery Agent kompilieren

Dieser Punkt kommt bei Purzels Beschreibung nicht vor, da der LDA bei der ipkg-Version bereits vorhanden ist. Unter dovecot heißt das Teil deliver. Dieses ist leider bei der Mailstation nicht mit dabei. Der LDA hat die Aufgabe die Emails entgegenzunehmen und dann unter Berücksichtigung der Filter in die Mailboxen zu schreiben. Per default schreiben sowohl Postfix als auch Dovecot direkt in die Mailboxen der User.

$ cd /volume1/public/dovecot-1.0.15/src/deliver
$ make install deliver

Jetzt erwartet der deliver-Befehl die Konfigurationsdatei von dovecot leider unter /usr/local/etc. Um das zu "beheben" kann man einen Softlink auf die Konfig-Datei anlegen

$ ln -s /usr/syno/mailstation/etc/dovecot.conf /usr/local/etc/dovecot.conf

Konfiguration

Dovecot

Damit auch der Dovecot weiß, dass die Filter benutzt werden solle muss dessen Konfiguration angepasst werden. Öffnet dazu die Datei /volume1/@appstore/MailServer/etc/dovecot.conf und sucht den String protocol lda.

protocol lda {
  # Address to use when sending rejection mails.
  postmaster_address = ich@du.tld

  # Hostname to use in various parts of sent mails, eg. in Message-Id.
  # Default is the system's real hostname.
  hostname = ich.du.tld

  # Support for dynamically loadable plugins. mail_plugins is a space separated
  # list of plugins to load.
   mail_plugins = cmusieve
   mail_plugin_dir = /usr/lib/dovecot/lda

  # If user is over quota, return with temporary failure instead of
  # bouncing the mail.
  #quota_full_tempfail = no

  # Format to use for logging mail deliveries. You can use variables:
  #  %$ - Delivery status message (e.g. "saved to INBOX")
  #  %m - Message-ID
  #  %s - Subject
  #  %f - From address
  #deliver_log_format = msgid=%m: %$

  # Binary to use for sending mails.
  #sendmail_path = /usr/lib/sendmail

  # Human readable error message for rejection mails. Use can use variables:
  #  %n = CRLF, %r = reason, %s = subject, %t = recipient
  #rejection_reason = Your message to <%t> was automatically rejected:%n%r

  # UNIX socket path to master authentication server to find users.
  #auth_socket_path = /var/run/dovecot/auth-master
}

Achtet Euch darauf, dass ihr sowohl das Kommentarzeichen (#) vor protocol_lda und dasjenige vor der schliessenden Klammer (}) entfernt. Sonst crashed Dovecot beim booten. Achtet zudem darauf, dass auch die Zeilen beginnend mit postmaster_address, hostname, mail_plugins und mail_plugins_dir wie oben einkommentiert werden müssen. Ansonsten produziert deliver Fehlermeldungen des Typs Delivery error (command deliver 4453 error (78, ). Dann die Datei speichern.

Filter beim Einsammeln der Emails anwenden

Damit überhaupt der LDA involviert wird, wenn die Emails von externen Account abgerufen werden, müssen die dem Konto entsprechenden rc-Files angepasst werden. Im Normalzustand werden die Emails auch von Dovecot direkt in die Mailbox geschrieben. So kann man Dovecot anweisen (im entsprechenden rc-File) den LDA zu verwenden.

[destination]
type = MDA_external
path = /volume1/@appstore/MailServer/libexec/dovecot/deliver
arguments = ("-e", )

Wenn ihr virtuelle Emailbenutzer verwenden wollt, dann solltet ihr mal die Diskussion der Seite anschauen.

Postfix

Damit der Postfix Server auch weiß, dass er die Emails nicht direkt in die Mailboxen stellen soll, sondern einem weiteren Agent übergeben muss, reicht eine einfache Anweisung in der /usr/syno/mailstation/etc/main.cf des Postfix Servers. Öffnet diese Datei und sucht nach mailbox_command = und setzt den Wert auf

mailbox_command = /volume1/@appstore/MailServer/libexec/dovecot/deliver

Datei speichern und Postfix neustarten

/volume1/@appstore/MailServer/sbin/postfix stop 
/volume1/@appstore/MailServer/sbin/postfix start

Sieb File einrichten

Damit überhaupt Aktionen ausgeführt werden können wenn Emails an den LDA übergeben werden, braucht es im Homeverzeichnis von jedem User, der gefiltert werden soll, eine Datei Namens .dovecot.sieve Diese Datei legt die regulären Ausdrücke und die Aktionen fest. Im folgenden Beispiel werden von Spamassassin markierte Emails direkt in den Papierkorb verschoben und die Emails vom Synology Forum in einen speziellen Ordner geschrieben. Das else keep; sorgt dafür, dass die Email im Posteingang bleibt wenn keine Regel zutrifft.

require "fileinto";
if header :comparator "i;ascii-casemap" :contains "subject" "===*SPAM===*" {
  fileinto "Trash";
  stop;
} elsif header :comparator "i;ascii-casemap" :contains "from" "info@synology-forum.de" {
   fileinto "INBOX.Computer &- Security.Foren.Synology";
   stop;
} else {
   keep;
}

Wichtig dabei ist, dass die Regeln alle in einem einzigen if/elsif/else-Konstrukt untergebracht sind. Sonst passiert es schnell, dass die Emails doppelt vorkommen (einmal im Posteingang und einmal im Folder). Es werden zudem Verkettungen von Bedingungen mithilfe von Operatoren unterstützt, um komplexere Regeln zu erstellen. Zuerstmal am Besipiel des oder-Operators

if anyof(header :comparator "i;ascii-casemap" :contains "from" "info@synology-forum.de",header :comparator "i;ascii-casemap" :contains "subject" "Your Support Request") {
   fileinto "INBOX.Computer &- Security.Foren.Synology";
   stop;

Und jetzt mit einem und-Operator

if allof(header :comparator "i;ascii-casemap" :contains "from" "info@synology-forum.de",header :comparator "i;ascii-casemap" :contains "subject" "Your Support Request") {
   fileinto "INBOX.Computer &- Security.Foren.Synology";
   stop;

Die Syntax bei den "Zielen" ist genau gleich wie die Dateien/Verzeichnisse im Dateisystem (unter ~/.Maildir) heissen. Bei den obigen zwei Beispielen wäre das Ziel im Dateisystem also

~/.Maildir/.INBOX.Computer\ &-\ Security.Foren.Synology