Postfix mit SpamAssassin konfigurieren

In diesem Abschnitt wird SpamAssassin installiert und in Postfix als Filter hinzugefügt, damit SpamAssassin eingehende E-Mails auf deren Spamwahrscheinlichkeit prüfen kann. Als Spam erkannte E-Mails werden über das Dovecot-Plugin Sieve in den Ordner Junk verschoben.

Installation der benötigten Pakete

Wir installieren Sieve über die Dovecoterweiterung Pipeonhole und zusätzlich SpamAssassin. Letzteres starten wir sogleich und aktivieren das Service für den automatischen Starten bei jedem Hochfahren des System.

yum install dovecot-pigeonhole amavisd-new clamav clamav-update clamav-scanner spamassassin

systemctl start spamassassin

systemctl enable spamassassin

systemctl start amavisd

systemctl enable amavisd

ClamAV Datenbank aktualisieren

Damit in den E-Mails nicht die Fehlermeldung "UNSCANNED" erscheint, müssen wir die Datenbank von ClamAV auf den aktuellen Stand bringen. Das un wir mit:

freshclam

Um zu prüfen, ob ClamAV auch regelmäßig aktualisiert wird, können wir nachsehen, ob ein Cronjob erstellt wurde unter:

cat /etc/cron.d/clamav-update

Amavisd-new konfigurieren

Wir öffnen die Amavisd-new Konfigurationsdatei:

vi /etc/amavisd/amavisd.conf


Nun suchen wir die beiden Parameter und passen sie an unseren Servern an. In $mydomain wird die Hauptdomain des Servers eingetragen. In $myhostname steht z.B. server.yourdomain.com

$mydomain = 'domain.com';   # a convenient default for other settings
$myhostname = 'mail.domain.com'; # must be a fully-qualified domain name!

Um auch alle anderen Domains welche in der SQL-Datenbank gespeichert sind zu verarbeiten, müssen wir einen weiteren Parameter in die Konfigurationsdatei wie folgt abändern:

# @local_domains_maps = ( [".$mydomain"] ); # list of all local domains
@local_domains_maps = ['.'];

Um über Amavisd-new den vollständigen Spamassassin X-Spam-Report auszugeben, muss bei Centos oder Red Hat folgende Zeile eingefügt werden:

$allowed_added_header_fields{lc('X-Spam-Report')} = 1;

Der Parameter "$sa_spam_report_header = 1" aus verschiedenen Debian- oder Ubuntu-HowTos funktioniert bei Centos nicht.

 

Um Spam-Mails einschätzen zu können, weist SpamAassassin jeder E-Mail einen Wert zu. In der Konfigurationsdatei von Amavisd-new können wir festlegen, ab welchem Wert eine Mail als Spam deklariert werden soll. Der erste Wert gibt an, dass jeder E-Mail der Spam-Info-Header hinzugefügt wird. Der zweite werde definiert, ab welchem Wert E-Mails als Spam gehandelt werden sollen. Die restlichen Zeilen kommentieren wir aus.

...


$sa_tag_level_deflt = -9999; # add spam info headers if at, or above that level
$sa_tag2_level_deflt = 40; # add 'spam detected' headers at that level
# $sa_kill_level_deflt = 6.9; # triggers spam evasive actions (e.g. blocks mail)
# $sa_dsn_cutoff_level = 10; # spam level beyond which a DSN is not sent
# $sa_crediblefrom_dsn_cutoff_level = 18; # likewise, but for a likely valid From
# $sa_quarantine_cutoff_level = 25; # spam level beyond which quarantine is off
# $penpals_bonus_score = 8;    # (no effect without a @storage_sql_dsn database)
# $penpals_threshold_high = $sa_kill_level_deflt; # don't waste time on hi spam
# $bounce_killer_score = 100; # spam score points to add for joe-jobbed bounces


...

 

Damit der Versender einer infizierten Mail auch eine Rückmeldung erhält und diese nicht kommentarlos gelöscht werden, suchen wir nachstehenden Abschnitt und ändern ihn wir folgt ab:

...

$final_virus_destiny = D_REJECT;

...

Info: $final_spam_destiny = arbeitet mit $sa_kill_level_deflt = , wird jedoch hier nicht benötigt, da die Filterung über Sieve erfolgt.

Amavisd-new in Postfix integrieren

Damit Postfix Amavisd-new auch verwenden kann, müssen wir ein paar Zeilen unterhalb von

smtp inet n - n - - smtpd

in der Datei /etc/postfix/master.cf hinzufügen. Der gesamte Eintrag sieht wir folgt aus:

...

smtp inet n - n - - smtpd
-o content_filter=smtp-amavis:127.0.0.1:10024

...

Um auch intern zu filtern bzw. ausgehende Mails auf Viren zu prüfen suchen wir nachstehenden Abschnitt und ergänzen ebenfalls die Filter-Anweisung.

...
submission inet n - n - - smtpd
# -o syslog_name=postfix/submission
-o smtpd_tls_security_level=encrypt
-o smtpd_sasl_auth_enable=yes
-o content_filter=smtp-amavis:[127.0.0.1]:10023
...

smtps inet n - n - - smtpd
# -o syslog_name=postfix/smtps
-o smtpd_tls_security_level=encrypt
-o smtpd_sasl_auth_enable=yes
-o content_filter=smtp-amavis:127.0.0.1:10024

...

Am Ende der gleichen Datei fügen wir noch folgende Zeile ein:

#
# Amavisd & SpamAssassin
#
smtp-amavis unix - - y - 2 smtp
-o smtp_data_done_timeout=1200
-o disable_dns_lookups=yes
-o smtp_send_xforward_command=yes
127.0.0.1:10025 inet n - y - - smtpd
-o content_filter=
-o smtpd_helo_restrictions=
-o smtpd_sender_restrictions=
-o smtpd_recipient_restrictions=permit_mynetworks,reject
-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 receive_override_options=no_header_body_checks
-o smtpd_helo_required=no
-o smtpd_client_restrictions=
-o smtpd_restriction_classes=
-o disable_vrfy_command=no
-o strict_rfc821_envelopes=yes

Und übernehmen das Ganze mit:

systemctl restart postfix

Konfiguration von SpamAssassin

SpamAssassin verwendet zwei Konfigurationsdateien. Eine systemweite, welche unter /etc/mail/spamassassin/local.cf zu finden ist und eine für jeden Benutzer, welche im Home-Verzeichnis unter $HOME/.spamassassin/user_prefs abgelegt werden. Mithilfe der zweiten Konfigurationsdatei können Konfigurationen hinzugefügt werden oder die systemweiten Einstellungen überschrieben werden. Amavisd-new speichert seine user_prefs allerdings unter dem Pfad /var/spool/amavisd/.spamassassin.

Um  Konfigurationsdateien von Benutzern zuzulassen und damit Spamassassin allen Spammails einen Report in die Quelldatei hinzufügt, damit wir später auch prüfen können, warum eine Mail als Spam beurteilt wurde, müssen wir zuvor noch die Standardkonfiguration bearbeiten. Am besten verschieben wir die Originaldatei und legen sie als local.cf.original wieder ab und erstellen die Konfigurationsdatei anschließend neu.

mv /etc/mail/spamassassin/local.cf /etc/mail/spamassassin/local.cf.original

vi /etc/mail/spamassassin/local.cf

Nun fügen wir folgende Zeilen ein:

# Der Score, welche erreicht werden muss, um eine Mail als Spam zu beurteilen.
# Gilt nur für den IMAP-Scanner.
# Für SpamAssassin & Amavisd-new wird der Score in vi /etc/amavisd/amavisd.conf festgelget
required_score 40

# Erlaubt Benutzern das Verwenden eigener Regeln.
allow_user_rules 1

# Ist dieser Parameter aktiviert, wird ein Spamreport erstellt.
# Die Originalnachricht wird als Anhang beigefügt.
# Möchte man das nicht, muss die Funktion explizit deaktiviert werden.
report_safe 0

