Spam-Mails

Spam-Abwehr mit Linux

11.05.2005 von STEFAN RUBNER  und Jürgen Donauer
Über 50 Prozent der E-Mails sind derzeit Spam. Kaum hat man den eigenen Mail-Server eingerichtet, schlägt daher die erste Werbe-Mail auf. Mit dem Mail-Filter SpamAssassin werden Sie aber schnell wieder Herr der Lage.

Der Transport von E-Mail macht einen erheblichen Anteil an der täglich über das Internet bewegten Datenmenge aus. Leider hat jedoch der weitaus größte Teil davon nichts mit der direkten Kommunikation zwischen einzelnen Personen zu tun. Stattdessen enthalten mittlerweile mehr als 50 Prozent aller Nachrichten Werbung - noch dazu die vom Empfänger in aller Regel meist unerwünschte Form, Spam.

Gerade diejenigen, die viel über das Internet kommunizieren oder sehr aktiv in Foren tätig sind, bekommen das Problem am stärksten zu spüren. Dank spezieller Robot-Programme, die das Web nach verwertbaren E-Mail-Adressen durchforsten, landen sie am schnellsten auf den Listen der Spammer. Aber auch wer seine E-Mail-Adresse schützt, sich nicht an öffentlichen Diskussionen beteiligt und sich von Angeboten fernhält, die zum Hinterlassen der Mail-Adresse auffordern, kann Opfer der Spammer werden. Diese gehen nämlich vermehrt dazu über, nicht nur per Sammel-Software ermittelte, sondern auch einfach zufällig generierte Adressen anzuschreiben. Die einzig wirklich hilfreiche Waffe gegen Spam sind Spam-Filter, die die Spreu vom Weizen trennen und in Zusammenarbeit mit Mail-Server oder Mail-Client für Ruhe im Postfach sorgen.

SpamAssassin: ein flexibler Spam-Filter

Der Spam-Filter SpamAssassin erfreut sich gerade unter Linux-Benutzern größter Beliebtheit. Das in der Skriptsprache Perl erstellte Paket bietet vielfältige Funktionen zum Aufspüren unerwünschter Nachrichten und ist deshalb Bestandteil der meisten Linux-Distributionen. SpamAssassin prüft eintreffende E-Mail-Nachrichten mit mehreren Verfahren auf die Wahrscheinlichkeit, dass es sich bei der untersuchten Post um Spam handelt:

Allerdings ähnelt der Kampf gegen Spam dem Wettrennen, das sich auch Viren-Schreiber und die Hersteller von Antivirus-Software liefern. Es tauchen immer neue Verfahren auf, mit denen Spam als normale Nachricht getarnt werden soll. Entsprechend verwenden die Spam-Filter immer neue Algorithmen zur Spam-Erkennung. Diese sich schnell drehende Spirale macht keine der aktuellen Linux-Distributionen mit und so enthalten alle derzeit erhältlichen Angebote eine mehr oder minder stark veraltete Version von SpamAssassin. Außerdem sind die von den Anbietern der Distribution getroffenen Voreinstellungen eher suboptimal und die Integration in das Mail-System ist meist nicht vorhanden. Genug Gründe also, selbst Hand anzulegen.

Installation der Software

Wenn Sie bereits alles aus dem Ordner /zusatzpakete von der CD installiert haben, befindet sich SpamAssassin mit allen abhängigen Paketen auf Ihrem System.

Der einfachste und komfortabelste Weg, an die neueste Version zu gelangen, ist der über CPAN (Comprehensive Perl Archive Network).

Das funktioniert allerdings mit SUSE 9.2 nicht. Die Installation klappt zwar noch. Da SUSE aber anscheinend diverse Pakete verändert hat, gehen Ihnen bei der Filterung mit der Originalversion von SpamAssassin alle Mails verloren! Im Maillog sieht das dann so ähnlich aus

Feb 14 20:18:44 linux postfix/qmgr[14705]: warning: transport spamd failure -- see a previous warning/fatal/panic logfile record for the problem description

und die E-Mail ist im Nirvana verschwunden.

Mit nachfolgenden Zeilen sparen Sie sich auf anderen Systemen das übliche Vorgehen "Download, Entpacken, Konfigurieren, Compilieren".

su -
perl -MCPAN -e 'install Mail::SpamAssassin'
perl -MCPAN -e 'install DB_File'
perl -MCPAN -e 'install Net::DNS'

