Spamerkennung mit Postfix und Spamassassin

  • Ab sofort steht euch hier im Forum die neue Add-on Verwaltung zur Verfügung – eine zentrale Plattform für alles rund um Erweiterungen und Add-ons für den DSM.

    Damit haben wir einen Ort, an dem Lösungen von Nutzern mit der Community geteilt werden können. Über die Team Funktion können Projekte auch gemeinsam gepflegt werden.

    Was die Add-on Verwaltung kann und wie es funktioniert findet Ihr hier

    Hier geht es zu den Add-ons

Status
Für weitere Antworten geschlossen.

jahlives

Benutzer
Registriert
19. Aug. 2008
Beiträge
18.275
Reaktionspunkte
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
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
Code:
# ==========================================================================
# 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
Code:
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.
Code:
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
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 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
Code:
$ postfix reload
eingeben. Der Postfix sollte das Neuladen mit einer Meldung quittieren.

Das ist also der gestern versprochene (oder angedrohte ;)) Beitrag zu Postfix und Spamassassin.
@itari :D
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
 
Wiki-Beitrag
Den Teil zu den Regeln im Spamassassin werde ich nachreichen

Gruss

tobi
 
zum thema spam noch einen tip: strato hat einen ganz hervorragenden spamfilter. wenn man seine mails in eine strato mailbox weiterleitet und von dort abruft, bleibt fast nichts überig, d.h. es kommen grob geschätzt pro woche so ca. 5 spams durch, bei 300+ pro tag.

das schöne daran: ich konnte bisher keine falscherkenung feststellen. den spamfilter kann man auch nirgendwo deaktiveren, von daher habe ich die vermutung das nur 100% erkannte spams gelöscht werden.
 
Dasselbe gilt für den Schweizer Provider cyon. Spamdurchlass praktisch null.

Daher einmal mehr: würden die Provider ihre Verantwortung ernst nehmen wäre das Thema längst mehr oder weniger vom Tisch
 
Mein Provider verwendet auch gute Spamfilter. Ebenfalls gmail. Nur sind sie so gut, das nix an meinen Postfix durchkommt und der damit keine wirklichen Trainingsdaten hat, um besser Spam zu finden.
Drum habe ich die Filter bei all meinen externen Accounts deaktiviert, damit soviele Spams wie möglich im Eingang landen, die ich danach auf Postfiy loslassen kann
 
Übrigens bezieht sich Eure Aussage bezüglich der Filter bei den Providern auf POP/IMAP Accounts.
Nur weil der Provider Spitzenspamfilter hat, heisst das nicht, dass auch die Spamerekennung via SMTP (lokal bei Euch) etwas davon hat. Der Spamassassin braucht einfach genügend Spam, um seine Fähigkeiten zu verbessern. Lieber keinen Spamassassin als einen untrainierten Filter ohne Regeln (sonst sind false positives vorporgrammiert)
 
zum thema spam noch einen tip: strato hat einen ganz hervorragenden spamfilter. wenn man seine mails in eine strato mailbox weiterleitet und von dort abruft, bleibt fast nichts überig, d.h. es kommen grob geschätzt pro woche so ca. 5 spams durch, bei 300+ pro tag.

Das kann ich leider nicht bestätigen; gerade in letzter Zeit (paar Monate) kommt wieder verstärkt Spam an (ca. 5 Spam/Tag bei nur ca. 20-30 Mails gesamt im fraglichen Strato-Postfach), wobei es sich durchweg um - für Menschen - offensichtlichen Spam handelt, regelmäßig schon am Betreff erkennbar.

das schöne daran: ich konnte bisher keine falscherkenung feststellen. den spamfilter kann man auch nirgendwo deaktiveren, von daher habe ich die vermutung das nur 100% erkannte spams gelöscht werden.

Stimmt; davon habe ich auch nichts bemerkt. Allerdings wäre es auch ein Hammer und u. U. auch strafrechtlich von Belang, wenn ein Provider Mail löschen würde ohne Einverständnis und Einstellmöglichkeit, die nicht ohne jeden denkbaren Zweifel mißbräuchlich ist.

Gruß
Peter
 
afaik darf ein Provider nur virenverseuchte Email ungefragt löschen. Spam oder Spamverdächtiges darf nicht einfach so gelöscht werden (viele Provider bieten hier spezielle Spamordner). Einzig darf der Provider beim SMTP Empfang direkt eine Email verweigern, sobald er sie jedoch aktzeptiert hat, darf er sie afaik nicht einfach so aus dem Zustellungsprozess löschen.
 
Würde mich gerne nun näher dem Thema Spamassassin widmen und installieren - nutze aber die Mailstation ohne getmail funktion...

... ist dieses Voraussetzung oder kann Spamassassin direkt auf die Mailstation installiert werden?
 
Du kannst natürlich spamassassin auch ohne getmail installieren. getmail ist keine Voraussetzung für spamassassin. Der Einbau ohne getmail ist relativ einfach und du kannst dich mal an http://www.synology-wiki.de/index.php/Postfix_und_Spamassassin halten.
Es werden jedoch Probleme bei spamassassin und den Perl Versionen auf gewissen Diskstations gemeldet. Bei meiner DS107+ kriege ich spamassassin wegen Fehlermeldungen nicht gestartet, auf meiner DS408 hingegen funzt es sehr zuverlässig.
 
