Dies ist die archivierte Version des Blogs vom 05.01.2017. Aktuelle Beiträge findest du unter thomas-leister.de
 

Wenn man schon längere Zeit einen eigenen Mailserver betreibt und schon die ein oder andere Spam-Mail eingetroffen ist, kommt schnell der Wunsch auf, Spam E-Mails zu erkennen und zu löschen oder in Quarantäne zu verschieben. Was die großen E-Mail Hoster können, kann auch im kleinen gemacht werden. Die Technik ist dieselbe.

Benötigt werden dazu folgende Komponenten: Ein Filtersystem, durch das die E-Mails „geschleift“ werden (Amavis), eine Spamerkennung (Spamassassin) und ggf. ein Filtersystem, das die als Spam erkannten E-Mails in einen anderen IMAP Ordner verschiebt (Sieve).

Spamassassin installieren:

Zuerst wird die Spamerkennung an sich – Spamassassin – installiert. Dazu kommen noch zwei andere Pakete, die die Erkennung verbessern.

sudo -s
apt-get install spamassassin razor pyzor

Spamassassin muss noch aktiviert werden. Das geschieht, indem die Datei /etc/default/spamassassin

ENABLED=1

gesetzt wird. Außerdem sollen die automatischen Spamassassin Updates aktiviert werden, sodass die Spamerkennung immer auf dem aktuellen Stand ist: (am Ende der Datei:)

CRON=1

Nach diesen Änderungen muss spamassassin neu gestartet werden:

service spamassassin restart

Amavis installieren

Amavis ist die eigentliche Filterkomponente. Sie nimmt sich Spamassassin zu Hilfe und markiert Spam E-Mails auf Wunsch oder löscht sie direkt. Postfix wird die eintreffenden Mails später durch Amavis schleifen.

Auch Amavis muss zunächst installiert werden:

apt-get install amavisd-new

Amavis Spamverhalten einstellen

Damit Amavis Spammails behandelt, müssen die Spam Checks aktiviert werden. Bearbeitet die Datei /etc/amavis/conf.d/15-content_filter_mode und entfernt die Kommentarzeichen vor folgenden Zeilen sodass dort steht:

@bypass_spam_checks_maps = (
    \%bypass_spam_checks, \@bypass_spam_checks_acl, \$bypass_spam_checks_re);

Amavis soll Spam E-Mails mit „***SPAM***“ im Betreff Kennzeichnen und zusätzlich einen „X-Spam-Flag“ Header in den E-Mail Queltext schreiben, sodass Mailclients (oder später der Sieve Filter) erkennen können, dass es sich um eine als Spam klassifizierte E-Mail handelt. E-Mails, die ein Spamlevel > 20 erreichen, werden sofort gelöscht.

Dazu wird die Datei /etc/amavis/conf.d/20-debian_defaults wie folgt geändert:

$sa_spam_subject_tag = '***SPAM*** ';
$sa_tag_level_deflt  = undef;
$sa_tag2_level_deflt = 5;
$sa_kill_level_deflt = 20;
$sa_dsn_cutoff_level = 10;   # spam level beyond which a DSN is not sent

Nach den beiden Konfigurationsänderungen wird Amavis neu gestartet:

service amavis restart

Amavis in Postfix integrieren

Postfix muss nun so eingestellt werden, dass eintreffende E-Mails durch den Amavis Filter geschickt werden, sodass sie von Spamassassin kontrolliert werden können.

In die Datei /etc/postfix/main.cf wird folgende Zeile eingefügt:

content_filter=smtp-amavis:[127.0.0.1]:10024

Die Service Konfigurationsdatei /etc/postfix/master.cf wird unten um folgende Zeilen erweitert:

smtp-amavis     unix    -       -       -       -       2       smtp
        -o smtp_data_done_timeout=1200
        -o smtp_send_xforward_command=yes
        -o disable_dns_lookups=yes
        -o max_use=20

