Die Idee, EMail-Adressen gezielt zu streuen, die in Wirklichkeit nicht genutzt werden und auch nicht öffentlich publiziert werden, um so Spammer zu erkennen, nahm ich zum Anlass ein erstes Mini-Setup mit Postfix und dem Tool smtp-sink zu realisieren.
Normalerweise dient smtp-sink eigentlich einem anderen Zweck (Performance-Messung), aber es bot sich hervorragend an, damit zu experimentieren.
Zuerst legte ich das Verzeichnis /var/log/antispam an und setzte die Rechte auf postfix:postfix.
Anschließend wurde das Tool mit folgendem Kommando gestartet:
smtp-sink -4 -L -d %Y%m%d/%H%M. -R /var/log/antispam -u postfix localhost:11025 10 &
(Ich muss mir noch ein Start/Stop-Skript schreiben). Sicherer wäre hier ein nohup, aber der Prozess überlebt nach Tests auch den ssh-Disconnect.
In Postfix selbst wurde in der Datei transport in etwa folgende Eintragung getätigt:
spamtrap@example.org lmtp:[localhost]:11025
Wobei die Adresse grundsätzlich existieren muss. Meine Domain ist eigentlich rein virtuell und Postfix als final destination dafür zuständig, von daher ist es nicht die feine englische Art, die EMail kurz vor der Übergabe an den Delivery-Agent wegzurouten. Eine andere Möglichkeit habe ich leider nicht finden können.
Im Ergebnis laufen nun EMails an diese Adresse direkt in ein Verzeichnis unterhalb von /var/log/antispam. Dort kann man dann bequem die Ergebnisse auswerten (lassen) und die eigenen Anti-Spam-Maßnahmen feintunen.
Ich hatte eigentlich gehofft, dass ich die XForwarding-Möglichkeiten nutzen könnte; durch den Amavis-Prequeue-Filter bei mir ist aber diese Option nicht mehr nutzbar, da nach dem Rückinliefern von Amavis nur noch die Informationen des eigenen SMTP-Servers zu sehen sind.
Beispiel:
X-Client-Addr: 127.0.0.1
X-Client-Proto: LMTP
X-Helo-Args: mx0.roessner-net.de
X-Mail-Args: <chrroessner@googlemail.com> BODY=7BIT
X-Rcpt-Args: <spamtrap@example.org>
Received: from mx0.roessner-net.de ([127.0.0.1])
by smtp-sink (smtp-sink) with LMTP id 31d69337;
Tue, 9 Sep 2008 18:30:31 +0000 (UTC)
Received: from localhost (localhost [127.0.0.1])
by mx0.roessner-net.de (Postfix) with ESMTP id E16E0521D7
for <roessnerchristian@roessner-net.com>; Tue, 9 Sep 2008 20:30:31 +0200 (CEST)
Received: from mx0.roessner-net.de ([127.0.0.1])
by localhost (amavis.internal.roessner-net.de [127.0.0.1])
(amavisd-new, port 10024) with ESMTP id z3PMsUP+6bGM
for
X-policyd-weight: using cached result; rate: -8.5
Received: from an-out-0708.google.com (an-out-0708.google.com
[209.85.132.248]) by mx0.roessner-net.de (Postfix) with ESMTP
for <roessnerchristian@roessner-net.com>; Tue, 9 Sep 2008 20:30:30 +0200 (CEST)
Received: by an-out-0708.google.com with SMTP id c38so373332ana.84
for <roessnerchristian@roessner-net.com>; Tue, 09 Sep 2008 11:30:24 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
...
Falls hierzu jemand einen Kommentar abgeben möchte, freue ich mich natürlich sehr.
[Update]
Einen Tipp von Peer Heinlein habe ich soeben noch umgesetzt: Ich habe für diese Adresse im LDAP-Server die Amavis-Prüfungen abgeschaltet. Auf diese Weise wird nicht noch unnötige CPU-Leistung verbraucht.
Weitere Änderungen folgen noch (XFORWARD muss da noch irgendwie rein)
[Update-2]
Es scheint leider nicht so einfach zu sein, XFORWARD hier zu verwenden, daher habe ich dem smtp-sink-Kommando noch das Flag -F hinzugefügt und in der master.cf von Postfix auch auf das Senden der XFORWARD-Daten verzichtet.
[Update-3]
Hier schon mal ein kleines Bash-Skript:
cat 1830.31d69337 | grep Received |
grep -v localhost | grep -v mx0 |
grep from | head -n1 |
cut -d "[" -f2 | cut -d "]" -f1
209.85.132.248
Das wurde aus einer Testmail von Google extrahiert. Natürlich war das keine Spam-Mail.
[Update-4]
Hier ein Start-Stop-Skript für Ubuntu (Hardy):
#! /bin/sh
### BEGIN INIT INFO
# Provides: spamtrap
# Required-Start: $local_fs $remote_fs
# Required-Stop: $local_fs $remote_fs
# Default-Start: 2 3 4 5
# Default-Stop: S 0 1 6
# Short-Description: Spamtrap initscript
# Description: Building a spamtrap with smtp-sink for postfix
### END INIT INFO
# Author: Christian Roessner
#
# PATH should only include /usr/* if it runs after the mountnfs.sh script
PATH=/usr/sbin:/usr/bin:/sbin:/bin
DESC="Spamtrap for postfix"
NAME=smtp-sink
DAEMON=/usr/sbin/$NAME
DAEMON_ARGS="-4 -L -F -d %Y%m%d/%H%M. -R /var/log/smtp-sink -u postfix localhost:11025 10"
PIDFILE=/var/run/smtp-sink/$NAME.pid
SCRIPTNAME=/etc/init.d/$NAME
# Exit if the package is not installed
[ -x "$DAEMON" ] || exit 0
# Read configuration variable file if it is present
[ -r /etc/default/$NAME ] && . /etc/default/$NAME
# Load the VERBOSE setting and other rcS variables
[ -f /etc/default/rcS ] && . /etc/default/rcS
# Define LSB log_* functions.
# Depend on lsb-base (>= 3.0-6) to ensure that this file is present.
. /lib/lsb/init-functions
#
# Function that starts the daemon/service
#
do_start()
{
mkdir -p /var/log/smtp-sink /var/run/smtp-sink
chown postfix:postfix /var/log/smtp-sink /var/run/smtp-sink
start-stop-daemon --start --quiet --exec $DAEMON --background --
$DAEMON_ARGS
|| return 2
pidof $DAEMON > $PIDFILE
}
#
# Function that stops the daemon/service
#
do_stop()
{
start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile $PIDFILE
--name $NAME
RETVAL="$?"
[ "$RETVAL" = 2 ] && return 2
# Many daemons don't delete their pidfiles when they exit.
rm -f $PIDFILE
return "$RETVAL"
}
case "$1" in
start)
log_daemon_msg "Starting $DESC" "$NAME"
do_start
case "$?" in
0|1) log_end_msg 0 ;;
2) log_end_msg 1 ;;
esac
;;
stop)
log_daemon_msg "Stopping $DESC" "$NAME"
do_stop
case "$?" in
0|1) log_end_msg 0 ;;
2) log_end_msg 1 ;;
esac
;;
restart|force-reload)
log_daemon_msg "Restarting $DESC" "$NAME"
do_stop
case "$?" in
0|1)
do_start
case "$?" in
0) log_end_msg 0 ;;
1) log_end_msg 1 ;; # Old process is still running
*) log_end_msg 1 ;; # Failed to start
esac
;;
*)
# Failed to stop
log_end_msg 1
;;
esac
;;
*)
echo "Usage: $SCRIPTNAME {start|stop|restart|force-reload}" >&2
exit 3
;;
esac