# Verzeichnis für die SpamAssassin Bayes-Datenbank.
# Bayes ist ein System, welches von harmlosen Mails und von Spammails lernt um diese besser einzustufen.
bayes_path /var/lib/spamassassin/bayes_db/bayes
bayes_file_mode 0666

# Grenzwert, ab wie vielen Mails das System Bayes für die Spambewertung heranziehen darf.
# Bei höheren Werten kann das System länger lernen, um eine falsche Einstufung zu verhindern.
bayes_min_spam_num 0
bayes_min_ham_num 0

Siehe auch: IMAP Spam-Scanner

Amavisd-new user_prefs konfigurieren

Nun editieren wir die Konfigurationsdatei und fügen den Inhalt aus dem nächsten Abschnitt "SpamAssassin Haupt-Konfigurationsdate" ein:

vi /var/spool/amavisd/.spamassassin/user_prefs

SpamAssassin Haupt-Konfigurationsdatei

SpamAssassin Konfigurationsdateien

Nachdem wir die Konfigurationsdatei angepasst haben starten wir Amavisd-new neu um die Änderungen zu übernehmen.

systemctl restart amavisd

Dovecot-Sieve-Plugin konfigurieren

Wir laden das Plugin indem wir in der Datei /etc/dovecot/conf.d/20-lmtp.conf im Abschnitt protocol lmtp folgende Zeile hinzufügen.

protocol lmtp {
...

   mail_plugins = $mail_plugins sieve

...
}

Wo die globalen Filterregeln zu finden sind definieren wir unter /etc/dovecot/conf.d/90-sieve.conf. Wir suchen die auskommentierte Zeile sieve_after und fügen unterhalb folgende Zeile ein:

sieve_after = /etc/dovecot/sieve-after

Die Filterregel erstellen wir nun in der Datei /etc/dovecot/sieve-after/spam-to-folder.sieve.

require ["fileinto","mailbox"];

if header :contains "X-Spam-Flag" "YES" {
 fileinto :create "INBOX.Junk";
 stop;
}

Der Befehl sievec kompiliert die Datei in ein für Dovecot lesbares Format.

sievec /etc/dovecot/sieve-after/spam-to-folder.sieve

Alle Änderungen an Dovecot übernehmen wir mit:

systemctl restart dovecot

SpamAssassin & Bayes konfigurieren

 

mkdir /var/lib/spamassassin/bayes_db

chmod 777 /var/lib/spamassassin/bayes_db

touch /var/lib/spamassassin/bayes_db/bayes

chmod 666 /var/lib/spamassassin/bayes_db/bayes

Siehe auch: IMAP Spam-Scanner

Im nächsten Schritt müssen wir die Bayes-Datenbank mit mindestens einer "guten" Mail und einer Spam-Mail füttern. Dazu rufen wir die nächsten beiden Befehlszeilen auf:

sa-learn --ham --showdots --dir /home/vmail/[Domain]/[E-Mail-Konto]/.NoJunk/cur

sa-learn --spam --showdots --dir /home/vmail/[Domain]/[E-Mail-Konto]/.Junk/cur

 

Um die Bayes-Datenbank regelmäßig mit den aktuellen Spam-Mails aus dem Junk-Ordner zu füttern können wir den sa-learn --spam Befehl in crontab als root aufnehmen. Folgender Befehl durchsucht den Junk-Ordner des angegebenen Benutzers nach neuen Spam-Mails.

*/5 * * * * sa-learn --spam --showdots --dir /home/vmail/[Domain]/[E-Mail-Konto]/.Junk/cur

Wurde eine E-Mail irrtümlich als Spam erkannt, kann sie in den Ordner NoJunk verschoben werden. Mit dem nächsten Befehl wird dieser anschließend aus der Spam-Datenbank entfernt und in die Datenbank für die "guten" Mails verschoben.

*/5 * * * *  sa-learn --ham --showdots --dir /home/vmail/[Domain]/[E-Mail-Konto]/.NoJunk/cur

