Inhaltsverzeichnis

Mail-Import via MILTER

Zur Anbindung von Benno MailArchiv an unixoide E-Mail-Systeme empfehlen wir die MILTER Schnittstelle.

Dieses hat gegenüber der Anbindung von Benno MailArchiv per (always_)bcc oder einem ähnlichen Mechanismus den Vorteil, daß die eigentlichen Envelope-Informationen nicht verloren gehen. Bei E-Mails, die per BCC verschickt werden, existiert kein entsprechender Header in der E-Mail selbst. Diese Information wird als sogenannter Envelope von Mailserver zu Mailserver übermittelt.

Der MILTER Daemon „benno-milter“ speichert jede eingehende E-Mail im Inbox-Verzeichnis von Benno MailArchiv. Beim Schreiben der Datei speichert der MILTER die Envelope-Informationen (MAIL FROM, RCPT TO) in den zusätzlichen Headern

Diese Header sind per Voreinstellung in der Konfiguration des Archivers als „<senderheaders />“ bzw. „<recipientheaders />“ eingetragen. Zusätzlich sind sie als „<secretheaders />“ markiert, so daß sie bei der Anzeige einer E-Mail nicht ausgegeben werden.

Auf Debian und auf Debian basierenden Systemen erfolgt die Grund-Installation direkt aus dem Paket benno-milter aus dem Repository. Danach ist nur noch die Anbindung der Postfix-Konfiguration notwendig.

Auf anderen Systemen sollte die manuelle Installation vorgenommen werden.

Hinweis: Das Milter-Paket und die diesbezüglichen, an dieser Stelle dargestellten Informationen, stehen als demonstratives Beispiel und „as is“ ohne Anspruch auf Vollständigkeit zur Verfügung.

Falls mehrere Systeme als Importquellen angebunden werden, sollten die Anmerkungen der Multi-Import Konfiguration beachtet werden.

Installation aus Debian Package

Mit vorher installiertem Postfix

Nachdem das Benno MailArchiv Repository konfiguriert wurde, wird das Paket benno-milter per apt installiert. In der Voreinstellung ist benno-milter für die Implementierung in einen vorher installierten Postfix MTA konfiguriert. Daher sollte vor der Installation des Packages die Installation und Konfiguration des MTA abgeschlossen sein.

Anschließend wird das Paket installiert.

apt-get install benno-milter

Nach der Installation des Pakets wird der MILTER Daemon an Postfix angebunden.

Unix Domain Socket

Die MILTER-Anbindung wird in der Konfigurationsdatei /etc/postfix/main.cf vorgenommen. Hierfür werden hier die folgenden Konfigurationsparameter hinzugefügt. Achtung Falls Amavis als Post-Queue Filter installiert ist, sollte die Konfiguration des MILTERs wie in MILTER für Amavis deaktivieren beschrieben durchgeführt werden.

...
### Benno MailArchiv Milter 
smtpd_milters = unix:/benno-milter/benno-milter.sock
non_smtpd_milters = local:/benno-milter/benno-milter.sock
milter_default_action = tempfail
### /Benno MailArchiv Milter

Falls der MILTER Daemon vom MTA getrennt installiert werden soll, kann der Benno MILTER Daemon per über TCP angebunden werden.

Danach den Postfix-Daemon neu starten. Achtung: Falls das System so konfiguriert ist, daß eine Mail einen Filter durchläuft und dann erneut über einen zweiten SMTP-Prozess eingeliefert wird, muss der MILTER in diesem SMTPD deaktiviert werden. Dieses ist zum Beispiel beim Einsatz von Amavis der Fall.

TCP-Socket

Falls der MILTER Daemon auf einem vom SMTP-Service getrennten Host installiert werden soll, muss der MILTER Daemon an einen TCP-Socket gebunden werden und der Deamon muss nicht mit der Gruppe postfix gestartet werden. Hierfür wird vom Pre-Install Script des Pakets die Override-Datei /etc/systemd/system/benno-milter.service.d/override.conf angelegt.