127.0.0.1:10025 inet    n       -       -       -       -       smtpd
        -o content_filter=
        -o local_recipient_maps=
        -o relay_recipient_maps=
        -o smtpd_restriction_classes=
        -o smtpd_delay_reject=no
        -o smtpd_client_restrictions=permit_mynetworks,reject
        -o smtpd_helo_restrictions=
        -o smtpd_sender_restrictions=
        -o smtpd_recipient_restrictions=permit_mynetworks,reject
        -o smtpd_data_restrictions=reject_unauth_pipelining
        -o smtpd_end_of_data_restrictions=
        -o mynetworks=127.0.0.0/8
        -o smtpd_error_sleep_time=0
        -o smtpd_soft_error_limit=1001
        -o smtpd_hard_error_limit=1000
        -o smtpd_client_connection_count_limit=0
        -o smtpd_client_connection_rate_limit=0
        -o receive_override_options=no_header_body_checks,no_unknown_recipient_checks

Außerdem werden direkt unter der Zeile für den Dienst „pickup“ (weiter oben) diese beiden Zeilen eingefügt:

    -o content_filter=
    -o receive_override_options=no_header_body_checks

Wer in seiner Postfix Konfiguration main.cf die TLS Security Levels für smtp und smtpd auf eine andere Einstellung als „none“ gestellt hat (Siehe auch: E-Mail Transport verschlüsseln), muss jeweils noch eine Zeile zu jedem neuen Dienst anfügen:

smtp-amavis     unix    -       -       -       -       2       smtp
    [...]
    -o smtp_tls_security_level=none

und

127.0.0.1:10025 inet    n       -       -       -       -       smtpd
    [...]
    -o smtpd_tls_security_level=none

Postfix wird neu gestartet, um die Änderungen zu übernehmen:

service postfix restart

Amavis auf Erreichbarkeit überprüfen

Nun kann kurz getestet werden, ob Amavis erreichbar ist. Außerdem ist es sinnvoll, an dieser Stelle die E-Mail Logdateien nach Fehlern und Warnungen abzusuchen.

telnet localhost 10024

Wenn die Ausgabe

220 [127.0.0.1] ESMTP amavisd-new service ready

lautet, ist alles okay. Der Telnet Client kann über die Eingabe von

"quit"

wieder beendet werden.

Spamerkennung testen

Nun soll die Spamerkennung als ganzes getestet werden. Dazu wird eine E-Mail mit einem beliebigen Betreff an ein E-Mail Konto auf dem Server geschickt. Wichtig ist nur, dass der Nachrichtentest die folgende Zeile enthält:

XJS*C4JDBQADN1.NSBN3*2IDNEN*GTUBE-STANDARD-ANTI-UBE-TEST-EMAIL*C.34X

Wenn diese Mail nicht im Posteingang des Zielkontos erscheint, funktioniert der Spamfilter korrekt. Bei dem Code handelt es sich um eine Zeichenkette, die zum Testen von Spamassassin geeignet ist. Wenn eine E-Mail diesen Code enthält, wird sie sofort als Spam klassifiziert und sofort gelöscht. Sie wird gelöscht, weil sie grundsätzlich das höchste Spam-Level erreicht (also zu 100% Spam ist). Mails, die Spamlevel 20 nicht erreichen, werden nur mit „***SPAM***“ markiert, gelangen aber trotzdem in die Inbox. (siehe dazu Einstellungen zum Avamis Spamverhalten).

Spam E-Mails mit Sieve in Spam Ordner verschieben

Es ist zwar gut, dass Spammails jetzt direkt gelöscht oder im Zweifel mit „***SPAM***“ markiert werden, besser wäre es aber, wenn sie in einen speziellen Spam IMAP Ordner verschoben würden. Der Filter soll E-Mails, die zwischen den Spam-Levels 5 und 20 liegen, in einem speziellen Spam-Ordner ablegen. E-Mails, die ziemlich sicher Spam sind (über Level 20) werden weiterhin direkt gelöscht.

Wie ich in einem anderen Beitrag zu Sieve schon gezeigt habe, können E-Mails nach verschiedenen Kriterien in spezielle Ordner einsortiert werden. Das machen wir uns hier zunutze: Spammails werden von Amavis ja mit „***SPAM***“ im Betreff gekennzeichnet und erhalten zusätzlich noch einen „X-Spam-Flag“ Eintrag im E-Mail Header. Sieve muss nun überprüfen, ob eine Spam Flag in einer E-Mail existiert. Wenn das der Fall ist, wird die E-Mail in den Spam-Ordner verschoben.

