HowTo / FAQ / Spam-Bekämpfung mit Spamassassin

Vielen von Euch ist es sicher schon aufgefallen: der SPAM, die unerwünschten Werbe-Emails, nehmen täglich zu - zur Zeit (9/04) bekomme ich allein etwa 100 SPAM Mails pro Tag, dazu kommen noch die Virenwarnungen...

Das kann man alles per Hand lesen - muß man aber nicht! Ein sehr mächtiges Tool zum Filtern von Mail sind das Gespann procmail / spamassassin, damit läßt sich das SPAM-Aufkommen drastisch (bis nahezu Null) reduzieren. Im folgenden wird die Verwendung dieser Tools beschrieben, aus rechtlichen Gründen muß dies jedoch leider jeder User selber für sich einrichten oder mich explizit um die Einrichtung bitten (§206, Abs. 2, Nr. 2 StGB, Freiheitsstrafe bis zu 5 Jahre, und die tatsächliche Wertung durch die Gerichte ist noch völlig offen).

Spamassassin konfigurieren

Die Konfigurationsdatei

Zuallererst gilt es, eine gültige Konfigurationsdatei für den Spamassassin anzulegen. Das kann man per Hand machen (indem man in einem Editor die Datei ~/.spamassassin/user_prefs erzeugt) - muß man aber nicht. Unter anderem unter http://www.pipegrep.net/webuserprefs/demo.php und http://www.yrex.com/spam/spamconfig.php finden sich zwei Dienste, die es erlauben, über eine einfach zu bedienende Oberfläche die Datei user_prefs zu erzeugen. Wichtig sind hier vor allem:

Der Threshold:
Zuerst sollte man auf jedem Fall mit einem Threshold von 7.5 oder sogar 10 experimentieren - dann gelangt zwar die eine oder andere SPAM-Mail weiterhin in die Mailbox, aber wenigstens kann man recht sicher sein, daß keine echten Mails verloren gehen. Mit wachsender Trainingsmenge (siehe auch Bayes und auto-learning) kann man dann die Empfindlichkeit steigern.
Bayes:
Sollte auf jeden Fall angestellt sein - nur so kann Spamassassin sich ganz auf den typischen Mailverkehr des Users einstellen.
Auto Learning:
Sollte ebenfalls angestellt sein, es gilt das gleiche wie für den Bayes Filter.
Use Network Checksum Tests:
Hier wird eine Prüfsumme der empfangenen Mail mit einer Datenbasis von Mails verglichen, von denen bekannt ist, das es sich um Spam handelt - zur Zeit eine sehr zuverlässige Methode, Spam zu erkennen. Installiert ist bei uns zur Zeit nur Razor, aber für den Fall, das noch weitere hinzukommen, kann man die ruhig schon einmal einschalten - was nicht installiert ist, wird auch nicht benutzt.
Accepted Languages:
Hier sollte man wirklich nur die Sprachen ankreuzen, die man zur Not zumindest entziffern könnte - das erspart einem die eine oder andere Mail aus dem wachsenden asiatischen Sprachraum (falls man keine asiatischen Sprachen spricht :-).

Spamassassin trainieren

Sobald das Verzeichnis ~/.spamassassin/ angelegt ist und die Datei ~/.spamassassin/user_prefs dort existiert geht es daran, Spamassassin zu trainieren. Je sorgfältiger dies erfolgt, umso besser funktioniert Spamassassin, und umso weniger Mail wird versehentlich als SPAM klassifiziert. Ich gehe im folgenden davon aus, daß alle Mails in einzelnen Dateien im sogenannten mbox-Format im Verzeichnis ~/Mail/ liegen. Eventuell gesammelte SPAM-Mails (die man jetzt sehr gut zum trainieren verwenden kann) liegen gegebenenfalls in einer Datei ~/Mail/spam. Dies ist z.B. das typische Setup, wenn Standard Unix-Programme wie elm, pine oder mutt als Mailer verwendet werden. Man kann dann wie folgt trainieren:

# SpamAssassin ist ein Perl-Programm
kogs1>/home/utcke% module add perl
# wechsle ins Home-Verzeichnis
kogs1>/home/utcke% cd
# Lege das Verzeichnis an...
kogs1>/home/utcke% mkdir ~/.spamassassin
# ...und erzeuge die Datei user_prefs
kogs1>/home/utcke% cp ~utcke/.spamassassin/user_prefs ~/.spamassassin/user_prefs
# trainiere erwünschte Mails (HAM)
kogs1>/home/utcke% foreach file (`ls ~/Mail/* | grep -v spam`)
foreach? sa-learn --showdots --ham --mbox $file
foreach? end
# trainiere unerwünschte Mails (SPAM)
kogs1>/home/utcke% foreach file (~/Mail/*spam*)
foreach? sa-learn --showdots --spam --mbox $file
foreach? end

Wer Mozilla als Mailer verwendet, findet seine Mails entsprechend statt in ~/Mail in .mozilla/$USER/*/Mail/, Netscape-User finden ihre Mails in ~/nsmail. Wer nicht weiß, wo sein Mailer die Mails ablegt (oder in welchem Format) kann mir gerne mailen, wir gehen dann gemeinsam auf Entdeckungsreise...

Razor konfigurieren

Bei Razor handelt es sich um einen sogenannten Network Checksum Tests, d.h. hier wird eine (fuzzy) Prüfsumme der empfangenen Mail mit einer Datenbasis von Mails verglichen, von denen bekannt ist, das es sich um Spam handelt - zur Zeit eine sehr zuverlässige Methode, Spam zu erkennen. Um Razor verwenden zu können, muß man es jedoch erst einmal initialisieren:

# Razor ist ein Perl-Programm
kogs1>/home/utcke% module add perl
# create a default config file ~/.razor
kogs1>/home/utcke% razor-admin -create
# Razor basiert auf einem Netzt des Vertrauens
# deshalb sollte man sich dort registrieren
kogs1>/home/utcke% razor-admin -register -user=$USER@kogs.informatik.uni-hamburg.de

Die Registrierung ist notwendig, da Razor auf einem Netzwerk des Vertrauens aufbaut - um sich aber Vertrauen erwerben zu können, ist eben auch eine eindeutige Identifikation nötig.

Procmail konfigurieren

Bei procmail handelt es sich um das Programm, welches die Mail letztendlich zustellt. Per default landet die Mail in /var/mail/$USER, man kann jedoch die Zustellung durch diverse Regeln beeinflussen. Alle diese Regeln werden in der Datei ~/.procmailrc gesammelt. Ein nahezu minimales ~/.procmailrc könnte wie folgt aussehen:

# Das Verzeichnis, in dem Mail aufbewart wird - der Pfad unten ist der
# default für alle traditionellen Unix-Programme. Dort werden die
# verdächtigen Mails gesammelt, und ebenso die Log-Datei.
MAILDIR = $HOME/Mail

# Die Log-Datei - wichtig, um zu überprüfen, wohin vermisste Mail
# verschwunden ist...
LOGFILE = $MAILDIR/.procmail.log

# Zum automatischen Löschen von Virenwarnungen unseres Virenscanners die
# Kommentar- und Leerzeichen am Anfang der folgenden Zeilen entfernen
#
# :0
# * ^From postmaster@rzdspc1.informatik.uni-hamburg.de
# * ^Subject: VIRUS IN MAIL FOR YOU
# /dev/null

# SpamAssassin sample procmailrc
#
# Pipe the mail through spamassassin.
# The condition line ensures that only messages smaller than 250 kB
# (250 * 1024 = 256000 bytes) are processed by SpamAssassin. Most spam
# isn't bigger than a few k and working with big messages can bring
# SpamAssassin to its knees.
# Lokale Anpassung: Nur Mails, die über eines unserer Mail-Gateways
# (rzdspc1.informatik.uni-hamburg.de or rzaixsrv2.rrz.uni-hamburg.de)
# gelaufen sind, werden geprüft, nicht aber lokal zugestellte Mails

# f: Consider the pipe as a filter
# w: Wait for the filter/program to finish and check its exitcode

:0fw: spamassassin.lock
* ^Received: from (rzdspc1.informatik.uni-hamburg.de|rzaixsrv2.rrz.uni-hamburg.de)
* ≤ 256000
| /software/perl-5.6.1/SunOS-5.6/bin/spamassassin

# All mail tagged as spam (eg. with a score higher than the set threshold)
# is moved to "spamassassin.new".

:0:
* ^X-Spam-Status: Yes
$MAILDIR/spamassassin.new

Eine online-Version findet sich hier.

.forward-File nach Procmail konvertieren

Einige User verwenden ein .forward-File, um zum Beispiel Ihre Mail auf einen anderen Account umzulenken oder aber automatisch eine Abwesenheitsbenachrichtigung versenden zu lassen. Sobald ein .procmailrc-File existiert, wird jedoch das .forward-File ignoriert. Es ist deshalb notwendig, das .procmailrc entsprechend anzupassen. Wie das geht, ist hier für die beiden häufigsten Fälle beschrieben:

# Leite alle Mails in Kopie an eine andere Adresse weiter (d.h. eine
# Kopie verbleibt hier). Sollen Lokal keine Mails aufbewahrt werden,
# ist das "c" in der nächsten Zeile zu löschen:
:0 c
! user@andere.adresse.de
Den obigen Code kann man hier runterladen.
# Benutze das Programm vacation, um maximal einmal pro Woche und
# Absender eine Urlaubsbenachrichtigung (in .vacation.msg) zu
# versenden (siehe auch "man vacation").
:0 h c
* !^FROM_DAEMON
* !^X-Loop:.*$LOGNAME
| vacation utcke
Den obigen Code kann man hier runterladen.

Cron-Job hinzufügen

Zu guter letzt brauchen wir noch einige cron-jobs, daß sind Prozesse, die regelmäßig zu einer festgelegten Zeit laufen und uns darüber auf dem laufenden halten, welche Mails als Spam klassifiziert wurden und die in den log-Dateien aufräumen. Dazu ruft man auf der kogs1 das Programm crontab -e auf, um die sogenannte cron-Datei zu ändern. ACHTUNG: crontab verwendet als Editor das Programm, welches in der Variablen $EDITOR oder $VISUAL steht - oder vi, wenn nichts gesetzt wurde. Aus vi entkommt man mit der etwas kryptischen Tastenkombination ESC : q ! RETURN, aber besser setzt man die beiden Variablen $EDITOR und $VISUAL, z.B. so:


# Um emacsclient zu verwenden, muß man in emacs "M-x server-start" ausführen
# man kann aber natürlich auch jeden anderen Editor hier eintragen
kogs1>/home/utcke% setenv EDITOR emacsclient
# für X11
kogs1>/home/utcke% setenv VISUAL emacsclient
# editiere das crontab-file
kogs1>/home/utcke% crontab -e

In die crontab trägt man folgendes ein:

# m h d m weekday command
#
# Jeden Morgen um 9:00 versendet das Script spam_update eine
# Zusammenfassung der in spamassassin.new gespeicherten Mails an den
# User und leert dann die Datei ~/Mail/spamassassin.new in die Datei
# ~/Mail/spamassassin aus.
0 9 * * * /home/utcke/bin/spam_update spamassassin > /dev/null 2>&1
#
# logfile-rotation
#
# Jeden Sonntag um 4:00 wird die Datei procmail.log in procmail.log.0
# umbenannt, eine eventuell vorhandene procmail.log.0 in
# procmail.log.1.gz und so weiter bis zur procmail.log.5.gz, die in
# procmail.log.6.gz umbenannt wird. Eine eventuell schon vorhandene
# procmail.log.6.gz wird gelöscht.
# Das gleiche geschieht auch für razor-agent.log.
0 4 * * 0 /home/utcke/bin/savelog $HOME/Mail/procmail.log
0 4 * * 0 /home/utcke/bin/savelog $HOME/.razor/razor-agent.log

Eine online-Version findet sich hier.

Sven Utcke

Valid HTML 4.0! Valid CSS!

last modified: 10-Nov-2006