E-Mail-Spam – Kampf gegen Windmühlen

Es sah eine Zeit so aus als hätte ich die Flut an Spam-Mails etwas eingedämmt. Aber der Damm ist vor einigen Tagen wieder gebrochen und im Moment werde ich pro Tag mit gut 50 Spammails überrollt. Und das sind nur diejenigen, die durchkommen. Vermutlich wird die x-fache Menge bereits vorher abgefangen.

Klassisches Blockieren von Absendern und Domains funktioniert nicht mehr. Oder zumindest kommen eben noch unglaublich viele Dreckmails durch, weil nach meiner Erfahrung von den Gaunern derzeit nur Einmalmails verwendet werden. Ohne tatsächlichen Server hinter dem DNS-Namen zudem.

Das läuft vermutlich ähnlich wie bei Brute-Force-Angriffen. Aus Wortlisten werden Absendernamen und Domainnamen zusammengesetzt und dann die gleiche Mail zig-fach an eine E-Mail-Adresse geschickt. Der Betreff wird genauso generiert, aber da müssen natürlich die passenden Reizworte stehen. Und das ist dann die einzige Stelle, wo man außer Gray-Filtern funktionierende Filter ansetzen kann. Leider funktioniert auf meinem Server weder Gray-Filtern noch das Einrichten von Inhaltsfiltern. Ich habe keine Ahnung warum, aber ich kann und will meinen Server nicht von links auf rechts drehen mit der Gefahr, dass hinterher gar nichts mehr läuft. Der Preis ist aber, dass ich hier nur eine Brandschutzmauer der klassischen Art über Adressfilter und Standard-Tools wie SpamAssassin aufbauen kann.

Mein Python-Skript, das die letzten Monate Inhalte gefiltert hat, hat plötzlich Probleme gemacht. Da wurde an irgendeiner Stelle eine Aktualisierung oder Änderung im API oder meinen Protokolldaten des E-Mail-Servers vorgenommen und ich habe noch nicht raus, was deshalb einen Fehler auslöst. Deshalb habe die Skripte im Moment deaktiviert, wobei ich da sicher nochmal rangehe.

Bleiben noch die Mail-Agents, um damit Inhaltsfilter anzulegen. Die arbeiten ganz gut, nur muss eben erst einmal der passende Mail-Agent aufgerufen werden, der auch richtig filtert. Die Filter von Thunderbird greifen (und komischer Weise funktioniert bei  Thunderbird das Einrichten einer Zertifikatsausnahme auch wieder, nachdem ich die portable Version älterer Bauart einfach in einen anderen Ordner entpackt hat – und die wurde mittlerweile automatisch aktualisiert, aber es geht immer noch) bzw. die habe ich mittlerweile soweit angepasst, dass der meiste Dreck zuverlässig in den Spam-Ordner wandert.

Nur unter Android klappt das nicht so ganz bei MailDroid. Inhaltsfilter gibt es da nur gegen das Verschicken von Werbung für das Programm an 10 Kontakte. Das finde ich nicht gut und lasse es deshalb. Jetzt habe ich ein neues, kostenloses E-Mail-Programm für Android entdeckt. Nennt sich einfach „E-Mail“ von Edison Software (oder auch Edison-Mail) und macht auf den ersten Blick einen sehr guten Eindruck. Man kann mehrere Accounts einrichten (was out-of-the-box funktioniert hat) und ein sogenannter „Fokussierter Modus“ filtert nach meinen ersten Versuchen den Spam-Dreck auch auf dem SmartPhone ziemlich gut. Damit sollte das Problem entfallen, dass die Drecksmails zwar nicht belästigen, wenn ich zuerst den PC starte und Thuderbird aufrufe, aber wenn ich bisher zuerst auf dem SmartPhone geschaut hatte und dann der Schmutz sofort da war und das E-Mail-Postfach verdreckt hat.

Und ja – ich bin stinksauer auf diese Dreckschleudern und deshalb die wütende Wortwahl.

(Liebe) Spamer gebt gut acht, der kleine Raspi wacht