Diese Konfiguration kann auch nachträglich in /etc/default/benno-milter vorgenommen werden.

In der Postfix-Konfiguration werden die Pfade zum Socket durch die Angabe von Hostname/IP-Adresse und Port ersetzt:

smtpd_milters = inet:benno.lw-systems.net:22500
non_smtpd_milters = inet:benno.lw-systems.net:22500

Details der Anbindung

Spezielle Konfigurationen / Andere MTAs

Bei der Installation des Packages wird geprüft, ob das Spool-Verzeichnis von Postfix vorhanden ist. In diesem Fall wird der MILTER-Daemon für die Anbindung per Unix Domain Socket konfigueriert. Andernfalls wird die Anbindung per TCP Socket eingestellt.

Anbindung bei getrenntem Benno MailArchiv Host

Bei logischer Trennung zwischen dem MTA und dem Archivierungssystem müssen die E-Mails auf das Archiverungssystem übertragen werden und hier unverändert gespeichert werden.

Die einfachste Möglichkeit ist, den MILTER-Daemon auf dem Archivierungs-Host zu installieren. Der MILTER wird so konfiguriert, daß er einen TCP-Socket bindet, so daß die Kommunikation zwischen MTA und MILTER über das Netwerk erfolgen kann.

Diese Konfiguration hat den Nachteil, daß der eigentiche Mailtransport von einem weiteren Host abhängig ist.

benno-smtp

Eine andere Möglichkeit ist die Konfiguration des MILTER Daemons auf dem MTA und die Übertragung der E-Mails per SMTP zum Archivierungssystem. Hier wird auf dem Benno MailArchiv Host wird das Paket benno-smtp installiert. Das Paket enthält den SMTP Daemon, der über Port 2500 eingelieferte E-Mails werden ohne Veränderung im Benno Import Verzeichnis speichert.

Auf dem MTA-Host muss der Hostname (BENNOHOST=) des Archivierungs-Systems in der Datei /etc/default/benno-milter konfiguriert werden.

#
# Start options for benno-milter
#
SOCKET=/var/spool/postfix/benno-milter/benno-milter.sock
SPOOLDIR=/srv/benno/inbox

#BENNOHOST=your.benno-archive.host

benno-milter2smtp

Danach wird die Übertragung per Cron-Job in /etc/cron.d/benno-milter durch entkommentieren des Kommandos aktiviert.

#
# Import mails from maildump milter
#
#*/15 * * * * benno /usr/sbin/benno-export2archive

Dieser Cron-Job ruft letztendlich das Programm benno-milter2smtp auf, mit dem die E-Maildatein per SMTP übertragen werden.

Die X-REAL-* Header der Maildump-Dateien werden beim Versand entfernt und als Envelope-Informationen übertragen. Daher muss bei der Konfiguration von benno-smtp darauf geachtet werden, dass in der Konfigurationsdatei /etc/benno-smtp/benno-smtp.conf die Einstellung envelope_header = true gesetzt ist.

Univention Mailserver

In einer Univention-Umgebung wird die MailArchiv App auf dem zentralen Mailserver angebunden. Zur Konfiguration werden die UCR-Variablen wie folgt gesetzt.

ucr set mail/postfix/mastercf/options/smtp/smtpd_milters=inet:benno-hostname:22500
ucr set mail/postfix/mastercf/options/smtp/milter_default_action=tempfail
ucr set mail/postfix/mastercf/options/submission/smtpd_milters=inet:benno-hostname:22500
ucr set mail/postfix/mastercf/options/submission/milter_default_action=tempfail
ucr set mail/postfix/mastercf/options/smtps/smtpd_milters=inet:benno-hostname:22500
ucr set mail/postfix/mastercf/options/smtps/milter_default_action=tempfail

Als Hostnamen kann der FQDN des Benno MailArchiv Systems oder die IP-Adresse angegeben werden.

Zur Aktivierung der Konfiguration ist ein Neustart von Postfix notwendig: systemctl restart postfix

