IMAP Spam-Scanner-Script mit SpamAssassin

Mit dem Spam-Scanner-Script isbg können externe IMAP-Postfächer über einen Linux-Server mit Hilfe des darauf installieren SpamAssassin-Programms nach Spammails durchsucht und anschließend verschoben, gelöscht oder als *Spam* markiert werden.

Installation der benötigten Pakete

Falls noch nicht vorhanden, müssen wir Python 3 aus dem EPEL-Repository installieren.

yum install epel-release

yum install python36 python36-pip

Der IMAP-Scanner braucht noch drei zusätzliche Python-Module die wir über pip installieren. Danach holfen wir uns den Sourcecode von GitHub und installieren das Programm.

pip3 install typing docopt chardet

Installation des IMAP-Scanners isbg und SpamAssassin

Nun installieren wir mit Hilfe von pip den IMAP-Scanner isbg und das dazu benötigte Programm SpamAssassin.

pip3 install isbg

yum install spamassassin

Einen eigenen Benutzer für SpamAssassin anlegen

SpamAssassin soll später unter einem eigenen Benutzer laufen, in dessen Benutzerordner auch die Konfigurationsdatei gespeichert wird. Dazu erstellen wir einen Benutzer, z.B. spamd-default mit der Kommandozeile:

useradd spamd-isbg-main

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: Postfix und SpamAssassin

 

Jetzt loggen wir uns mit dem zuvor erstellten SpamAssassin Benutzer ein und erstellen das Konfigurationsverzeichnis mit:

su spamd-isbg-main

mkdir $HOME/.spamassassin

Anschließend erstellen und editieren wir die Konfigurationsdatei mit:

vi $HOME/.spamassassin/user_prefs

SpamAssassin Haupt-Konfigurationsdatei

SpamAssassin Konfigurationsdateien

Nachdem wir die Konfigurationsdatei angepasst haben starten wir SpamAssassin neu um die Änderungen zu übernehmen.

exit

systemctl restart spamassassin

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

IMAP Spam-Scanner testen

Als angemeldeter User können wir nun unser Script testen. Dafür erstellen wir in dem zu überprüfenden E-Mail-Postfach einen Ordner mit dem Namen "Junk".

isbg --imaphost [IMAP-Server] --imapuser [IMAP-Benutzername] --spaminbox [Spamordner] --maxsize 1000000000 --passwdfilename $HOME/[Passwdfilename] --trackfile $HOME/[Trackfilename] --partialrun 10 --savepw

Mit dieser Befehlszeile werden alle als Spam identifizierten E-Mails in den Ordner Spam kopiert. Der Posteingang bleibt unverändert.

--maxsize Hier wurde der Standardwert erhöht, um auch größere E-Mails zu scannen.

--passwdfilename Speichert das Passwort für das Postfach in eine angegebene Datei.

--trackfile Um später für jedes Postfach bzw. jeden Eintrag im crontab eine eigene Liste mit den bereits überprüften Mails zu haben, wird der Parameter --trackfile eingesetzt.

--partialrun Bei großen Postfächern kann der erste Durchlauf sehr lange dauern. Um immer nur eine bestimmte Anzahl von Mails zu durchsuchen, kann der Parameter --partialrun und eine beliebige Zahl verwendet werden. Neu E-Mails werden dabei immer zuerst gescannt.

Eine Liste aller Optionen kann unter https://github.com/isbg/isbg/blob/master/docs/manpage.isbg.rst abgerufen werden.

 

Durch anhängen der Option --savepw an die Befehlskette kann das IMAP-Passwort des E-Mail-Kontos gespeichert werden. Nach einem einmaligen Aufruf muss die Option wieder entfernt werden.

--savepw

IMAP Spam-Scanner im Produktivbetrieb

Im Produktivbetrieb hängen wir die beiden Optionen --expunge --delete an die Befehlskette, um die in den "Junk" Ordner kopierten E-Mails aus dem Posteingang zu löschen.

isbg --imaphost [IMAP-Server] --imapuser [IMAP-Benutzername] --spaminbox [Spamordner] --maxsize 1000000000 --passwdfilename $HOME/[Passwdfilename] --trackfile $HOME/[Trackfilename] --spamc --expunge --delete --lockfilename $HOME/[Lockfilename] --partialrun 10