Nachdem ich mein Python-Skript zur Identifizierung und Löschung von Spam auf Basis bestimmter Schlagworte im Betreff ein bisschen getestet habe, habe ich es sowohl auf meinem Server als auch dem Raspberry Pi als CronJob bereitgestellt. Mal sehen, wie gut die Putzkolonne das E-Mail-Postfach frei hält. Die letzten Nächte hatte ich – trotz SpamAssasin & Co jeden Morgen gut 20 Dreckmails im Postfach. Ich bin guter Hoffnung, dass Raspi einen guten Torwächter abgibt und da das Python-Skript redundant auch auf dem eigentlichen Server per CronTab aufgerufen wird, werde ich mal schauen, wie ich das in Zukunft austariere. Aber vorher werde ich das Skript noch optimieren.

Python-Skript zur Spam-Abwehr

Die momentane Überflutung mit E-Mail-Spam auf meinem eigenen Server geht mir gewaltig auf die Nerven. Ich habe die Woche etwas Zeit gehabt und immer mal wieder diverse Wege ausprobiert, um diesen Angriffen etwas entgegenzusetzen. Und dabei – das ist das Positive – doch wieder was gelernt. Ich habe zig Einstellungen und Optionen an meinem Server verändert, was aber nur begrenzten Erfolg hatte und auch nicht ungefährlich ist. Sogar den Email-Server habe ich gewechselt.

Klar verwende ich SpamAssassin und habe auch Blacklist- und Whitelist-Einstellungen. Aber das hilft in meinem Fall nicht wirklich was. Oder anders ausgedrückt – ohne das Zeug würde ich vermutlich die 10-fache Menge an Spam bekommen, aber was immer noch durchkommt, ist erschreckend. Vor allen Dingen greifen die Einstellungen, dass man Absender blockiert oder freigibt, nicht. Wie gesagt – bekannte Spammer zu blocken ist garantiert sinnvoll, um 90% des Drecks wegzuhalten, aber nicht ausreichend. Denn die Spammer in der derzeitigen Flut verwenden Einmal-Adressen. Es ist daher leider vollkommen nutzlos, den Server, die Domain oder gar einen einzelnen Absender zu blockieren.