Folgendes wird hier vorausgesetzt:

In der Datei /etc/dovecot/dovecot.conf wird ein Sieve „before“ Filter eingerichtet, der immer vor allen anderen Filtern ausgeführt wird. Er soll Spammails erkennen:

sieve_before = /var/vmail/sieve/spam-global.sieve

Die „spam-global.sieve“ Filterdatei wird nun erstellt und mit folgendem Inhalt gefüllt:

require "fileinto";
if header :contains "X-Spam-Flag" "YES" {
    fileinto "Spam";
}

Abspeichern, das war’s auch schon. :)

Jetzt noch Dovecot neu starten:

service dovecot restart

… und Spammails sollten nun in den Spam-Ordner verschoben werden. Um das zu testen, kann man ja eine bereits erhaltene Spammail an sich selbst schicken. Wenn nichts ankommt, wurde die Mail vermutlich „sicher“ als Spam erkennt (Über Level 20) und direkt gelöscht. Sucht euch also keine zu harten Kaliber aus ;)

Weiterführende Beiträge:

 

Quellen: https://help.ubuntu.com/community/PostfixAmavisNew


Post published on 25. Juni 2014 | Last updated on 27. Dezember 2016
Tags:                       

Diesen Blog unterstützen

Wenn Dir der Beitrag gefallen hat, freue ich mich über einen kleinen Obolus :-) Bitcoin QR Code

PayPal-Seite: https://www.paypal.me/ThomasLeister
Meine Bitcoin-Adresse: 15z8 QkNi dHsx q9WW d8nx W9XU hsdf Qe5B 4s

Siehe auch: Unterstützung

Informationen zum Autor

Thomas Leister

Geb. 1995, Kurzhaar-Metaller, Geek und Blogger. Nutzt seit Anfang 2013 ausschließlich Linux auf Desktop und Servern. Student der Automobilinformatik an der Hochschule für angewandte Wissenschaften in Landshut.

