Kategorien

Navigation

Feeds/Meta

Blog RSS Feed 
Kommentare RSS Feed 

Bloggeramt.de 
Blogverzeichnis 
Add to Technorati Favorites 
SpamPoison

josupeit.com > Weblog > Informatik und Technik > Linux und Serversoftware > Spamannahme verweigern mit Postfix und Postprox

Spamannahme verweigern mit Postfix und Postprox

Datum:   22.10.2009, 20:03 Uhr
Kategorie:   Linux und Serversoftware Feed dieser Kategorie abonnieren
Kommentare:   0, Neuen Kommentar schreiben

Wenn Sie einen eigenen Mailserver betreiben, haben Sie sich vielleicht auch schon gefragt wie es möglich ist, die Annahme von Spam oder mit Viren infizierter Nachrichten direkt zu verweigern, denn jede zurückgewiesene Mail ist dann nicht mehr Ihr Problem, sondern das des versendenden Mailservers.

Der Mail Transfer Agent (MTA) Postfix bietet hierfür geeignete Schnittstellen an, wie z.B. sogenanntes Pre-Queue Filtering. Dabei wird die eingehende Mail bevor sie in die Mail-Warteschlange aufgenommen wird bereits an einen SMTP-Proxy weitergegeben, das heißt, Postfix stellt die Mail einem anderen Mailserver zu, der idealerweise auf dem selben Host läuft. Dieser auf einen Anwendungsfall spezialisierte Mailserver ist jedoch nicht dafür zuständig, die Mail letztlich zuzustellen, sondern agiert als sogenannter Proxy. Er führt auf der ihm zugestellten Mail seine "Arbeit" aus, wie z.B. die Untersuchung auf Spam mittels SpamAssassin und gibt die Mail dann wahlweise wieder an Postfix zurück oder weist sie mit einem entsprechenden Statuscode ab. In letzterem Fall wird dann schließlich die Annahme verweigert.

Der in diesem Beispiel verwendete SMTP-Proxy nennt sich postprox. Postprox ist ein Programm, dass vom Standardeingabestream die eingehende E-Mail-Kommunikation erwartet und an einen anderen Server (eine weitere "Instanz" von Postfix) direkt weiterleitet, mit Ausnahnme des DATA Blocks (siehe auch: Funktionsweise des SMTP-Protokolls bei Wikipedia). Dieser Block wird nach Beendigung zunächst an ein über das Kommandozeilenargument -c angegebenes Programm weitergegeben. Der Rückgabewert dieses Programms soll im fehlerfreien Fall 0 und im Fehlerfall 1 sein, denn basierend auf diesem Rückgabewert wird der MTA die Mail annehmen (0) oder verweigern (1). Dabei wird der gesamte DATA Block zuvor in einer temporären Datei gespeichert, die das von Postprox aufgerufene Programm über die Umgebungsvariable $EMAIL öffnen kann (weitere Umgebungsvariablen finden sich in der Manpage von Postprox).

Möchte man, wie oben angedeutet, die Nachricht mit SpamAssassins spamc untersuchen, eignet sich folgendes Skript, dass beispielsweise unter /usr/bin/postprox_spamc_wrapper gespeichert wird:

#!/bin/sh
SPAMC=/usr/bin/spamc

$SPAMC -E <$EMAIL > $OUTFILE 2>/dev/null
STATUS=$?

if [ $STATUS -eq 1 ] ; then
  echo 550 Message is considered to be spam 1>&2
  exit 1
fi

exit 0


Nun muss postprox in den MTA eingebunden werden. Dazu wird Postfix' Konfigurationsdatei main.cf um folgende Zeile ergänzt:

smtpd_proxy_filter = 127.0.0.1:10024


Dadurch wird Postfix versuchen, eingehende Mails bereits vor der Warteschlange an den Proxy weiterzugeben, der lokal auf Port 10024 lauscht. Damit dort jedoch überhaupt jemand lauscht, muss nun noch die Date master.cf angepasst werden:

[127.0.0.1]:10024 inet n     n     n     -     20     spawn
        user=cyrus argv=/usr/lib/postfix/postprox -r -c /usr/bin/postprox_spamc_wrapper 127.0.0.1:10025


In dieser Zeile muss ggf. noch der Benutzername, sowie der Pfad zu postprox angepasst werden. Diese Zeile bewirkt, dass Postfix dafür sorgt, dass Postprox selbst nun auf Port 10024 auf eingehende Daten wartet und diese an den SMTP-Server auf dem lokalen Port 10025 weiterleitet. Auf diesem Port muss nun Postfix selbst wieder lauschen, dafür genügt folgender Eintrag in der Datei master.cf:

[127.0.0.1]:10025 inet n     -      n     -     -     smtpd
        -o smtpd_proxy_filter=
        -o mynetworks=127.0.0.1/32
        -o smtpd_authorized_xforward_hosts=127.0.0.1/32
        -o smtpd_client_restrictions=
        -o smtpd_data_restrictions=
        -o smtpd_end_of_data_restrictions=
        -o smtpd_helo_restrictions=
        -o smtpd_recipient_restrictions=permit_mynetworks,reject_unauth_destination
        -o smtpd_sender_restriction=
        -o receive_override_options=no_unknown_recipient_checks


Nach einem Neustart von Postfix wird dieser nun die Mais zunächst annehmen und an Postprox weiterreichen. Postprox wird mittels SpamAssassin prüfen, ob es sich um Spam handelt (Konfiguration von SpamAssassin beachten) und die Mail entweder zurückweisen oder über Port 10025 wieder an Postfix zurückgeben. Erst danach wird die Mail der Warteschlange zugeführt. Als Spam erkannte Mails werden so garnicht erst angenommen.

Auf diesem Weg lassen sich z.B. auch durch Viren infizierte Mails mit Clam AntiVirus überprüfen und früh abweisen. Falls Sie noch weitere Ideen haben, an welche Tools Postprox den DATA Block delegieren kann, bin ich für Kommentare dankbar. :-)



Bisherige Kommentare: RSS Feed der Kommentare
Keine
Bisherige Trackbacks:
Keine