Die Kommunikation zwischen MTA und Benno Mailarchiv per MILTER erfolgt unverschlüsselt. Falls sich der Mailserver und die Benno MailArchiv App auf der gleichen Maschine befinden, kann die Kommunikation auch über den Hostnamen localhost erfolgen.

MILTER für Amavis deaktivieren

Viele SPAM- und Virenfilter benötigen einen SMTP-Daemon, über den die analysierten E-Mails wieder in das System eingespeist werden. Die Konfiguration der MILTER-Anbindung in der Konfigurationsdatei main.cf wirkt sich global auf alle SMTP Dienste des Postfix aus. Damit wird eine E-Mail, die beide SMTP-Dienste durchläuft zweimal in das Archiv importiert. Jeder SMTP-Dienst fügt eigene Header hinzu, so dass sich die Checksumme der E-Mail ändert und diese dadurch nicht als Duplikat erkannt werden kann.

Achtung: Bei SPAM-Filterung per Amavis muss der MILTER für den smtpd auf Port 10025 deaktiviert werden, falls Amavis als Post-Queue Filter konfiguriert ist. Im Falle einer Pre-Queue Konfiguration können die -o smtpd_milters= und -o non_smtpd_milters= Konfigurationen entfallen.

127.0.0.1:10025 inet n - n - - smtpd
  -o content_filter=
  -o local_recipient_maps=
  -o relay_recipient_maps=
  -o smtpd_restriction_classes=
  -o smtpd_client_restrictions=
  -o smtpd_helo_restrictions=
  -o smtpd_sender_restrictions=
  -o smtpd_recipient_restrictions=permit_mynetworks,reject
  -o mynetworks=127.0.0.0/8
  -o smtpd_authorized_xforward_hosts=127.0.0.0/8
  -o strict_rfc821_envelopes=yes
  -o smtpd_error_sleep_time=0
  -o smtpd_soft_error_limit=1001
  -o smtpd_hard_error_limit=1000
  -o smtpd_milters=
  -o non_smtpd_milters=

Der MILTER wird durch die beiden „-o *_milters=“ Zeilen deaktiviert.

Alternative Anbindung in der "master.cf"

Alternativ zur Konfiguration in der „main.cf“ kann der MILTER auch in der Definition des SMTP Dienstes in der „master.cf“ konfiguriert werden. Diese Art der Konfiguration ist nicht ganz so einfach wie die der main.cf, bietet aber den Vorteil, dass der MILTER nicht versehentlich für mehrere SMTP Dienste aktiviert wird.

# ==========================================================================
# service type private unpriv chroot wakeup  maxproc command + args
#              (yes)   (yes)  (yes)  (never) (100)
# ==========================================================================
smtp      inet  n      -      -      -       -        smtpd
  -o smtpd_milters=unix:/benno-milter/benno-milter.sock
  -o non_smtpd_milters=local:/benno-milter/benno-milter.sock
  -o milter_default_action=tempfail

Falls der submission-Port ebenfalls gebunden ist, muss die MILTER-Konfiguration hier ebenfalls eingefügt werden.

Bei Angabe des Pfades zum Socket ist die chroot Konfiguration des Dienstes wichtig. Falls chroot auf n gesetzt wird oder der Defaultwert in der Kommentarzeile mit n angegeben ist, muss der Pfad als kompletter Pfad zum Socket angegeben werden. Im Beispiel oben ist der Pfad relativ zum chroot-Verzeichnis konfiguriert.

Manuelle Installation

Das vorcompilierte Programm kann einschließlich Init-Scripte und Beschreibung aus dem Tar-Archiv maildump-milter.tar.gz installiert werden.

Vorbereitung

Vor der Konfiguration des MILTER Daemons muss sichergestellt werden, dass das Spoolverzeichnis /srv/benno/inbox existiert. Dieses Verzeichnis sollte ist der Installation von Benno MailArchiv auf dem System angelegt worden. Falls der MILTER-Daemon auf einem anderen System installiert wird, muss das Verzeichnis nachträglich erstellt und der Benutzer benno angelegt werden. Dieser muss Schreibrechte auf dem Verzeichnis /srv/benno/inbox erhalten.

