Anti-Spam Filterung hat immer ein Problem: False positives. Wenn man die antispam-Regeln zu scharf formuliert, wird oft auch eine eigentlich valide mail als Spam klassifiziert und womöglich unbesehen weggeworfen. Dem kann man mit einer sogenannten Whitelist entgegen wirken.
Aber auch diese Whitelist hat so ihre Tücken. Es ist ein Leichtes, zum Beispiel den Absender zu fälschen. Oder noch schlimmer, Jemand, den wir kennen, und dem wir vertrauen, fängt sich einen Virus ein, der in seinem Namen Spam verschickt. Ein absolut nicht ungewöhnliches Scenario. Was also benötigt wird, ist eine fälschungssichere Whitelist, die es einem Virus oder auch einem menschlichen Spammer unmöglich macht, sich daran vorbeizumogeln.
Zum Glück gibt es eine solche Möglichkeit: GPG. Damit kann man Mails signieren. Eine signierte Mail, deren Signatur gültig und verifiziert ist, ist mit 100% Sicherheit von Demjenigen, von dem sie zu sein scheint. Da zum Signieren der Mail (hoffentlich) ein Passwort eingegeben werden muß, ist es einem Virus nicht möglich, solch eine Mail zu fälschen. Was wir nun brauchen, ist eine Möglichkeit, die Signatur automatisch zu prüfen, und wenn die Mail diese Prüfung besteht, die Mail an der restlichen Antispam-Machinerie komplett vorbeizuschleusen.
Zur Mailfilterung wird wohl hauptsächlich Procmail eingesetzt. Daher befasst sich dieser Artikel mit der Einbindung dieser Technik in Procmail
Aufbau einer signierten Mail
Return-Path: <siegfried@rorkvell.de> X-Original-To: siegfried@localhost Delivered-To: siegfried@localhost Received: from localhost (localhost [127.0.0.1]) by mx.rorkvell.de (Postfix) with ESMTP id 6B65153C12E for <siegfried@localhost>; Mon, 25 Sep 2006 14:32:08 +0200 (CEST) Delivery-Date: Mon, 25 Sep 2006 14:30:51 +0200 Received-SPF: none (mxeu2: 212.227.126.187 is neither permitted nor denied by domain of rorkvell.de) client-ip=212.227.126.187; envelope-from=siegfried@rorkvell.de; helo=moutng.kundenserver.de; Received: from poponline.kundenserver.de [212.227.15.131] by localhost with POP3 (fetchmail-6.3.2) for <siegfried@localhost> (single-drop); Mon, 25 Sep 2006 14:32:08 +0200 (CEST) Received: from [212.227.126.187] (helo=moutng.kundenserver.de) by mx.kundenserver.de (node=mxeu2) with ESMTP (Nemesis), id 0MKpdM-1GRpbn2ZgR-0000WU for bcomment@rorkvell.de; Mon, 25 Sep 2006 14:30:51 +0200 Received: from [84.167.58.155] (helo=noname) by mrelayeu.kundenserver.de (node=mrelayeu0) with ESMTP (Nemesis), id 0MKwh2-1GRpbn16Mi-00082X; Mon, 25 Sep 2006 14:30:51 +0200 From: Siegfried Gipp <siegfried@rorkvell.de> To: bcomment@rorkvell.de Subject: gpg test Date: Mon, 25 Sep 2006 14:30:41 +0200 User-Agent: KMail/1.9.1 MIME-Version: 1.0 Content-Type: multipart/signed; boundary="nextPart17568337.dOXm5l1bdW"; protocol="application/pgp-signature"; micalg=pgp-sha1 Content-Transfer-Encoding: 7bit Message-Id: <200609251430.51490.siegfried@rorkvell.de> X-UIDL: D*Q!!Z<>!!R"X"!7XD!! X-UID: Status: R X-Status: NC X-KMail-EncryptionState: X-KMail-SignatureState: X-KMail-MDN-Sent: --nextPart17568337.dOXm5l1bdW Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Content-Disposition: inline test test =2D-=20 public gpg key at http://www.rorkvell.de/siegfried.asc --nextPart17568337.dOXm5l1bdW Content-Type: application/pgp-signature -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.2.2 (GNU/Linux) iD8DBQBFF8v7XiMHTxkL1hkRArVTAJ9RS2jB+M9SI2Zfaqi1ShRGfL377gCgyoDf +BVMjM8rOBCfYBtZurKOob4= =UV3c -----END PGP SIGNATURE----- --nextPart17568337.dOXm5l1bdW--
Dies ist eine Testmail, die ich mir selber geschickt habe. Die relevanten Bestandteile sind hervorgehoben. Ein paar Zeilen aus dem Header wurden gelöscht.
Die folgenden Ideen setzen eine funktionsfähige Installation von gpg voraus. Ebenso wird vorausgesetzt, daß die gültigen Schlüssel auf dem Server, auf dem Procmail läuft, in den Schlüsselring eingetragen und signiert sind.
Als Erstes muß eine signierte e-mail als solche erkannt werden und einem geeigneten Prüfprogramm zugeführt werden. Leider kann man die Mail so nicht direkt gpg zuführen. Zur Verifikation müssen sich der zu verifizierende Textblock und die Signatur in verschiedenen Dateien befinden.
Procmail receipe
# Signierte mails :0 H * ^Content-Type: multipart/signed * ? $HOME/gpgchk { LOG="GPG signature verified " :0 $DEFAULT }
Hier wird zunächst auf das Vorhandensein eines entsprechenden Hinweises im Mail Header geprüft. Wenn vorhanden, wird die Mail einem Shellscript zugeführt, das diese Signatur prüft. Dieses Procmail receipe sollte an allererster Stelle stehen, um bei einer positiven Prüfung sämtliche weiteren Schritte auszulassen.
Shellscript
#!/bin/sh ID=$RANDOM cat > mail_$ID.txt BOUNDARY=`cat mail_$ID.txt | fgrep "boundary=" | cut -d'"' -f2` cat mail_$ID.txt | formail -I "" | sed -e "1,/$BOUNDARY/ d"\ | sed -e "/$BOUNDARY/ q"\ | head -n -2\ | sed "s/$/\r/" > body_$ID.txt cat mail_$ID.txt\ | sed -ne "/-----BEGIN PGP SIGNATURE-----/, /-----END PGP SIGNATURE-----/ p" | sed "s/$/\r/" > sig_$ID.asc gpg --verify sig_$ID.asc body_$ID.txt RC=$? rm mail_$ID.txt rm body_$ID.txt rm sig_$ID.asc exit $RC
Dieses Shellscript trennt nun die Mail auf. Dabei entstehen im Heimatverzeichnis des Users temporär drei Dateien: Die gesamte Mail, der Textblock und die Signatur. Textblock und Signatur können anschließend mit gpg geprüft werden. Nach der Prüfung werden die temporären Dateien wieder gelöscht, und das Ergebnis wird an Procmail zurückgegeben. Ein erfolgreicher Test liefert als Ergebnis 0 zurück. In diesem Fall wird die im Procmail receipe angegebene Aktion ausgeführt, d.h., die Mail wird zugestellt.
Weitere Möglichkeiten
Auch als Anti-Phishing Maßname kann dies verwendet werden. Angenommen, die Hausbank bequemt sich, ihre Mails an mich per gpg zu signieren, und ich den öffentlichen Schlüssel dieser Bank lokal installiert habe, dann kommen solcherart signierte Mails auf jeden Fall durch den Spamfilter, völlig unabhängig vom Inhalt. Und um mich mit Phishing mails gar nicht erst abgeben zu müssen, könnte ich dann ein simples Procmail receipe hinterherschieben:
:0 H * ^From: meine.bank.com /dev/null
Dann landen sämtliche Mails, die entweder gar nicht signiert sind, oder einen ungültigen Schlüssel haben, sofort unbesehen im Daten-Nirvana. Schade, daß Banken und Behörden noch nicht so weit sind.
Haussteuerung
Da solcherart signierte und geprüfte Mails sicher sind, könnte man diese auch zur Haussteuerung via Mail heranziehen. Die Mail könnte Befehle oder Scripte enthalten, die auf dem Server ausgeführt werden. Geeignete Hardware vorausgesetzt könnte man so die Heizung einschalten oder den vorbereiteten Backofen, oder man könnte Daten aus dem Haus abfragen, Alles fälschungssicher.