Die letzten zwei Befehle richten Zusatzmodule ein, die von SpamAssassin nicht unbedingt benötigt werden, deren Installation aber sinnvoll ist. Um das Modul DB_File einrichten zu können, muss das Development-Paket für Berkeley DB, meist db-devel-<version> genannt, auf dem Rechner eingerichtet sein.

Sollte dies der erste Aufruf des CPAN-Moduls auf dem Rechner sein, dann fragt es zunächst ein paar Parameter ab, bevor es mit der eigentlichen Arbeit beginnt. Hier ist lediglich darauf zu achten, dass bei der Frage nach den zu verwendenden Download-Servern eine vernünftige Wahl erfolgt, bei den restlichen Fragen bietet das Modul schon sinnvolle Vorgaben an.

Während der eigentlichen Installation von SpamAssassin fragt das System gleich nach der E-Mail-Adresse, an die Status-Meldungen zu senden sind und erledigt die restliche Installation vollautomatisch. Den Erfolg der Aktion überprüft ein erster Aufruf von SpamAssassin mit dem Paramter -V zur Ausgabe der Versionsnummer:

spamassassin -V

Die zwei Betriebsmodi

Zur Prüfung der eingehenden Nachrichten kennt SpamAssassin zwei unterschiedliche Methoden. Zum einen den Aufruf von SpamAssassin für jede Nachricht, zum anderen die Arbeit als ständig im Hintergrund laufender Daemon, den ein Hilfsprogramm mit den zu prüfenden Mails füttert. Die Daemon-Variante hat den Vorteil höherer Verarbeitungsgeschwindigkeit. Ihr Nachteil besteht darin, dass sich Filterregeln und auch der Bayes'sche Filter in diesem Modus nur global definieren lassen. Allerdings ist dieser Nachteil in den meisten Fällen eher virtuell, da das Gros der Anwender sowieso zu faul ist, den Bayes'schen Filter zu trainieren oder eigene Filterregeln zu entwerfen. Hier bietet der Daemon dann sogar den Vorteil, dass auch diese Anwender von der Arbeit der anderen Nutzer profitieren. Es macht daher Sinn, die Daemon-Variante zu wählen.

Um nach der rpm-Installation den Daemon beim Start des Rechners automatisch zu laden, verwenden wir wieder das Programm chkconfig.

chkconfig spamd 35

trägt den SpamAssassin in die Runlevels drei und fünf ein.

