Bei über 60 Prozent aller E-Mail-Nachrichten handelt es sich um Spam – Tendenz steigend. Seitens der Provider ist nicht mit Hilfe zu rechnen. Dieser Artikel zeigt, wie Sie mit wenigen Handgriffen einen eigenen, leistungsfähigen Spam-Filter aufsetzen.
Spam-Mails sind heute allgegenwärtig, kaum ein E-Mail-Account bleibt davon verschont. Tatsächlich stellen sie bereits den überwiegenden Teil des Mail-Aufkommens, weltweit etwa 60 Prozent. Dazu kommen immer mehr Viren und Würmer, die über infizierte Rechner elektronischen Müll in die ganze Welt verschicken.
Aufgrund fehlender Standards zur Spam-Verhinderung durch die Provider muss jeder einzelne Benutzer selbst aufrüsten. Wer seine E-Mails zum Beispiel mit fetchmail abruft, kann mit Hilfe des Standard-Programms procmail sehr wirkungsvolle Spam-Filter aufbauen. Wenn Sie den Filter regelmäßig pflegen und nachschärfen, können Sie damit über 80 Prozent Spam automatisch erkennen und vorab aussortieren lassen.
Auf den Kopf geschaut
Der Kopf einer E-Mail birgt die meisten Informationen, anhand denen Sie sinnvolle E-Mails von Spam und anderen Massen-Mailings unterscheiden können. Üblicherweise verbergen E-Mail-Programme den Kopf einer Nachricht und zeigen statt dessen die wenigen für den Benutzer interessanten Felder wie Absender, Empfänger, Datum und Betreff an.
Den Inhalt einer kompletten E-Mail finden Sie in den Ordnern Ihres E-Mail-Programms – vorausgesetzt, das Programm hat die Mails im so genannten Mbox-Format gespeichert. Listing 1 zeigt einen verkürzten Auszug eines E-Mail-Kopfes mit den für die Spam-Abwehr wichtigsten Feldern. Je nach E-Mail-Programm des Absenders und Software Ihres Providers fällt der Kopf mehr oder minder umfangreich aus.
Listing 1
Kopf einer E-Mail
Return-path: <h.g.esser@easylinux.de>
Envelope-to: mdoelle@localhost
Delivery-date: Mon, 22 Nov 2004 16:02:22 +0100
Received: from localhost ([127.0.0.1])
by troy.linux-magazin.de with esmtp (Exim 3.33 #1 (Debian))
id 1CWFhu-0000Sj-00
for <mdoelle@localhost>; Mon, 22 Nov 2004 16:02:22 +0100
Delivered-To: mdoelle@linuxnewmedia.de
Received: from [192.168.1.118] (kira.linux-magazin.de [192.168.1.118])
by mail.linux-new-media.de (Postfix) with ESMTP id 5F1552A402C
for <mdoelle@linuxnewmedia.de>; Mon, 22 Nov 2004 14:54:06 +0100 (CET)
Message-ID: <41A1EF2D.4020404@easylinux.de>
Date: Mon, 22 Nov 2004 14:52:45 +0100
From: Hans-Georg Esser <h.g.esser@easylinux.de>
To: =?ISO-8859-1?Q?Mirko_D=F6lle?= <mdoelle@linuxnewmedia.de>
Subject: Re: Procmail
In-Reply-To: <20041119175340.391D92A402D@mail.linux-new-media.de>
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Falsche Adressen
Die in Zeile 1 genannte Rücksendeadresse kommt vom ersten Mailserver, der die Nachricht vom E-Mail-Programm des Benutzers entgegengenommen hat. Die Angabe stammt meist aus der Benutzerdatenbank des Servers, wenn sich der Versender wie heute üblich beim Mailserver anmelden musste. Es handelt sich um die “wahre” Absenderadresse – sie ist jedoch keinesfalls fälschungssicher.
Zeile 15 enthält die E-Mail-Adresse, die der Benutzer in seinem Mail-Client als Absender eingegeben hat und unter der er eine Antwort erwartet. Der Unterschied zwischen den Adressen in Zeile 1 und 15 wird deutlich, wenn sich etwa eine ganze Familie einen Internet-Zugang bei T-Online teilt: Für den Versand über T-Online verwenden alle den T-Online-Server – dieser setzt als Rücksendeadresse die E-Mail-Adresse des Vertragsinhabers ein. Für den Empfang nutzen alle Familienmitglieder jedoch ihre eigenen E-Mail-Adressen, zum Beispiel von Free-Mailern wie Web.de oder GMX – diese Adresse finden Sie dann in Zeile 15.
Ein wichtiges Indiz für Trojaner und Würmer ist die Message-ID in Zeile 13. Diese Angabe füllt normalerweise das E-Mail-Programm des Versenders aus, um Antworten der ursprünglichen E-Mail zuordnen zu können. Vielen Wurm-Mails fehlt die Message-ID – statt dessen setzt das Abruf-Programm fetchmail eine aus der Uhrzeit und dem Rechner-Namen generierte Message-ID in den Kopf der E-Mail ein. Mails mit Ihrer eigenen Domain in der Message-ID sind also praktisch ausnahmslos Trojanische Pferde.
Die Zeilen 8 bis 10 der Procmail-Konfigurationsdatei .procmailrc aus Listing 2 zeigen eine Regel zum Ausfiltern von E-Mails mit der eigenen Domain in der Message-ID – in diesem Fall lautet die eigene Domain troy.linux-magazin.de. Die Syntax ist relativ einfach: Die erste Zeile beginnt stets mit der Marke :0 gefolgt von dem zu durchsuchenden Teil der E-Mail, das “H” steht hier für den Header (Kopf).
Listing 2
Die Procmail-Konfiguration
MAILDIR=$HOME/mail LOGFILE=$HOME/.procmail.log LOGABSTRACT=all LOCKFILE=$HOME/.lockfile INBOX=/var/spool/mail/mdoelle ADDRESSBOOK=$HOME/.addressbook :0 H * ^Message-Id:.*troy\.linux-magazin\.de.* viren :0 H * ^Subject:.*[ÂÁÇõ¿].* spam :0 H * (girls|payment|prescription|viagra) spam :0 Hw * ? /usr/local/bin/checkaddrbook $ADDRESSBOOK bekannte
Reguläre Filter
Darunter stehen die eigentliche Filterkriterien. Jede Zeile beginnt mit einem Stern und einem Leerzeichen, dahinter steht der reguläre Ausdruck. Treffen alle regulären Ausdrücke aller Filterkriterien zu, wird die E-Mail in den in der letzten Zeile angegebenen Folder verschoben – hier nach viren im Verzeichnis $HOME/mail.
Eine gute Referenz für reguläre Ausdrücke enthält das Perl Quick Reference Guide von [1], eine kurze Übersicht der Operatoren regulärer Ausdrücke finden Sie in Tabelle 1. Das Beispiel aus Zeile 9 von Listing 2 enthält drei reguläre Operatoren: Das Caret (Dach) signalisiert, dass der nun folgende reguläre Ausdruck am Anfang der Zeile vorkommen muss, dahinter stehen die ersten gesuchten Zeichen. Dieser reguläre Ausdruck trifft also nur auf Zeilen zu, die mit der Zeichenfolge Message-Id: beginnen. Groß-Kleinschreibung wird standardmäßig ignoriert.
Tabelle 1: Reguläre Ausdrücke
| ^ | Der folgende Ausdruck steht am Anfang der Zeile |
| $ | Die vorangehende Ausdruck steht am Ende der Zeile |
| . | Ein beliebiges Zeichen (auch Tabulatoren und Steuerzeichen) |
| ? | Das vorhergehende Zeichen, Operator oder Gruppierung kein mal oder ein mal |
| * | Wie “?”, jedoch kein mal bis beliebig oft |
| + | Wie “?”, jedoch mindestens ein mal bis unendlich oft |
| [a-z123] | Alle Buchstaben von a bis z sowie die Zahlen 1, 2 und 3 |
| [^a-z] | Alle Zeichen außer die Buchstaben a bis z |
| de|com | Entweder die Zeichenfolge “de” oder “com” |
| () | Gruppiert den zwischen den Klammern stehenden Ausdruck zu einem Operator, ein “*” oder “?” dahinter bezieht sich also auf den gesamten Ausdruck |
| ! | Invertiert die nachfolgende Gruppe |
| \ | Escape: Hebt die besondere Bedeutung des nachfolgenden Zeichens auf |
Der Punkt hinter dem Doppelpunkt ist der Operator für ein beliebiges Zeichen. Der Stern dahinter bedeutet, dass der vorangegangene Operator beliebig oft vorkommen kann. Zusammen genommen passt “.*” auf eine beliebige Anzahl von beliebigen Zeichen, also schlicht auf alles. Dahinter folgt die Domain, nach der Sie suchen. Da der Punkt in regulären Ausdrücken eine Sonderbedeutung hat, müssen Sie ihm einen Backslash (“\”) voran stellen, wenn Sie wirklich nur einen Punkt zulassen wollen – man nennt dies Escapen. Hinter der Domain dürfen dann wieder beliebig viele Zeichen folgen, symbolisiert durch “.*”.
Der gesamte reguläre Ausdruck passt also nur auf Zeilen, die mit “Message-ID:” beginnen und dahinter irgendwo die Domain “troy.linux-magazin.de” enthalten.
Ein weiteres Indiz für ausländische Spam-Mails stellt das Auftauchen von Sonderzeichen dar, die im deutschen und englischen Sprachraum nicht üblich sind. Die Regel aus den Zeilen 12 bis 14 von Listing 2 fängt solche E-Mails ab, indem sie in der Betreffzeile nach einigen ausgewählten Sonderzeichen sucht: Tragen Sie einfach alle verdächtigen Zeichen zwischen den eckigen Klammern von Zeile 13 ein. Kommt eins dieser Zeichen in der Betreffzeile (Subject) vor, landet die E-Mail im Spam-Folder.
Verdächtige Worte
In der nächsten Regel aus Listing 2 sucht Procmail nach bestimmten, für Spam-Mails typischen Worten. Die Liste in Zeile 17 können Sie nach Belieben erweitern. Trennen Sie einfach alle Begriffe durch ein Pipe-Zeichen. Kommt eins der Worte im Betreff vor, landet die Mail im Spam-Folder. Wenn Sie neben dem Kopf der E-Mail auch die Nachricht selbst auf diese Schlüsselwörter hin untersuchen lassen wollen, tragen Sie in Zeile 16 hinter dem “H” für den Header noch ein “B” für den Body (Rumpf) der E-Mail ein. Tabelle 2 enthält die wichtigsten Flags von Procmail.
Tabelle 2: Such-Flags einer Regel
| H | Suche im Kopf (Header) |
| B | Suche im Inhalt der E-Mail (Body) |
| D | Unterscheide Groß-Kleinschreibung |
| A | Prüfe diese Regel nur dann, wenn die vorherige Regel angewandt wurde (And) |
| E | Prüfe diese Regel nur dann, wenn die vorherige Regel nicht angewandt wurde (Else) |
| h | Übergibt den Kopf an einen Befehl |
| b | Übergibt den Inhalt an einen Befehl |
| f | Verwende einen Befehl als Filter |
| c | Erstellt eine Kopie der Nachricht |
| w | Warte auf den Rückgabewert des Filterprogramms |
Filter-Regeln für den Inhalt sind jedoch mit Vorsicht zu genießen: Binärdaten wie Bilder und die meisten anderen E-Mail-Anhänge werden MIME-codiert übertragen – also in Buchstaben, Zahlen und wenige Sonderzeichen umgewandelt. Das rührt noch aus Tagen her, in denen die Mailserver lediglich mit 7 Bit arbeiteten. Würden Sie den Rumpf einer Mail nach “sex” durchsuchen lassen, bekämen Sie für fast jeden E-Mail-Anhang einen Treffer.
Externe Filterprogramme
Auch für die einzelnen Filterkriterien gibt es Zusatz-Flags. Die wichtigsten sind das Fragezeichen und das Ausrufezeichen. Die Syntax zeigt der vierte und letzte Filter unseres Beispiels aus Listing 2: Das Zeichen wird einfach in der Zeile des Filterkriteriums hinter den einleitenden Stern geschrieben.
Das Ausrufezeichen negiert schlicht das Filterkriterium: Der reguläre Ausdruck dahinter darf nun nicht zutreffen, damit das Kriterium als erfüllt gilt. Das Fragezeichen hingegen eröffnet nahezu grenzenlose Möglichkeiten: Wann immer Procmail auf ein solches Filterkriterium wie in Zeile 21 stößt, ruft es die Befehlszeile hinter dem Fragezeichen auf. Mit dem Such-Flag “w” in Zeile 20 wartet Procmail auf das Ergebnis des Programmaufrufs. Liefert dieser den Rückgabewert 0, gilt das Kriterium als erfüllt, bei allen anderen Werten nicht.
Das Beispiel aus den Zeilen 20 bis 22 verwendet checkaddrbook von [3] auf und übergibt den Kopf der E-Mail auf die Standard-Eingabe des Programms. Bei diesem handelt sich um ein kurzes Perl-Skript, das die Absender-Adresse aus dem übergebenen Kopf der E-Mail daraufhin prüft, ob sie im Adressbuch enthalten ist. Wenn ja, beendet sich das Skript mit dem Rückgabewert 0 und Procmail speichert die E-Mail im Folder bekannte.
Alles im Griff
Die vier Beispiele aus Listing 2 zeigen nur einen Bruchteil der Fähigkeiten von Procmail. Mit der Möglichkeit, externe Programme als Filterkriterium heranzuziehen, können Sie mit Procmail fast beliebig exakt filtern. Sogar selbstlernende Filter wären denkbar, entsprechende Programmierkenntnisse vorausgesetzt. Weitere Beispiele zur Konfiguration finden Sie im Artikel unter [3].
Das Rennen zwischen Spam-Versendern und uns Anwendern haben wir jedoch schon verloren: Die Spam-Industrie lässt sich immer neue Methoden einfallen, um auch den gewieftesten Spam-Filter auszutricksen. Abhilfe ist nicht in Sicht, die Provider scheinen sich nicht einmal auf gemeinsame Standards für Spam-Abwehr verständigen zu können. So bleibt Ihnen als Benutzer nur, Ihre E-Mail-Adresse wie Ihren Augapfel zu hüten.
Infos
[1] Perl Quick Reference Guide: http://www.linux-magazin.de/Artikel/ausgabe/1997/03/Perl/perlref.html
[2] checkaddrbook Adressbücher als Whitelist nutzen: http://www.mirko-doelle.de/linux/checkaddrbook
[3] Andreas Kneib: Mails bearbeiten mit Procmail, LinuxUser 04/2002, http://www.linux-user.de/ausgabe/2002/04/070-procmail/proc.html




