Interoperating Exim with Rspamd

Recently I have been implementing Rspamd for providing some automatic filtering for the emails hosted on my server, which are presently delivered by Exim to the Dovecot LDA.

For integrating Exim with Rspamd, I followed the Rspamd manual, but thing weren’t exactly working as expected.

I was frequently getting error messages such as:

Feb  7 11:10:44 stanke rspamd[2939]: (normal) <3a1c27>; task; accept_socket: accepted connection from 127.0.0.1 port 51289
Feb  7 11:10:44 stanke rspamd[2939]: (normal) <3a1c27>; task; rspamd_worker_error_handler: abnormally closing connection from: 127.0.0.1, error: IO timeout

with Exim at the same time reporting

2016-02-07 11:10:44 1aSMIm-0005QH-3P spam acl condition: Broken pipe on spamd socket
2016-02-07 11:10:44 1aSMIm-0005QH-3P H=mail1.mcsignup.com [205.201.139.33]:49767 Warning: ACL "warn" statement skipped: condition test deferred

In the majority of cases however the scan succeeded, so that a general misconfiguration could be ruled out. For some reason the socket connection between Exim and Rspamd seemed to break in some cases. I tried playing with the spamd_address options of exim, in particular with tmo and retry (see the Exim documentation on content scanning at ACL time), but to no avail.

What seems to have fixed the problem however was to define two entries for spam servers that Exim can connect to, despite the fact that they both refer to the same Rspamd instance. Exim seems to simply switch to the next (in fact same) server when seeing a „broken pipe“ and the reconnect seems to suffice to iron things out. Here is the relevant snippet to be inserted in /etc/exim4/conf.d/main/02_exim4-config_options:

spamd_address = 127.0.0.1 11333 tmo=1m retry=10s variant=rspamd : \
                127.0.0.1 11333 tmo=1m retry=10s variant=rspamd

After my spam filter has been inactive for…

After my spam filter has been inactive for more than two weeks, I finally had the pleasure to investigate what went wrong during the upgrade of my system to Debian Wheezy. Back then I took the conservative approach and kept my old configs when in doubt, especially when they were personalized to my tastes. Unfortunately DSPAM wasn’t so nice as to pass Exim any meaningful error message.

Long story short, the DSPAM package changed the location of its storage drivers. Inserting „x86_64-linux-gnu“ in the StorageDriver entry in dspam.conf solved the problem. Wouldn’t this be the first thing to look for when reading „transport returned 1 from command: /usr/bin/dspam“ in the mainlog?!

DKIM DNS Einstellungen im SERVER4YOU Powerpanel

Heute habe ich meinen Mailserver um ein neues Feature erweitert: die Unterstützung von DomainKeys Identified Mail, einem Verfahren, das helfen soll, Absender Adressen von E-Mails zu verifizieren. Es ist damit ein effektives Werkzeug im Kampf gegen Spam E-Mails

Der versendende Server signiert alle Mails die er versendet vor der Übertragung. Spam Versender haben keinen Zugriff auf den privaten Schlüssel des Servers in dessen Namen sie versenden und können daher keine gültige Signatur bereitstellen. Der empfangende Server kann sich aus einem speziellen DNS Eintrag der Absender-Domain den zur im Absender angegebenen Domain gehörenden öffentlichen Schlüssel holen und damit die Signatur der empfangenen E-Mail überprüfen.

Bei der Einrichtung habe ich mich größtenteils an eine Anleitung von R. I. Pienaar gehalten. Nur bei den DNS Einträgen hatte ich vorübergehend Schwierigkeiten. Im Unterschied zu der Anleitung, habe ich keinen direkten Zugriff auf die Bind Konfigurationsdatei. Stattdessen muss ich die Administrationsoberfläche meines Hosting Providers SERVER4YOU verwenden. Anstatt umständlich das Format der notwendigen Einträge in der Domainverwaltung zu beschreiben, ist hier ein Screenshot von meinen korrekten, funktionierenden Einstellungen:

DNS Einstellungen für DKIM

Man beachte, dass in der oberen Zeile kein v= Eintrag vorkommt und dass ich weder Anführungszeichen noch Backslashes verwende.

Virtuelle Übersiedlung

Die vergangene Woche hat ein paar virtuelle Neuerungen gebracht. Ich habe meinen privaten Server auf eine neue Hardware umgezogen. Tatsächlich geht es zwar genau genommen um virtualisierte Hardware, aber mit dem Umzug haben sich die diversen Ressourcenlimitierungen nach oben verschoben, sprich mehr Speicher und mehr Leistung.

Redmine

Der Grund für die doch etwas aufwendige Aktion war ein mehr oder weniger fehlgeschlagener Versuch, die das Projektmanagement-Tool Redmine als Ersatz für das bisher eingesetzte Trac auszuprobieren. Leider stieß mein alter Server dabei an seine Grenzen und verweigerte für kurze Zeit sogar die Annahme von E-Mails.

Weil ich einen Umstieg schon seit einem Jahr immer wieder überlegte, nahm ich die Situation zum Anlass um mit meinem Provider die Optionen zu besprechen. Mir wurde ein Upgrade angeboten, das sich heute leider als ungültig erwiesen hat. Letztendlich ist der einzige Unterschied eine Monatsmiete, weil ich beide Verträge nur mit einmonatiger Bindung abgeschlossen habe.

Den für Redmine notwendigen Ruby Stack habe ich aus den aktuellen Quellen selbst kompiliert, weil die Versionen in den CentOS Repositories für diese junge Software stark veraltet sind. Ruby stellt mit den gut unterstützen Gems eine gute eigene Paketverwaltung bereit.

CentOS

Weil ich auf meinem Laptop seit einiger Zeit auf die Linux Distribution Fedora setze, habe ich meine Distributionswahl am Server überdacht und statt Debian auf das Fedora-ähnliche aber auf den Servereinsatz aufgelegte CentOS gesetzt. Vom Geist der Revolution beflügelt, habe ich mich auch gleich versuchsweise von Apache als Webserver verabschiedet und auf Nginx umgestellt. Die gerade angezeigte WordPress wird entsprechend von PHP-FPM ausgeführt.

Für die Mailserver Infrastruktur verlasse ich mich weiterhin auf das bewährte Gespann von Dovecot und Exim. Weil mein Server meine zentrale Sammelstelle für alle E-Mail Konten ist (per Fetchmail), wollte ich hier nichts riskieren und sah auch wirklich keinen einzigen Grund für eine Veränderung.

VCS

Meine alten Subversion Repositories habe ich natürlich unverändert kopiert. Daneben habe ich mit Hilfe von Gitosis eine für meine Zwecke perfekte Git Verwahltung eingerichtet, die (wie svn+ssh) unter einem einzelnen Systemaccount und einer Sammlung von autorisierten öffentlichen Schlüsseln beliebig viele Git Repositories mit getrennt einstellbaren Zugriffsrechten zur Verfügung stellt. Nebenbei war die Unterstützung von Git und Subversion einer der Mitgründe für den Umstieg von Trac auf Redmine.

Fertig

Also genug Fachjargon. Fazit: Ich habe einige glückliche Stunden mit meiner virtuellen „Immobilie“ verbracht. Nur damit die Änderungen nach außen hin nicht völlig unbemerkt bleiben habe ich auch gleich das WordPress Motiv geändert.