- Mitglied seit
- 19. Aug 2008
- Beiträge
- 18.275
- Punkte für Reaktionen
- 4
- Punkte
- 0
Hier also die versprochene kleine Anleitung zum Einbau von Spamassassin in den Zustellungsprozess von Postfix
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 (Stichworte für die Suche: purzel und dovecot und dann den Thread mit den meisten Posts )
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
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
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
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
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.
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
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 SMTP Restriktionen 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.
Damit der Postfix die veränderten Config Files sofort einliest kann man als root auf der Konsole
eingeben. Der Postfix sollte das Neuladen mit einer Meldung quittieren.
Das ist also der gestern versprochene (oder angedrohte ) Beitrag zu Postfix und Spamassassin.
@itari
Ein Wiki Beitrag folgt in Kürze.
Da möchte ich dann noch ein bisschen mehr zu den Möglichkeiten von spamassassin und dessen Regelwerk dazu schreiben. V.a. die automatische Aktualisierung der Regeln mit Servern im Internet erhöht die Trefferquote auf nahezu 100% (geht aber auch heftig auf die Performance)
Gruss
tobi
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 (Stichworte für die Suche: purzel und dovecot und dann den Thread mit den meisten Posts )
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
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 $?
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
Code:
# ==========================================================================
# service type private unpriv chroot wakeup maxproc command + args
# (yes) (yes) (yes) (never) (100)
# ==========================================================================
smtp inet n - n - - smtpd
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
Code:
smtp inet n - n - - smtpd
-o content_filter=spamfilter:dummy
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.
Code:
spamfilter unix - n n - - pipe
flags=Rq user=USER argv=/PATH/spamfilter.sh -f ${sender} -- ${recipient}
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
Code:
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 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 SMTP Restriktionen 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.
Damit der Postfix die veränderten Config Files sofort einliest kann man als root auf der Konsole
Code:
$ postfix reload
Das ist also der gestern versprochene (oder angedrohte ) Beitrag zu Postfix und Spamassassin.
@itari
Ein Wiki Beitrag folgt in Kürze.
Da möchte ich dann noch ein bisschen mehr zu den Möglichkeiten von spamassassin und dessen Regelwerk dazu schreiben. V.a. die automatische Aktualisierung der Regeln mit Servern im Internet erhöht die Trefferquote auf nahezu 100% (geht aber auch heftig auf die Performance)
Gruss
tobi