Klasse, danke dir für die Infos!
 
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.

Sorry, das ich hier nun anfange nacheinander Fragen zu stellen, aber denke auch für Andere sind die Fragen recht interessant...

daher:

Wenn hier geschrieben wird "es wird ein kurzer 3Zeiler" erzeugt... dann stellt sich mir die Frage: Wohin? Und wie sollte die Datei lauten - oder hab ich das falsch verstanden und es muss in die Master.cf?

Danke!
 
Der Name und der Speicherort der Datei ist vollkommen Wurst. Du trägst den Pfad zur Datei ja in master.cf ein. Wichtig ist nur, dass der User unter dem der Filter läuft diese Datei auch lesen darf. Letzendlich ist es egal wo sie liegt.

Gruss

tobi
 
Hi Tobi

demnach muss ich die Datei mit chmod noch anpassen? Wenn ja, mit welcher Berechtigung? 777 ist ja übertrieben oder?

Und gleich noch die nächste Frage:

Wenn ich die spamfilter.sh testweise ausführen will, dann hängt die sich auf, bzw. es geschieht nichts...

Werde aber das Gefühl nicht los, das ich den lächerlichen Fehler mit dem " | " im Text gemacht habe, denn ich habe

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

genau so erzeugt, aber den durchgehenden | kann ich ja nur als geteilten "|" in der vi Oberfläche generieren... ist das einfach nur ein anderes aussehen oder warum erscheint einfach nix?
 
Zuletzt bearbeitet:
genau so erzeugt, aber den durchgehenden | kann ich ja nur als geteilten "|" in der vi Oberfläche generieren... ist das einfach nur ein anderes aussehen oder warum erscheint einfach nix?
Meinst du ¦ anstelle von |?
Das geht nicht gut. Normalerweise ist die Pipe (|) mit AltGr+7 zu erreichen. Gerade bei Linux ist es aber meist AltGr+1
Auf jeden Fall muss es ein durchgehender Strich sein, um als Pipe durchzugehen. Die Rechte mit 777 sind viel zu viel! Bestenfalls der User unter dem der Filter ausgeführt wird sollte Schreibrechte haben, der Rest sollte mit dieser Datei gar nichts machen dürfen. Eigentlich müsste der User unter dem der Filter läuft auch nur mit Lese-Ausführrechten auskommen.
 
Meinst du ¦ anstelle von |?
Das geht nicht gut. Normalerweise ist die Pipe (|) mit AltGr+7 zu erreichen. Gerade bei Linux ist es aber meist AltGr+1
Auf jeden Fall muss es ein durchgehender Strich sein, um als Pipe durchzugehen. Die Rechte mit 777 sind viel zu viel! Bestenfalls der User unter dem der Filter ausgeführt wird sollte Schreibrechte haben, der Rest sollte mit dieser Datei gar nichts machen dürfen. Eigentlich müsste der User unter dem der Filter läuft auch nur mit Lese-Ausführrechten auskommen.

Ich habs geahnt ;) Mit sicherlich ne lächerliche Frage für Linux Kenner, aber mir wars unbekannt...

cool wirds nun für mich, da ich an nem Laptop arbeite und mir ne andere Lösung einfallen lassen muss... denn "Pipe" | gibts unter diesem Layout nicht ;( ... wie cool!

-> Ergänzung: Ich scheitere tatsächlich am Pipe! Will ich AltGr + < klicken, so kommt das falsche Zeichen. Das | geht zwar hier im Forum unter der besagten Taste, aber nicht via Telnet auf der DS...

und nu? Idee?
 
Ich habs geahnt ;) Mit sicherlich ne lächerliche Frage für Linux Kenner, aber mir wars unbekannt...

cool wirds nun für mich, da ich an nem Laptop arbeite und mir ne andere Lösung einfallen lassen muss... denn "Pipe" | gibts unter diesem Layout nicht ;( ... wie cool!
Pipe ist garantiert auch bei deinem Laptop vorhanden. Denn dabei handelt es sich um ein ASCII Zeichen und normalerweise hat jede Tastatur alle "anzeigbaren" ASCII Zeichen vorhanden
 
Nicht lachen, aber diese Taste wird weder als Symbol aufm Laptop angezeigt, noch ist mir eine Kombination bekannt, wie ich "Pipe" nutzen könnte...

Es ist aber auffällig, das hier im Forum das | richtig dargestellt wird, aber dieses als "Unterteilter Strich" auf meinem Keyboard abgebildet wird und genau so dann auch (leider) im Telnet eingetragen....
 
Der senkrechte Strich | auf der Tastatur wo auch das < und > Zeichen drauf ist, ist das Pipe-Zeichen. Ob das mal durchbrochen oder ganz durchgehen angezeigt wird, ist abhängig vom verwendeten Zeichensatz.

Man kann auf der Kommandozeile das auch immer schnell testen, wenn man sich nicht ganz sicher fühlt:

Rich (BBCode):
ls -l / | wc -l

Itari
 
Status
Für weitere Antworten geschlossen.
 

Kaffeautomat

Wenn du das Forum hilfreich findest oder uns unterstützen möchtest, dann gib uns doch einfach einen Kaffee aus.

Als Dankeschön schalten wir deinen Account werbefrei.

:coffee:

Hier gehts zum Kaffeeautomat