Postfix und Spamassassin

Aus Synology Wiki
Wechseln zu: Navigation, Suche

About

Dass man Spamassassin sehr gut zusammen mit dem Dovecot (POP3/IMAP) Server zum Leeren von externen Mailboxen brauchen kann, hat purzel hier im Forum schon sehr gut beschrieben.

Ich möchte im Folgenden den überraschend einfachen Einbau von Spamassassin in den SMTP Server vorstellen. Das Beispiel von Spamassassin kann man auch dazu verwenden um nahzu jeden Dienst an Postfix anzubinden (z.B. clamav oder ganze Content Filter Systeme)

Voraussetzungen

  • sendmail
  • spamassassin
  • neuer Benutzer inkl Homeverzeichnis

Ich selber habe mir schon vor längerer Zeit sendmail mittels ipkg installiert. Die grundsätzliche Voraussetzung ist also das korrekte Funkionieren von sendmail. Ich kann aber leider nicht sagen ob es mit dem Default sendmail und dessen Konfig (in der neusten FW dabei) auch funzt. Mein Beispiel setzt auf das ipkg-sendmail. Müsste aber (dies ohne Garantie) auch mit dem Default sendmail laufen. Neben sendmail muss auch Spamassassin auf der DS installiert sein (via ipkg), zusammen mit allen benötigten Perl Modulen (sollten automatisch mitinstalliert werden) Ein neuer Benutzer unter dessen Kennung der Filter ausgeführt wird. Achtet darauf, dass der User ein korrektes Homeverzeichnis hat (dort drin legt Spamassassin in .spamassassin seine Konfig Files ab)

How

Das Ganze ist wirklich erschreckend einfach umzusetzen. Es braucht ein neues File und zwei, drei Einträge in der Postfix Config (diesmal die master.cf). Zuerst also zum Filterscript. Das ist ein kurzer Dreizeiler Code:

#!/opt/bin/bash
/opt/bin/spamc | /opt/sbin/sendmail -i "$@"
exit $?

Wie ihr seht verwende ich hier den Sendmail von ipkg. Testet es mit dem Default sendmail und schaut obs funzt. Speichert die Datei am besten in einem alternativen Postfix Verzeichnis, damit die Datei ein FW Update überlebt. Diese Datei sollte World-executable sein.

Merkt euch den Dateinamen und Pfad und öffnet die master.cf Datei eures Postfix Servers. Diese Datei ist für die "Dienste" des SMTP Servers verantwortlich. Dort drin sollte am Anfang etwas wie

# ==========================================================================
# service type  private unpriv  chroot  wakeup  maxproc command + args
#               (yes)   (yes)   (yes)   (never) (100)
# ==========================================================================
smtp      inet  n       -       n       -       -       smtpd

stehen. Wichtig: Zwischen den einzelnen Optionen MUSS ein Tab stehen. Es darf kein Leerzeichen verwendet werden oder der Postfix crashed jämmerlich zu Boden.

Diesen ersten Eintrag muss man anpassen und zwar im einfachsten Fall folgendermassen

# ==========================================================================
# service type  private unpriv  chroot  wakeup  maxproc command + args
#               (yes)   (yes)   (yes)   (never) (100)
# ==========================================================================
smtp      inet  n       -       n       -       -       smtpd
  -o content_filter=spamfilter:dummy

JEDE "Unter"-zeile MUSS mit einem einzelnen Leerzeichen!! eingeleitet werden. Sonst geht der Postfix von einer neuen Hauptzeile aus. Ausserdem steht hier zwischen -o und dem Rest ein einzelnes Leerzeichen (und KEIN Tab) Dann folgen in der master.cf noch etliche weitere Einträge. Weiter unten kommt ein auskommentierter Eintragzu maildrop. Unmittelbar danach muss man jetzt den oben eingesetzten Filter definieren.

spamfilter unix  -      n       n       -       -       pipe
 flags=Rq user=USER argv=/PATH/spamfilter.sh -f ${sender} -- ${recipient}

Wiederum stehen zwischen den Optionen der ersten Zeile Tabs und bei der zweiten Zeile wiederum Leerzeichen. Auch diese zweite Zeile muss eingerückt werden. (Leerzeichen) USER ist der Name des Users den ihr angelgt habt und PATH der Pfad zu dem oben erstellen Shellscript.

Verbesserung

Obige Konfig hat einen entscheidenden Nachteil. Es wird sämtlicher Mailverkehr an der LAN Schnittstelle des Servers gefiltert. Somit werden auch Emails, die ihr von euren lokalen Clients ins Internet sendet mit Spamassassin geprüft. Das geht auf die Performance und ist echt unnötig.

Und wieder bietet die master.cf das elegante Hilfsmittel dazu. Postfix kann auf der gleichen IP auf mehreren Ports lauschen und den Verkehr auf den untrschiedlichen Ports auch unterschiedlich behandeln. Also legt man am besten einen zweiten Eintrag für smtp auf einem nicht aus dem Inet erreichbaren Port an. Dieser Port wird dann ohne Spamassassin bedient und Clients aus dem LAN können Emails ungefiltert versenden

# ==========================================================================
# service type  private unpriv  chroot  wakeup  maxproc command + args
#               (yes)   (yes)   (yes)   (never) (100)
# ==========================================================================
192.168.0.23:25      inet  n       -       n       -       -       smtpd
 -o content_filter=spamfilter:dummy
192.168.0.23:2525       inet    n       -       n       -       -       smtpd
 -o receive_override_options=no_header_body_checks

Der erste Eintrag wird um die LAN IP und öffentliche SMTP Port Nummer ergänzt. So gilt die zweite Zeile nur für den Port 25 Der zweite Eintrag lässt Postfix am nicht-öffentlichen Port lauschen (2525) und dies ohne Spamassassin Filter. Zusätzlich wird durch no_header_body_checks erreicht, dass bei den Emails auf diesem Port die in main.cf definierten header, body oder mime checks nicht angewendet werden. Darum sollte diese Port nur im LAN zugänglich sein. Wenn ihr also an Port 25 alle Emails mit Viagra im Betreff abschiesst und die Annahme verweigert, dann kann die gleiche Email an Port 2525 problemlos zugestellt werden.

Testen

Damit der Postfix veränderte Config Files sofort einliest kann man als root auf der Konsole

$ postfix reload

eingeben. Der Postfix sollte das Neuladen mit einer Meldung quittieren.

Wenn ihr aber die "Verbesserung" genutzt habt, müsst ihr den Postfix komplett neu starten, weil es durch das Setzen der IP und Ports nicht reicht die config Files neu einzulesen

$ postfix stop
$ postfix start