SELinux Berechtigungen für Amavisd-new

Um fehlende SELinux Berechtigungen zu beheben und Amavisd-new Zugriff auf die Bayes-Datetenbank zu geben, muss noch nachstehender Befehl ausgeführt werden:

setsebool -P antivirus_can_scan_system on

Testen

Um unseren Spamfilter zu testen, melden wir uns mit dem SpamAssassin-Benutzer an und fügen in die SpamAssassin-Konfigurationsdatei am Anfang folgende Zeilen ein:

vi /var/spool/amavisd/.spamassassin/user_prefs
# Bayes-Test
rawbody BAYES_TEST   /amavisd-test/i
score       BAYES_TEST   400
describe BAYES_TEST   amavisd-test

Zum Schluss schicken wir von einem externen Postfach eine E-Mail an unseren Server mit dem Inhalt: "amavisd-test".

Sollte alles funktionieren, wird die E-Mail automatisch in den Spamordner verschoben.

 

Um auch die Bayes-Funktion zu testen, laden wir uns die erkannte Spam-Mail in die Bayes-Datenbank:

sa-learn --spam --showdots --dir /home/vmail/[Domain]/[E-Mail-Konto]/.Junk/cur/

Schickt man sich jetzt exakt die gleich E-Mail nochmal, also mit gleichem Betreff und gleichen Inhalt, sollte auch der Bayes-Test anschlagen. Der Header der E-Mail kann dann folgendermaßen aussehen:

X-Spam-Report: =?ISO-8859-1?Q?
	*   51 BAYES_99 BODY: Spamwahrscheinlichkeit nach Bayes-Test: 99-100%
	*      [score: 1.0000]
	*  0.2 BAYES_999 BODY: Spamwahrscheinlichkeit nach Bayes-Test: 99.9-100%
	*      [score: 1.0000]
	*  400 BAYES_TEST RAW: bayes-test?=

Der X-Spam-Report kann noch mehrere Zeilen beinhalten.

Amavisd-new

Dass Amavisd-new die Mail ebenfalls geprüft hat erkennen wir an folgender Zeile im E-Mail Header:

X-Virus-Scanned: amavisd-new at it-mk.at

EICAR-Testdatei

Eine weitere Möglichkeit, um Viren in Mails zu testen, ist die EICAR-Testdatei. Dazu schickt man eine interne Mail und fügt eine Textdatei mit folgendem Inhalt ein:

X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*

Es sollte eine Unzustellbarkeitsbenachrichtigung erfolgen, da die Mail einen Virus bzw. eine EICAR-Datei enthält.

Quellen

Postfix & SpamAssassin auf Centos 7

https://janikarhunen.fi/tackle-spam-with-spamassassin-on-centos7-and-postfix.html

Postfix, Amavisd-new, ClamAV & SpamAssassin auf Centos 7

http://forums.sentora.org/showthread.php?tid=1132

Amavies-new local_domains_maps anpassen um alle konfigurierten (auch virtuelle) Domains zu verarbeiten

https://forum.iredmail.org/topic3800-iredmail-support-localdomainsmaps-in-amavisdnew.html

Contos und Red Hat $sa_spam_report_header bzw. X-Spam-Report konfigurieren

https://www.redhat.com/archives/epel-devel-list/2013-February/msg00049.html

Ordnerpfad der user_prefs von Amavisd-new

https://wiki.apache.org/spamassassin/IntegratedInPostfixWithAmavis

SELinux, erlaubte Ordner und Pfade in denen der Spamassassin agieren darf.

https://www.systutorials.com/docs/linux/man/8-spamd_selinux/

Dovecot Sieve filters auf Centos 7 installieren

https://www.vultr.com/docs/simple-mailserver-postfix-dovecot-sieve-centos-7

Dovecot Sieve filters konfigurieren

https://workaround.org/ispmail/jessie/spamassassin

Auf leere Felder Testen

https://www.fastmail.com/help/technical/sieve-faq.html#matchempty

Kommentare

Bitte addieren Sie 5 und 6.