Auf einem Debian System wird das Paket benno-milter installiert. Dieses führt die Schritte zur Inbetriebnahme des MILTER Daemons automatisch durch.

  1. useradd –system –gid postfix –shell /bin/false –home /srv/benno/inbox benno
  2. adduser benno postfix
  3. mkdir /srv/benno/inbox
  4. chown benno.postfix /srv/benno/postfix
  5. mkdir /var/spool/postfix/maildump-milter
  6. chown benno.postfix /var/spool/postfix/maildump-milter
  7. cp init.d/maildump-milter /etc/init.d/maildump-milter
  8. update-rc.d maildump-milter start 05 2 3 4 5 . stop 01 0 1 6 .
  9. cp default/maildump-milter /etc/default/maildump-milter
  10. cp sbin/maildump-milter /usr/local/sbin/maildump-milter
  11. /etc/init.d/maildump-milter start

Anbindung an Postfix

Der main.cf werden die folgenden Zeilen hinzugefügt.

### Benno MailArchiv Milter
smtpd_milters = unix:/maildump-milter/socket
non_smtpd_milters = local:/maildump-milter/socket
#milter_default_action = accept
milter_default_action = tempfail
## if lmtp milter exist :
# lmtpd_milters = unix:/maildump-milter/socket
### /Benno MailArchiv Milter

Installation der Scripte

Debugging

Das Logging des Services erfolgt mittels syslog mit der Facility LOG_MAIL.

Testaufruf

Zu Testzwecken kann der Daemon auch auf der Konsole mit dem folgenden Kommandoaufruf gestartet werden.

sudo -u benno -g postfix /usr/sbin/benno-milter \
  -p local:/var/spool/postfix/benno-milter/benno-milter.sock \
  -o /srv/benno/inbox 
  -l /tmp/benno-milter.pid

Der Paramter -l /tmp/benno-milter.pid muss bei Benno MILTER < 2.10.0 weggelassen werden.

Systemd

Der Benno MILTER Daemon wird von systemd gestartet. Die Konfiguration des Services wird im Servicefile /etc/systemd/system/benno-milter.service festgelegt.

Der Daemon wird letztendlich mit dem folgenden Aufruf gestartet:

/usr/sbin/benno-milter \
    -l ${RUNTIME_DIRECTORY}/benno-milter.pid \
    -p ${SOCKET_TYPE}:${SOCKET} \
    -o ${SPOOLDIR} ${MILTERARGS}

Die hier aufgeführten Umgebungsvariablen werden im Servicefile vorkonfiguriert:

# systemctl show benno-milter --property=Environment
SOCKET_TYPE=local
SOCKET=/var/spool/postfix/benno-milter/benno-milter.sock
SPOOLDIR=/srv/benno/inbox
PIDFILE=/run/benno-milter/benno-milter.pid  

Diese Variablen werden ggfs. durch die Einstellungen der Konfigurationsdatei /etc/default/benno-milter überschrieben.

Benutzer und Gruppe

Falls der MILTER per UNIX DOMAIN Socket an Postfix angebunden ist, wird der Service mit dem User „benno“ und der Gruppe „postfix“ gestartet. Bei Anbindung per TCP Socket kann diese Einstellung abweichen. Die jeweils aktuelle Konfigurationseinstellung kann über die folgenden Aufrufe ausgelesen werden:

# systemctl show benno-milter --property=User
# systemctl show benno-milter --property=Group

Vom Standard abweichende Einstellungen sind in der Konfigurationsdatei /etc/systemd/system/benno-milter.service.d/override.conf festgelegt.

Systemd Start

eval $(systemctl show benno-milter --property=User --property=Group \
  --property=Environment --property=RuntimeDirectory|\
perl -pe 's/^Environment=//'); \
. /etc/default/benno-milter; \
sudo -u $User -g $Group \
/usr/sbin/benno-milter \
    -l /run/${RUNTIME_DIRECTORY}/benno-milter.pid \
    -p ${SOCKET_TYPE}:${SOCKET} \
    -o ${SPOOLDIR} ${MILTERARGS}