32 thoughts on “Postfix: Amavis Spamfilter mit Spamassassin und Sieve

  • Hallo Thomas,

    danke für Deine super Anleitungen!
    Hier ein kleiner Fehler: „Dazu wird die Datei /etc/amavis/conf.d/20-debian-defaults wie folgt geändert:“
    Ist zwar nur eine Lappalie aber dennoch gehört da ein Unterstrich hin. —–^
    (20-debian_defaults)

  • Hallo Thomas,

    vielen Dank für deine Anleitungen! Echt spitze, einfach verständlich, präzise, alles erklärt und zuverlässig!
    Habe schon ein paar Mailsysteme in den letzten Jahren unter Linux aufgesetzt – das ging aber noch nie so schnell wie mit deinen Anleitungen. Spitze :)
    Eine Kleinigkeit hat bei mir nicht funktioniert; nach der Integration von Spamassassin in Amavis wie oben beschrieben hat Spamassassin keinerlei Mails markiert (weder Subject noch X-Spam Headers), obwohl laut mail.log bestimmte Mails mit Hits > sa_tag2_level_deflt dabei waren.
    Schlussendlich musste ich unten in /etc/amavis/conf.d/20-debian_defaults noch diese Zeile anfügen und amavis neu starten, jetzt funktionierts
    @local_domains_acl = (‚.‘);

    Viele Grüsse
    Michael

    • Erstmal danke an Thomas für die Anleitung.
      Ich hatte das selbe Problem und die Lösung hat funktioniert. Auch danke dafür.
      VG

  • Hallo!

    Diese Anleitung ist schon mal nicht schlecht (habe soeben Spamassassin in Postfix eingeklinkt), allerdings treibt mich eine Sache noch um: Aus irgendeinem Grund weigert sich Spamassassin standhaft, die Mail mit dem Teststring (siehe „Spamerkennung testen“) ins Nirwana zu schicken, und stattdessen läuft sie bei mir im Posteingang auf.
    Irgendeine Idee, was hier schiefläuft? Ich habe /etc/amavisd.conf an die unter „Amavis Spamverhalten einstellen“ genannten Werte angepaßt, doch es passiert nichts in dieser Hinsicht (die von Spamassassin einzufügenden Header werden anstandslos eingefügt). Was mich u. a. verwundert hat ist die Tatsache, daß die einzelnen Schwellwerte mit einer Nachkommastelle angegeben waren ($sa_tag_level_deflt = 2.0; $sa_tag2_level_deflt = 6.2; $sa_kill_level_deflt = 6.9; waren die Standardvorgaben) anstatt als Ganzzahlen…

  • Hallo,
    mit:

    „Wer in seiner Postfix Konfiguration main.cf die TLS Security Levels für smtp und smtpd auf eine andere Einstellung als „none” gestellt hat (Siehe auch: E-Mail Transport verschlüsseln), muss jeweils noch eine Zeile zu jedem neuen Dienst anfügen:“ ,

    meinst du die Installation nach dieser Anleitung?:

    https://legacy.thomas-leister.de/internet/erweiterte-postfix-ssltls-konfiguration-verschluesselte-server-server-verbindungen/

    Oder ist da noch etwas anderes gemeint?

    Danke und viele Grüße
    Frank

  • Hallo Thomas,
    Spitzenanleitung, Danke!
    Einen Spamfilter auf dem Server in weniger als 5 Minuten installiert, genial!

  • Hi Thomas,

    super Anleitungen in Deinem Blog!
    Ich habe postfix, dovecot, roundcube, spamassassin, amavis, … nach Deinen Anleitungen installiert.
    Funktioniert alles, bis auf amavis/spamassassin.
    Die Mails werden einfach nicht gescannt, weder in den Mail Headern noch in /var/log/mail.log findet sich irgend ein Hinweis, dass amavis etwas machen würde.
    Ich habe inzwischen 10 mal gecheckt, dass alles korrekt konfiguriert ist und sehr viel im Internet gesucht und rumprobiert, ohne Erfolg.

    Kann es sein, dass das daran liegt, dass ich „lokal“ teste?
    Ich schicke die Mails mittels roundcube bzw. mailx, also ist alles „lokal“, es gibt keine remote connection zum smtp.
    Nach meinem Verständnis sollte das keinen Unterschied machen, ist aber das einzige, was ich mir noch vorstellen kann.

    Viele Grüße, Anton

    • Ok, ich habe das Problem gelöst!
      War dann doch wie vermutet.
      smtp ist beim lokalen Testen mit Roundcube niemals involviert.
      Ich habe zum Testen nun folgendes gemacht in der master.cf geändert:

      pickup unix n – – 60 1 pickup
      -o content_filter=smtp-amavis:[127.0.0.1]:10024
      -o receive_override_options=no_header_body_checks

      Somit verwendet „pickup“ auch den amavis als content filter und schon sehe ich die Header in meiner Testmail:

      X-Spam-Flag: NO
      X-Spam-Score: -0.001
      X-Spam-Level:
      X-Spam-Status: No, score=-0.001 tagged_above=-9999 required=5
      tests=[NO_RELAYS=-0.001] autolearn=ham autolearn_force=no

      Ist es nicht eventuell sinnvoll, das generell unter „pickup“ einzutragen?

      Ansonsten könntest Du das vielleicht in den Beitrag aufnehmen, damit auch andere User so „lokal“ testen können!?

      Viele Grüße, Anton

  • Hallo Thomas,

    wäre es eventuell noch möglich, dass du noch ein Tutorial dazu erstellst, wie man das ganze auch auf die ausgehenden Mails anwendet (Viruscheck und Spam), und die Operation abbricht, sodass die Mail garnicht erst versendet wird?

    LG

    Daniel

  • Hallo Thomas,

    vielen Dank für das tolle Tutorial. Ich habe alle beschriebenen Schritte so durchgeführt. Leider erhalte ich beim Start des spamassassin folgende Warnung:

    Restarting SpamAssassin Mail Filter Daemon: Mar 20 16:55:47.311 [13368] warn: logger: failed to add syslog method: logger: syslog initialization failed
    spamd.

    Was kann ich dagegen tun?

    Viele Grüße,

    Daniela.

  • Hallo Thomas,

    wenn amavis den Betreff einer Mail ändern soll, wenn es sich um Spam handelt, muss noch folgende Option gesetzt werden. Bei Debian ist die per default aus (bzw. nicht vorhanden):

    $sa_spam_modifies_subj = 1;

    Cheers,
    Marco

  • Rüdiger Pretscher

    Hallo Thomas,

    eine Super Anleitung bekpmme allerdings bei dem Restart von Spamassassin folgende Fehlermeldung:

    Restarting SpamAssassin Mail Filter Daemon: No /usr/bin/perl found running; none killed.
    server socket setup failed, retry 1: spamd: could not create IO::Socket::INET6 socket on [::1]:783: Cannot assign requested address
    server socket setup failed, retry 2: spamd: could not create IO::Socket::INET6 socket on [127.0.0.1]:783: Address already in use
    server socket setup failed, retry 3: spamd: could not create IO::Socket::INET6 socket on [127.0.0.1]:783: Address already in use
    server socket setup failed, retry 4: spamd: could not create IO::Socket::INET6 socket on [127.0.0.1]:783: Address already in use
    server socket setup failed, retry 5: spamd: could not create IO::Socket::INET6 socket on [127.0.0.1]:783: Address already in use
    server socket setup failed, retry 6: spamd: could not create IO::Socket::INET6 socket on [127.0.0.1]:783: Address already in use
    server socket setup failed, retry 7: spamd: could not create IO::Socket::INET6 socket on [127.0.0.1]:783: Address already in use
    server socket setup failed, retry 8: spamd: could not create IO::Socket::INET6 socket on [127.0.0.1]:783: Address already in use
    server socket setup failed, retry 9: spamd: could not create IO::Socket::INET6 socket on [127.0.0.1]:783: Address already in use
    spamd: could not create IO::Socket::INET6 socket on [127.0.0.1]:783: Address already in use

    Nachdem das mein erste Mailserver ist weis ich hier nicht mehr weiter.
    Kanns Du mir hier weiterhelfen.

    Gruß,
    Rüdiger

  • Hi Thomas,
    darf ich dich kurz etwas fragen zur Installation von Spamassassin gemäss deiner Anleitung auf https://legacy.thomas-leister.de/open-source/linux/ubuntu/postfix-amavis-spamfilter-spamassassin-sieve/

    Du schreibst:
    Außerdem werden direkt unter der Zeile für den Dienst „pickup“ (weiter oben) diese beiden Zeilen eingefügt:
    -o content_filter=
    -o receive_override_options=no_header_body_checks

    In master.cf gibt es zwar “pickup”, aber direkt darunter erscheint mir diese Syntax zumindest “optisch” nicht richtig. Und … auch beim Restarten meldet der Dienst einen Fehler an der Stelle.

    • Thomas Scherner

      Hallo Thomas erstmal Super erklärt doch ich habe auch Probleme mit dem Eintrag unter Pickup.
      Trage ich es so ein:
      kommt eine Fehlermeldung in der Zeile 25
      Deine Version:
      -o content_filter=
      -o receive_override_options=no_header_body_checks

      Auch bei dieser Version kommt die Fehlermeldung ab Zeile 25:
      #628 inet n – – – – qmqpd
      pickup fifo n – – 60 1 pickup
      -o content_filter=smtp-amavis:[127.0.0.1]:10024
      -o receive_override_options=no_header_body_checks

      Kannst du da Bitte helfen??

      Danke auch vom Thomas

  • Hallo Thomas,

    Vielen Dank für diese tolle Anleitung!

    Bei mir gab es einen Fehler bei der Installation von amavisd-new. Dieser Fehler ist aber bekannt.
    Die Lösung bei mir: Der Ordner /var/lib/amavis musste erstellt werden. Danach hat die Installation von amavisd-new geklappt.

    Grüße
    Kevin

  • Hallo,
    erstmal danke für die Anleitung-.
    nun hab ich die konfigurationen bis Spamerkennung Testen durchgefürt.
    nun werden keine mails mehr weitergeleitet sondern bleiben in der Mail Queue liegen mit dem hinweis: „“ lost connection with 127.0.0.1[127.0.0.1] while receiving the initial server greeting “
    versende ichmails bleiben diese auch dort in der Mail Queue liegen.

    kann es sein das dort ein fehler sich eingeschlichen hat ? und wenn ja jemand eine idee welcher ?

  • schuld für das nicht empfangen und senden können ist dieser eintrag:
    content_filter=smtp-amavis:[127.0.0.1]:10024

    • Der Witz an der Sache ist, dass ohne den Eintrag auch keine E-Mails mehr an Amavis gehen und so am Spamfilter vorbeigeschleust werden ;) Vermutlich arbeitet dein Amavis nicht korrekt und nimmt keine E-Mails an, deshalb kommt es bei dir zu dem zuvor beschriebenen Fehler

      LG Thomas

      • Ich habe allerdings genau das gleiche Problem. Der Test mit der email und em garantierten spam ist ja super, aber wenn man 10 Minuten später feststellt, dass gar keine email mehr ankommen… besser wäre in der Anleitung vorzuschlagen sowohl eine nicht als spam eingestufte mail als auch eine als spam eingestufte mail zu testen.

        Mein amavis läuft telnet auf localhost 10024 geht:

  • Hallo Thomas!

    Vielen Dank! Es ist immer wieder eine Freude bei dir zu lesen!
    Funktioniert bei mir einwandfrei.

    Lg Manu

  • Hallo,

    ich konnte das bereits erfolgreich bei mir integrieren.
    Es scannt die Mails auch und mit die Testmail (XJS*C4JDBQADN1.NSBN3*2IDNEN*GTUBE-STANDARD-ANTI-UBE-TEST-EMAIL*C.34X) kommt auch gar nicht an – im Log steht auch drin das sie blockiert ist.

    Habe nur ein Problem, ich hätte gerne, dass ich bei solchen Mails benachrichtigt werde.
    Habe einiges probiert, bekomme es aber irgendwie nicht hin :(

    Gibt es auch eine Möglichkeit, eine Testmail zu versehen um zu sehen, ob ***SPAM*** im Betreff drin steht?

    LG.

    • So wie ich es verstanden habe sollte es ausreichen in der Datei
      /etc/amavis/conf.d/20-debian_defaults
      die entsprechende Zeil auszukommentieren:

      $sa_spam_subject_tag = ‚***SPAM*** ‚;
      $sa_tag_level_deflt = undef;
      $sa_tag2_level_deflt = 5;
      # $sa_kill_level_deflt = 20;
      $sa_dsn_cutoff_level = 10; # spam level beyond which a DSN is not sent

      Damit wird keine mail mehr gelöscht.

  • Vielen Dank für das tolle Tutorial!
    Nach dem Aufsetzen hat sofort alles funktioniert.
    Leider im nachhinein dann doch nicht alles: Mails an meine erste Domain werden als ***SPAM*** markiert und verschoben. Mails an danach eingerichtete Domains leider nicht – diese landen unmarkiert im Posteingang.

    Muss ich weitere Domains irgendwo eintragen?

    /var/log/mail.log liefert Folgendes:
    Feb 21 03:38:14 web01 amavis[3673]: (03673-02) Passed SPAMMY {RelayedOpenRelay}, [209.85.xxx.xxx]:33681 [209.85.xxx.xx] -> , Queue-ID: 6792F12042F, Message-ID: , mail_id: nHMCbZ-6iwb3, Hits: 999.901, size: 2727, queued_as: 6231E1204C1, dkim_sd=20120113:googlemail.com, 5741 ms

    Hits: 999.901 besagt doch, dass die Mail erkannt wurde, oder?

    Vielen Dank im Voraus!
    Stefan

    • Tagelang suche ich rum und kaum schreibe ich hier etwas, finde ich es selbst heraus…

      In /etc/amavis/conf.d/50-user müssen ja alle Domains eingetragen werden und nicht nur .$mydomain:
      @local_domains_acl = ( „.$mydomain“, „nextdomain.de“ );

  • Hi,

    erstmal danke für das gute Tutorial, allerdings kann sich mein Thunderbird nun nicht mehr zum Server verbinden.
    Woran kann das liegen?

    Grüße

  • nach dem Test mit „XJS*C4JDBQADN1.NSBN3*2IDNEN*GTUBE-STANDARD-ANTI-UBE-TEST-EMAIL*C.34X“
    empfängt mein Server keine Mails mehr von außerhalb der Domain. Der Serverprovier meint, dass der Port 25 nicht mehr offen ist. Ich bin 100% ratlos

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.