bogofilter, Postfix und der Kampf gegen Spam

Hatte ich bislang amavis im Einsatz, so läuft auf der neuen Hardware zwar auch wieder ein Postfix Mailserver auf Debian Basis, jedoch nicht mehr mit spamassassin und CO. Das war mir einfach zu ressourcenlastig. Aber ich habe mittlerweile eine nette Alternative im Einsatz: bogofilter.

Auf bogofilter bin ich gekommen, da man amavis auf der NSLU2 zwar betreiben konnte, aber die durchschnittliche Bearbeitungszeit einer Email lag mit allen Checks bei > 3 Minuten. Das war zwar OK, allerdings muss man hierbei bedenken, dass die NSLU2 in dieser Zeit gar nichts anderes gemacht hat. Selbst einfach SSH Sessions hingen zu diesem Zeitpunkt. An einen Zugriff per NFS, SMB oder gar FTP war nicht mal ansatzweise zu denken. Ob nun eine Mail in 1 Sek verarbeitet ist oder 3 Minuten braucht, das ist bei einem Homeserver eigentlich egal – bei den 4 Mailadressen, die der im Schnitt betreut macht das bisschen Verspätung nichts aus 😉

Und hier kommt bogofilter ins Spiel. Die Trefferrate ist erstaunlich – vorausgesetz man hat ihn zuvor mit gut 100 Spam- und Hammails gefüttert. Anschließend trainiert er sich selbst und speichert die Unterscheidungskriterien in einer Wordlist ab. Diese hat bei mir mittlerweile ca. stolze 8MB.

Kommen wir jetzt zum interessanten Teil – der Installation. Hatte ich den bogofilter zuvor mittels procmail integriert (jede Email wird von procmail verteilt und vor der Verteilung an bogofilter zum bewerten übergeben), so ist er jetzt direkt als Transportweg in Postfix integriert. Fangen wir nun mit der Installation an:

apt-get update && apt-get install -y bogofilter

anschließend legen wir noch den user an, unter dem der bogofilter laufen wird:

adduser –home /var/spool/bogofilter –shell /bin/bash bogofilter

der braucht eine Gruppe (für den Fall, dass adduser das nicht erledigt hat):

addgroup bogofilter

und diese braucht einen User:

addgroup bogofilter bogofilter

Die Einträge in /etc/passwd und /etc/group sehen dann wie folg aus:

server:~# grep -i bogofilter /etc/passwd
bogofilter:x:1006:1009:Bogofilter,,,:/var/spool/bogofilter:/bin/bash
server:~# grep -i bogofilter /etc/group
bogofilter:x:1009:

Konfiguriert wird bogofilter über die recht gut kommentierte Datei /etc/bogofilter.cf. Hier mal meine Konfiguration als Beispiel:

bogofilter_dir=/var/spool/bogofilter
spam_header_name=X-Bogosity
spam_subject_tag=“*** SPAM ***“
stats_in_header=Yes # default
header_format = %h: %c, tests=bogofilter, spamicity=%p, version=%v
log_update_format = register-%r, %w words, %m messages
log_header_format = %h: %c, spamicity=%f, ipaddr=%A, queueID=%Q, msgID=%I, version=%v
unicode=yes # default
ham_cutoff = 0.45 # default
spam_cutoff= 0.99 # default

Postfix wird bogofilter über die master.cf (/etc/postfix/master.cf) bekannt gemacht:

Die erste Zeile in der master.cf wird wie folgt geändert:

smtp inet n – – – – smtpd
-o content_filter=bogofilter:

Am Ende der Datei kann dann folgende Zeile hinzugefügt werden:

bogofilter unix – n n – – pipe
flags=R user=bogofilter argv=/usr/local/bin/postfix-filter.sh -f ${sender} — ${recipient}

Nach der Konfigurationsänderung starten wir postfix neu (/etc/init.d/postfix restart) bzw. lassen das Programm seine Konfiguration neu einlesen (/etc/init.d/postfix force-reload).

Postfix startet das postfix-filter.sh Script unter dem User bogofilter und übergibt den Absender und den Empfänger.

Das postfix-filter.sh Script sieht wie folgt aus:

#!/bin/sh

FILTER=/usr/bin/bogofilter
FILTER_DIR=/var/spool/bogofilter
# WARNING! The -i is crucial, else you may see
# messages truncated at the first period that is alone on a line
# (which can happen with several kinds of messages, particularly
# quoted-printable)
POSTFIX=“/usr/sbin/sendmail -i“
export BOGOFILTER_DIR=/var/spool/bogofilter

# Exit codes from <sysexits.h>
EX_TEMPFAIL=75
EX_UNAVAILABLE=69

cd $FILTER_DIR || \
{ echo $FILTER_DIR does not exist; exit $EX_TEMPFAIL; }

# Clean up when done or when aborting.

trap „rm -f msg.$$ ; exit $EX_TEMPFAIL“ 0 1 2 3 15

# bogofilter -e returns: 0 for OK, nonzero for error
rm -f msg.$$ || exit $EX_TEMPFAIL
$FILTER -p -u -e > msg.$$ || exit $EX_TEMPFAIL

exec <msg.$$ || exit $EX_TEMPFAIL
rm -f msg.$$ # safe, we hold the file descriptor
exec $POSTFIX „$@“
exit $EX_TEMPFAIL

Es folgt noch eine kleine Anpassung der /etc/procmailrc und schon werden Emails, die als Spam makiert wurden systemweit in den Unterordner Spam verschoben und laden nicht mehr direkt im Posteingang:

MAILDIR=“$HOME/mails“
DEFAULT=$MAILDIR/
LOGFILE=“/var/log/procmail.log“
VERBOSE=no

### Bogofilter Regel
### SPAM Mails automatisch in Spam verschieben
:0:
* ^X-Bogosity: Spam
$MAILDIR/.Spam/

Will man Bogofilter manuell trainieren bietet es sich an 2 Adressen im System anzulegen, an die man Spam und Nichtspam Emails verschicken kann. Über procmail in Verbindung mit bogofilter können so falsch erkannte Mails neu eingelesen und eine andere Bewertung erzwungen werden.

Für Spammails legt man in dem Homeverzeichnis des Spamusers einfach folgende .procmailrc an:

#Procmail Datei
MAILDIR=“$HOME/mails“
DEFAULT=$MAILDIR/

# Bogofilter trainieren (Spam)
:0
* ^From:.*
{
:0wf
| /usr/bin/bogofilter -s -c /etc/bogofilter.cf
}

Der User für die Nichtspammails oder auch ham genannt bekommt folgende .procmailrc:

#Procmail Datei
MAILDIR=“$HOME/mails“
DEFAULT=$MAILDIR/
# Bogofilter trainieren (Spam)
:0
* ^From:.*
{
:0wf
| /usr/bin/bogofilter -n -N -c /etc/bogofilter.cf
}

Bitte daran denken, dass die Adressen in den Default Einstellungen auch von Außen erreichbar sind. Daher sollte man etwas mehr Kreativität walten lassen als spam@domain.org und ham@domain.org. Dies könnte nämlich dafür sorgen, dass jemand von extern den bogofilter kompromitiert in dem er Spammails an die ham Adresse schickt.

About the author