SPAM Filter

Aus MvOWiki
Zur Navigation springen Zur Suche springen

Allgemein

Nach jetzt mehr als 10 Jahren Auseinandersetzung mit dem Thema SPAM gehe ich davon aus, dass hier auf meinem zentralen Server einer der besten oder möglicherweise der beste SPAM-Filter überhaupt läuft.

Langjährige Erfahrung hat gezeigt, dass SPAM-Präventation zwar für viele Leute funktionieren mag, für mich nicht. Ich habe das jahrelang mit Aufwand betrieben, um dann fest zu stellen, dass die so gut gehütete E-Mail-Adresse durch den Virus auf dem PC eines Verwandten dann doch in falsche Hände gerät.

Das Argument, man könne ja die E-Mail-Adresse ändern, wenn zuviel Spam kommt, lasse ich nicht gelten. Ich wechsle ja auch nicht die Wohnung, weil ich zuviel Werbepost im Briefkasten habe.

Deswegen betreibe ich keine Prävention mehr, sondern stecke alle Energie in das Filtern.

Der Server mail.von-oppen.com verarbeitet die E-Mails für etwa 10 2nd-Level-Domains. Davon werden zwei Domains aktiv genutzt, zwei weitere werden historisch weiter bedient. Hier auf diesem Server treffen momentan etwa 30.000 SPAM-E-Mails pro Tag ein, also etwa 10 Millionen SPAM-E-Mails pro Jahr. Das Aufkommen verdoppelt sich etwa alle 1-2 Jahre.

Aufbau des Filtersystems

Das Filtersystem unterscheidet im Gegensatz zu allen mir bekannten Systemen sauber zwischen Filterstufen die eindeutig serverbezogen und solchen, die benutzerbezogen sind.

Serverbezogenes Filtern

Der Server filtert ausschließlich auf Grundlage der Daten aus dem E-Mail-Umschlag, also derjenigen Daten, die beim SMTP-Protokoll direkt übertragen werden. Das sind im Wesentlichen Empfänger-Adresse, Absender-Adresse, sendender Rechner, Zielserver.

Dieser Teil ist in einer MySQL-Tabelle abgelegt. Exim kann mit nur einer Datenbankabfrage ca. 95 Prozent des gesamten Spamaufkommens zurückweisen. Und zwar bereits ganz vorn im Bearbeitungsprozess mit sehr wenig Ressourcen.

Die Daten in der MySQL-Tabelle werden zu 98 Prozent automatisiert gepflegt und die restlichen 2 Prozent werden mit Hilfe einer kleinen Zope-Anwendung gepflegt. Es reicht, da einmal in drei Monaten nach zu sehen, was bearbeitet werden muss.

Benutzerspezifisches Filtern

Der benutzerspezifische Teil ist um Längen aufwendiger und unterliegt auch regelmäßig Veränderungen. Um keine Missverständnisse aufkommen zu lassen: Auch diese Verarbeitung erfolgt komplett auf dem Server, jedoch benutzerbezogen. Der entscheidende Punkt ist, dass hier persönliche Preferenzen der Benutzer eingehen und die selbstlernenden Systeme alle Daten per Benutzer verwalten.

Das ist aus meiner Sicht extrem wichtig. Es gibt z.B. Newsletter, die ich als Spam betrachte, die andere Leute jedoch bewusst beziehen und gerne lesen.

Momentan hat sich ein Verfahren bewährt, welches aus drei Komponenten besteht, nämlich SpamBayes, SpamAssassin und aus einem selbst entwickelten Python-Script. Alle drei Komponenten halten ihre Daten jeweils in einer MySQL-Datenbank. SpamAssassin läuft als Deamon spamd.

Keines der mir bekannten Spamfilter-Systeme ist einzeln so gut wie die Kombination aus SpamBayes und SpamAssassin.

SpamBayes ist eine mathematisch ausgefeilte Implementierung des bayesianischen Ansatzes. SpamAssassin enthält zwar auch eine solche Implentierung, die ist aber nochmals um Längen schlechter. SpamAssassin klassifiziert aufgrund seiner vielfältigen Möglichkeiten sehr gut, hat seine Grenzen aber in der Lernfähigkeit.

SpamBayes lernt zwar ganz gut. Aber leider sind die Ergebnisse nicht gut genug, um die Ergebnisse von SpamBayes automtisiert zu lernen. Wenn man SpamBayes mauell trainiert, lernt es nur aus seinen Fehlern. SpamBayes ist aber noch vielfach effizienter, wenn es aus seinen Erfolgen lernen kann. Die Lösung ist einfach, dass man die Ergebnisse von Spamassassin in SpamBayes automatisch einlernt. Es reicht nämlich, wenn man die E-Mails nimmt, die zu 99,99 Prozent HAM oder SPAM sind. Auf diesem Wege erreicht man eine sehr sehr hochwertige und aktuelle SpamBayes-Datenbasis.

Meine .procmailrc sieht in etwa so aus:

  1. Zuerst wird SpamBayes sb_filter.py aufgerufen. Das Ergebnis von SpamBayes geht wie folgt in SpamAssassin ein:
    1. E-Mails mit Spam-Wahrscheinlichkeit 100 Prozent erhalten 7 Punkte in SpamAssassin.
    2. Eine Wahrscheinlichkeit von 90 bis 99.99 Prozent führt zu 2 Punkten und
    3. eine Wahrscheinlichkeit von 0 bis 10 Prozent führt zu -0,2 Punkten.
  2. Nun wird der SpamAssassin Client spamc aufgerufen.
  3. Danach wird das Python-Script mailfilter ausgeführt. Dieses legt u.a. anhand verschiedener Kriterien eine Löschschwelle fest. Für meine normale private E-Mail-Adresse liegt diese derzeit bei 16,5. Ich habe noch nie eine falsche Positive gesehen, die einen dermaßen hohen Wert hatte. E-Mails, die einen höheren SpamAssassin-Score als ihren Schwellwert haben, erhalten ein Löschkennzeichen.
  4. E-Mails mit Löschkennzeichen werden an Razor gemeldet
  5. E-Mails mit Löschkennzeichen werden in SpamBayes als Spam trainiert.
  6. E-Mails mit negativen SpamAssassin-Score werden in SpamBayes als Ham trainiert.
  7. E-Mails mit Löschkennzeichen werden geloggt und gelöscht.
  8. E-Mails werden nach Regeln in Ordner einsortiert.

Ergebnisse

Nach dem Filtern gibt es drei Stufen im Mailclient:

  • Im Ordner Spam befinden sich E-Mails mit nahezu 100-prozentiger Spamwahrscheinlichkeit, nämlich solche mit SpamAssassin-Score zwischen 10 und Löschschwelle. Der Umfang beläuft sich auf etwa 5-20 E-Mails pro Tag, die manuell nach falschen Positiven durchgeschaut werden.
  • Letzteres gilt ebenso für die E-Mails in Vielleicht-SPAM. Das sind etwa 5 Stück pro Tag.
  • So in etwa 0-2 Spam-E-Mails pro Tag landen auch im Posteingang. Das halte ich für vertretbar.

Die Erfolgsquote liegt damit bei deutlich jenseits von 99,99 Prozent.