Zusätzlich wird die Befehlszeile um folgende Parameter ergänzt:

--spamc Ist die Client-Version von SpamAssassin und sollte Anstelle von spamd verwendet werden da er schneller und ressourcenschonender ist. Leider kam es bei Scanns mit größerer E-Mail-Anzahl zu Fehlern unbekannter Herkunft.

--lockfilename Es können verschiedene Lockfiles definiert werden, z.B. bei verschiedenen Postfächern soll nicht das gleich Lockfile verwendet werden.

--expunge --delete Löscht die als Spam erkannten E-Mails nach dem Verschieben in den Spamordner aus dem Posteingang.

 

Läuft der Befehl Fehlerfrei durch, können wir ihn in crontab aufnehmen. Da das Script jedoch nur in einem vorgegebenen Intervall das Postfach nach Spam und möglichen Betrugsmails durchsucht, sollten die eingehenden E-Mails zuvor in einen Zwischenordner umgeleitet werden. Ich lege dafür den Ordner "Mails-NEU" an und leite alle eingehenden E-Mails auf diesen Ordner um. Über den Parameter --imapinbox legen den zu scannenden Ordner fest..

Bug: Leider verschiebt isbg "gute" Mails nicht automatisch in einen anderen Ordner. Die Funktion --movehamto sollte diese zwar realisieren, derzeit werden die Mails "guten" Mails jedoch nicht verschoben sondern kopiert. Wir müssen die Mails, nachdem sie nach Spam durchsucht wurden, daher über ein eigenes Script in den Posteingang verschieben.

Wir geben crontab -e in die Konsole ein und fügen Folgende Zeile hinzu:

0 * * * * isbg --imaphost [IMAP-Server] --imapuser [IMAP-Benutzername] --spaminbox [Spamordner] --maxsize 1000000000 --passwdfilename $HOME/[Passwdfilename] --trackfile $HOME/[Trackfilename] --expunge --delete --lockfilename $HOME/[Lockfilename] --imapinbox Mail-NEU --nostats

Durch den Eintrag in crontab wird das IMAP-Postfach zu jeder vollen Stunde nach SPAM-Mails durchsucht.

--nostats verhindert laufende Benachrichtigungen des ausgeführten crontab-Befehls.

Fehler- & Warnmeldungen

Um über Fehler- & Warnmeldungen per E-mail informiert zu werden, fügen wir in die Crontab-Datei noch die Zieladresse ein.

crontab -e
MAILTO=e-support@it-mk.at

...

Weitere Optionen

In der Konfigurationsdatei haben wir unter anderem den Bayes-Algorithmus zu Erkennung von ähnlichen bereits erkannten Spam-Mails eingerichtet. Diese lassen sich nun über die nächsten beiden Parameter mit "guten" Mails und mit Spam-Mails füttern.

--learnspambox [Junk]

--learnhambox [NoSpam]

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:

su spamd-isbg-main
vi $HOME/.spamassassin/user_prefs
# Bayes-Test
rawbody BAYES_TEST   /bayes-test/i
score       BAYES_TEST   400
describe BAYES_TEST   bayes-test

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

Sollte alles funktionieren, wird die E-Mail nach einem Durchlauf des IMAP-Scanners automatisch in den Spamordner verschoben.

 

Um auch die Bayes-Funktion zu testen, müssen wir noch die beiden Optionen --learnspambox [Junk] & --learnhambox [NoSpam] an unsere Befehlskette anhängen und in die Ordner mindestens eine "gute" E-Mail und eine Spammail ablegen, damit die Bayes-Datenbank seine ersten Einträge erhält.

 

Legt man nun eine Spammail wieder in den Posteingang und lässt das Script erneut durchlaufen, 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.

Quellen

Pip Installation auf Centos 7

https://www.liquidweb.com/kb/how-to-install-pip-on-centos-7/

IMAP Spam Begone (isbg) auf GitHub

https://github.com/isbg/isbg

Kommentare

Was ist die Summe aus 4 und 2?