Leider kann ich auf meinem Server kein Greylisting aktivieren. Grundsätzlich ist es verfügbar, aber beim Aktivieren bekomme ich einen Bug im Serverskript angezeigt :-(. Dabei wäre Greylisting in vielen Fällen garantiert sinnvoll. Im Gegensatz zu Whitelisting (bekannte Adresse immer durchlassen) und Blacklisting (bekannte Adressen immer blockieren) lehnt man bei Greylisting unbekannte Adressen genau 1x mit einer passenden Meldung ab und trägt die Absenderadresse in eine DB ein, um bei der nächsten Zustellung den Absender durchzulassen. Seriöse Versender bzw. SMTP-Server senden einfach nach einer ersten Fehlermeldung des Adressaten automatisch nochmal (ohne dass es der Absender bemerkt), Spammer in der Regel nicht. Aber wie gesagt – kann ich (derzeit) nicht aktivieren. Mal sehen, ob ich den Fehler noch rausbekomme, aber ich bin einfach kein (echter) Admin – sondern Programmierer.

Natürlich habe ich auch SPF-Spamschutz aktiviert, aber dennoch erscheint mir das als ein nutzloser Kampf gegen Windmühlen. Eigentlich helfen nur Inhaltsfilter, denn die Spam-Flut lässt sich derzeit bei mir auf etwa 5 – 10 Schlagworte eingrenzen.

Solche Filter kann ich in Thunderbird sehr schön anlegen und auch meine GMX-Accounts erlauben das. Nur die E-Mail-Programme, die ich bisher für mein SmartPhone gefunden habe, haben dieses Feature nicht. Deshalb habe ich sogar mal versucht, meine rjs.de-Adresse auf eine GMX-Adresse weiterzuleiten, dort mit Inhaltsfiltern zu reinigen und dann zurück auf eine neue rjs.de-Adresse weiterzuleiten. Funktioniert, aber ist mir dann doch zu umständlich gewesen. Außerdem will ich meine bisherige E-Mail-Adresse nicht wegen diesen Dreckschweinen aufgeben bzw. so kastrieren.

Überhaupt – das Filtern verlagert die Sache – soweit ich es hinbekomme – vom Server in den Client, denn bei beiden POP3/IMAP-Servern, die ich verwende, gibt es dieses Filtern nach dem Inhalt leider nicht – soweit ich es herausgefunden habe .

Bei POP3-Accounts ist das Filtern mit einem E-Mail-Client aber sowieso ziemlich unnütz und deshalb habe ich jetzt mal die Geschichte komplett auf IMAP umgestellt. Hätte ich schon lange tun müssen. Aber auch dann muss ein Client mit Filtern regelmäßig das Konto überwachen (etwa ein entsprechend konfigurierter Thunderbird auf einem meiner Rechner), damit ein anderer Client ohne die passenden Filter (etwa auf dem SmartPhone) gar nicht erst den Schmutz lädt.

Die Grundidee schien mir aber ok, da ich anders nicht weiter kam. Aber einen PC Tag und Nacht laufen lassen und alle paar Minuten Thunderbird das Konto checken lassen? Das kostet zu viel Strom und ist schon auf den zweiten Blick nicht wirklich optimal.

Mir kam dann die Idee, meinen alten Raspberry Pi das machen zu lassen. Braucht kaum Strom und die Platine verstaubt sowieso vor sich hin, nachdem ich den Zwerg vom Kryptomining wieder abgezogen habe. Also damit eine Weile experimentiert. Da ich an der Platine weder Maus und Tastatur noch Monitor hängen habe und auch W-LAN nicht eingerichtet war, musste ich das Kistchen erst einmal etwas aktualisieren bzw. neu einrichten. Natürlich kann ich mit klassischem SSH mit X-Umleitung darauf zugreifen, aber ich arbeite auch bei Fernzugriff gerne mit dem Desktop. Nur komischer Weise ging der Zugriff über VNC auf den Raspi nicht. Obwohl auf der Raspi auch ein VNC-Server automatisch mit startet und ich das schon früher so gemacht habe. Ich habe es absolut nicht hinbekommen und in meiner Verzweiflung sogar xrdp installiert und – oh Wunder – der Remotedesktop-Zugriff ging einwandfrei – von Windows (!) aus.

Aber da es sich bei meinem Raspi um die Version 1 handelt, konnte ich da kein vernünftiges E-Mail-Programm installieren. Viel experimentiert bis hin zur versuchten Installation von iceweasel und icedove, aber erfolglos. Der Weg war mir dann einfach zu steinig und ich habe ihn als Sackgasse begraben.

Und dann kam mir ein Gedanke! Warum kein Python-Skript schreiben und damit das IMAP-Postfach regelmäßig abfragen? Die ursprüngliche Idee war, dass ich das dann auf dem Raspi laufen lasse, aber relativ schnell kam ich auf den Dreh, dass das natürlich auch auf dem Server selbst erfolgen kann. Ich habe ja in meinen regelmäßigen Entwickler-Tipp zu Python bei LinkedIn Learning schon einen Tipp veröffentlich, wie man per CronTab zeitgesteuert Python-Skripte ausführen kann. Was aber natürlich auch für den Raspi interessant wäre.

Das Skript, das ich dann programmiert habe, nutzt im Wesentlichen imaplib, ist aber noch nicht ganz fertig und auch noch nicht auf dem Server bzw. Raspi installiert. Aber wenn ich die derzeitige Vorversion in IDLE laufen lasse, kann ich recht zuverlässig im Betreff von E-Mails (theoretisch auch in der gesamten Mail) Schlagworte finden, die ich als SPAM empfinde und dann die Mails vom Skript automatisiert löschen lassen.

Ich werde von dem Skript noch eine Datei mit den Schlagworten einlesen lassen, reguläre Ausdrücke mit dem Modul re integrieren, das Skript eine Weile manuell testen, und dann in einen Cron-Job auf dem Server und/oder Raspi einbauen. Das sollte eine brauchbare Ergänzung meiner Spamabwehr werden und ich habe wie gesagt wieder neue Sachen gelernt, was dem Mist etwas Positives abgewinnt.

Und wenn mein Vorrat an bereits eingespielten Videos für die regelmäßigen Entwickler-Tipps zu Python zur Neige geht, habe ich damit ein interessantes Thema für die neuen Tipps, die ich dann vermutlich einspiele.