Haben Sie den Spamkiller über CPAN geholt, benötigen Sie zuerst einmal ein Start-Script. Anstatt es eigenhändig zu schreiben oder durch Kopieren und Probieren aus einem vorhandenen Script zu erzeugen, bietet sich eine komfortablere Alternative an: Im CPAN-Paket von SpamAssassin befinden sich bereits vorgefertigte Scripts für Red Hat, Slackware, NetBSD und Solaris. Netterweise löscht das CPAN-Modul die zur Installation verwendeten Pakete nicht, sondern speichert sie in einem Cache-Verzeichnis. Das entsprechende Script müssen Sie also nur aus dem Archiv extrahieren, tar -xzvf ~/.cpan/sources/authors/id/F/FE/FELICITY/Mail-SpamAssassin-3.0.2/ Mail-SpamAssassin-3.0.2/spamd/*.sh

mit dem richtigen Namen in das Verzeichnis /etc/init.d kopieren und in den relevanten Runlevels eintragen.

Basiskonfiguration

Ab hier funktioniert es auch wieder mit SuSE 9.2. Obwohl Sie SpamAssassin auch dazu verwenden können, für einen einzelnen Mail-Client die Filterung zu übernehmen, ist sein häufigstes Einsatzgebiet unter Linux sicher das Zusammenspiel mit einem Mail-Server. Die hierbei verwendeten Arbeitseinstellungen entnimmt der Daemon-Prozess der Datei /etc/mail/spamassassin/local.cf.

Diese wird bei der Installation automatisch erzeugt, enthält aber keine Befehle, so dass SpamAssassin mit der Default-Konfiguration arbeitet. Für den Betrieb als systemweiter Daemon genügt dies jedoch nicht, zumindest ein paar weitere Parameter sind noch zu setzen. Diese betreffen vor allem die erweiterten Funktionen wie "Auto-Whitelist" und den "Bayes-Filter". Beide arbeiten mit dateibasierten Datenbanken, für die erst einmal Verzeichnisse anzulegen sind, zum Beispiel im Verzeichnisbaum unterhalb von /var.

mkdir -p /var/cache/spam/awl
mkdir -p /var/cache/spam/bayes

Auto-Whitelist

Der Name Auto-Whitelist für diese Funktion ist eigentlich falsch gewählt. Richtiger müsste es Auto-White/Blacklist heissen. Diese Funktion merkt sich für die Mails jedes Absenders deren Spam-Wert, bildet aus allen vorliegenden Informationen den Mittelwert und passt für weitere eintreffende Nachrichten den Spam-Wert in Richtung des Mittelwerts an.

Ein Beispiel: Treffen vom selben Absender zwei Nachrichten ein, wobei SpamAssassin für die erste den Spam-Wert 20, für die zweite eigentlich den Spam-Wert 2 errechnet, dann passt die Auto-Whitelist-Funktion den Spam-Wert für die zweite Nachricht auf 11 an. Das funktioniert natürlich auch in die andere Richtung. So findet zum Beispiel für einen Absender, der zwar viele Nachrichten aber keinen Spam gesendet hat, zunächst eine Korrektur des Spam-Werts nach unten statt.

Die Auto-Whitelist-Funktion ist per Default aktiviert, allerdings muss SpamAssassin noch wissen, wo er seine Datensammlung ablegen soll. Dazu erweitern Sie die Datei /etc/mail/spamassassin/local.cf um den passenden Parameter:

use_auto_whitelist 1
auto_whitelist_path /var/cache/spam/awl/

Es bietet sich an, wie oben gezeigt, den Parameter zur Aktivierung der Auto-Whitelist-Funktion ebenfalls mit in die Konfiguration aufzunehmen. So ist zum einen sofort ersichtlich, welche Funktionen Sie benutzen, zum anderen lassen sich einzelne Features bei Bedarf schnell abschalten, ohne dass ein Suchen nach den Vorgabewerten in der Dokumentation nötig ist.

Bayes-Filter

In den letzten Monaten ist es bei vielen Anti-Spam-Tools Mode geworden, einen naiven Bayes-Filter zu verwenden. Dieser arbeitet mit relativen Häufigkeiten bestimmter Schlüsselwörter (Tokens), um eine Mail als Spam oder Ham (Nicht-Spam) zu identifizieren. Genau wie Auto-Whitelist verwendet er eine Datenbank, deren Pfad ihm mitgeteilt werden muss.

use_bayes 1
bayes_path /var/cache/spam/bayes/
bayes_auto_learn 1

Der letzte Parameter weist SpamAssassin an, den Bayes-Filter automatisch zu trainieren. Das ist sinnvoll, da SpamAssassin ja mit einem Mail-Server zusammenarbeiten soll. Dieser ist im Gegensatz zu einem Anwender an einem Mail-Client nicht in der Lage, den Filter manuell zu trainieren, weshalb SpamAssassin diese Aufgabe selbst erledigen muss. Zur Sicherheit verwendet er in diesem Modus nur Mails mit extrem hohen oder extrem niedrigen Spam-Werten für die Trainingsfunktion.

Fremdsprachenfilter

Für viele Anwender ist es recht einfach, Spam auf den ersten Blick zu erkennen: Die Mails sind in einer Sprache abgefasst, die er normalerweise nicht verwendet. Wer zum Beispiel ausschließlich mit deutschsprachigen Geschäftspartnern kommuniziert, erhält in aller Regel von diesen keine Nachrichten in Englisch, Französisch oder Spanisch. Dies macht sich SpamAssassin zu Nutze und gestattet es, bestimmte Sprachen im Nachrichtentext zu akzeptieren, während anderssprachige Mails mit einem Malus belegt werden. Die Einstellung erfolgt über zwei Paramter in local.cf:

ok_languages en de
ok_locales en

Mit diesen Einstellungen gelten Englisch und Deutsch als verwendete Sprachen, alle anderen werden als potenzielle Spam-Kandidaten angesehen. Der Parameter ok_locale dient zum weiteren Feintuning. Er wertet den verwendeten Zeichensatz aus. Da alle westlichen Sprachen hier ISO-8859-1 - auch bekannt als Latin-1 - verwenden, gilt der Bezeichner "en" für alle westlichen Sprachen.

Beim Eingrenzen der erlaubten Sprachen sollte man jedoch größte Sorgfalt walten lassen. Schließlich weiß man nicht immer, mit welchen Partnern und in welchen Sprachen die Anwender des eigenen Mail-Servers kommunizieren. Hier kann es schnell Ärger geben, wenn plötzlich wichtige Nachrichten wegen eines zu eng gesetzten Sprachfilters nicht mehr beim Empfänger ankommen.

Benimmregeln

Von Haus aus kennzeichnet SpamAssassin jede bearbeitete Mail durch Flags im Nachrichtenkopf, die für den Empfänger normalerweise nicht sichtbar sind. Um auch dem Endanwender ein optisches Feedback zu geben, kann SpamAssassin aber zusätzlich die Betreffzeile einer Nachricht ändern, beispielsweise indem es die Zeichenkette "*****SPAM*****" oder eine andere, vom Administrator definierte Nachricht vor den Originalbetreff stellt. Aktiviert werden diese Funktionen über die folgenden Parameter:

rewrite_subject 1
rewrite_header Subject SPAM-Verdacht:

Erkennt SpamAssassin eine Mail als Spam, erzeugt er normalerweise eine neue Nachricht, an die er die Spam-Post als Attachment anhängt. Dieses Verfahren hat den Vorteil, dass die Spam-Inhalte nicht verändert werden. Allerdings gibt es Anwender, die dieses Vorgehen nicht tolerieren, weshalb SpamAssassin auch die Option bietet, Spam nur durch Flags im Header zu kennzeichnen. Für diesen Betriebsmodus ist der standardmäßig auf den Wert "1" gesetzte Paramter report_safe zuständig:

report_safe 0

Setzen Sie den Wert auf "2", damit Spam nicht nur als Attachment an eine neue Nachricht angehängt wird. SpamAssassin verwendet dann zusätzlich als Typ für den Nachrichtenanhang type/text, um dessen automatische Ausführung zu verhindern.

Besonders für Abonnenten von Newslettern ist die Einführung eines Spam-Filters meist ein schwerer Schlag. Speziell HTML-Newsletter haben nur eine geringe Chance, nicht für Spam gehalten zu werden. Damit derartige Post dennoch ungehindert den Weg zum Empfänger findet, bietet SpamAssassin mehrere Möglichkeiten, potenziellen Spam als normale Nachricht zu deklarieren:

whitelist_from absender@keinspammer.de
whitelist_from_rcvd absender@keinspammer.de mail.keinspammer.de
whitelist_to meier@meinedomain.de
more_spam_to mueller@meinedomain.de
all_spam_to huber@meinedomain.de

Das dahinter steckende Prinzip ist recht einfach: Mails von Absendern, die hinter dem Schlüsselwort whitelist_from definiert sind, werden generell nicht als Spam klassifiziert. Ähnlich verhält es sich mit whitelist_from_rcvd, allerdings prüft SpamAssassin hier zusätzlich zur Absenderadresse auch, ob der sendende Mailserver mit dem angegebenen Server übereinstimmt. Über die drei funktional ähnlichen Schlüsselworte whitelist_to, more_spam_to und all_spam_to definieren Sie Empfänger mit unterschiedlichen Toleranzgrenzen für Spam. Benutzer, die Sie unter all_spam_to eintragen, erhalten schlichtweg jede eintreffende Nachricht. Bei den den anderen beiden Varianten werden allzu exzessive Spam-Mails nach wie vor erkannt. Für alle Adressangaben können Sie auch Wildcards verwenden, mehrere Angaben hinter dem Schlüsselwort sind ebenfalls zulässig. Zum Beispiel lässt sich ein Whitelist-Eintrag für mehrere Domains auch so definieren:

whitelist_from *@tecchannel.de *@whocares.de

Selbstverständlich funktioniert das auch in die andere Richtung, um normalerweise nicht als Spam erkannte Nachrichten zwangsweise als Spam zu deklarieren:

blacklist_from *@spam-central.com
blacklist_to public_spam@meinedomain.de

Externe Schnittstellen

Parallel zu den lokalen Spam-Filtern haben sich inzwischen einige Datenbanken im Internet etabliert, die ebenfalls der Spam-Bekämpfung dienen. Sie bieten beispielsweise Prüfsummen bekannter Spam-Nachrichten an, anhand derer sich die eingehende Post sortieren lässt. Zu drei dieser Systeme bietet SpamAssassin eine Schnittstelle: Distributed Checksum Clearinghouse (DCC), Razor und Pyzor. Diese Tools sind jeweils gesondert von SpamAssassin zu installieren. Dabei sollten Sie beachten, dass bei ihrer Nutzung für jede zu prüfende Mail eine Internet-Verbindung aufgebaut wird und Daten über die Leitung gehen. Speziell bei einem nach Volumen abgerechneten Tarif kann das schnell ins Geld gehen. Es ist daher ratsam, die Abschaltoptionen für diese Dienste zumindest als Kommentar in die Konfiguration aufzunehmen:

# use_dcc 0
# use_pyzor 0
# use_razor2 0

Ein weiterer Kandidat für unerwarteten Internet-Traffic ist der Abgleich der Mail-Absender mit verschiedenen schwarzen Listen, den so genannten Real Time Blacklists. In diesen finden sich, häufig aktualisiert, die IP-Adressen bekannter Spam-Versender, offener Relays und anderer Spam-Quellen. Auch hier gilt: die Funktion an sich ist sinnvoll, der Ausschalter sollte trotzdem in der Konfiguration aufgeführt sein:

# skip_rbl_checks 1

Integration in postfix

Nachdem nun die ganze Theorie rund um die einzelnen Filter besprochen ist, bleibt nur noch zu klären, wie man SpamAssassin zur Zusammenarbeit mit dem eigenen Mail-Server bewegt. Je nach verwendeter Server-Software unterscheiden sich die dazu notwendigen Arbeitsschritte. Generell gilt jedoch, dass SpamAssassin als Filter in die Mail-Verarbeitungsroutine integriert wird. Das folgende Beispiel beschreibt die Integration von SpamAssassin in postfix.

Zunächst bringen wir dem MTA bei, E-Mails durch den SpamAssassin zu filtern. Dies geschieht in der Datei master.cf im Verzeichnis /etc/postfix. Suchen Sie nach folgender Zeile

smtp n - n - - smtpd

und fügen Sie die Filterbedingung -o content-filter=spamd an. Die Zeile sieht nach der Modifikation wie folgt aus

smtp n - n - - smtpd -o content_filter=spamd

Durch das Einfügen von

spamd unix - n n - - pipe
user=<user> argv=/usr/bin/spamc -f
-e /usr/sbin/sendmail -oi -f ${sender} ${recipient}

am Ende der Datei teilen wir postfix mit, was der content-filter=spamd tun soll. Beachten Sie, dass die beiden unteren Zeilen mit Leerzeichen beginnen. Das ist wichtig. Andernfalls weiß der MTA nicht, dass die drei Zeilen zusammengehören. Die Parameter user und argv geben den Benutzerkontext und das auszuführende Programm an. Dabei muss <user> auf dem System vorhanden sein. Nach einem Neustart von postfix mit

/etc/init.d/postfix reload

ist die Konfiguration abgeschlossen, und jede eingehende E-Mail wird durch SpamAssassin gefiltert.

Zusammenarbeit mit procmail

Die Integration in den MTA hat nur einen Schwachpunkt. Der Spam-Filter wird für alle eingehenden Mails aufgerufen. Eventuell ist das aber gar nicht erwünscht. Sie haben jedoch die Möglichkeit, SpamAssassin nur für einzelne Benutzer zu entfesseln. Wählen Sie diesen Weg, dann müssen Sie im home-Verzeichnis des Benutzers eine Datei .forward mit dem Inhalt

| /usr/bin/procmail

anlegen. Jede E-Mail für diesen User wird jetzt durch procmail gefiltert. Nun gibt es zwei Möglichkeiten: Entweder der Anwender hat eine eigene Filterdatei oder Sie konfigurieren eine globale. Die persönliche Filterdatei liegt im home-Verzeichnis des Benutzers und heißt .procmailrc (mit Punkt am Dateianfang). Die globale Filterdatei legen Sie im Verzeichnis /etc ab und nennen diese procmailrc (ohne Punkt am Dateianfang). In diesen Dateien werden so genannte Rezepte hinterlegt. Für den SpamAssassin sieht das so aus:

:0fw
| /usr/bin/spamc

oder wenn der Spam-Filter nicht als Daemon läuft

:0fw
| /usr/bin/spamassassin

Eine persönliche Rezeptdatei macht allerdings nur dann Sinn, wenn Sie procmail nicht nur für das Filtern von Spam benutzen. Hier ist die Variante über die globale procmailrc wesentlich weniger aufwendig.

Fazit

SpamAssassin ist ein leistungsfähiger, flexibler Spam-Filter, der allerdings ein wenig Fingerspitzengefühl bei der Installation und Wartung erfordert. Das gilt insbesondere, wenn es an die Optimierung der Gewichtungen geht.

Umfangreiche Tuning-Optionen erlauben die Anpassung auf individuelle Bedürfnisse. Ist die Hürde der Integration in den Mail-Server erst einmal genommen, erfreut SpamAssassin mit einer sehr hohen Trefferquote. (mha)