SPAM mit SPF und DKIM

Kurz nach Aufsetzen von DKIM- und SPF-Filter auf meinem Mailserver nun ein enttäuschendes Novum: mich erreicht die erste SPAM-Mail mit SPF-legitimiertem Absender und valider Signatur:

Return-Path: <bounce@live-kameras.in>
X-Original-To: mail@alexanderkoch.net
Received-SPF: Pass (sender SPF authorized) identity=mailfrom; client-ip=46.167.40.90; helo=mail89.sysmessage.net; envelope-from=bounce@live-kameras.in; receiver=mail@alexanderkoch.net 
Authentication-Results: vserver3082.vserver-on.de; dkim=pass
	(1024-bit key; insecure key) header.i=@live-kameras.in;
	dkim-adsp=pass
Received: from mail89.sysmessage.net (mail89.sysmessage.net [46.167.40.90])
	by vserver3082.vserver-on.de (Postfix) with ESMTP id 8215A1A21DC
	for <mail@alexanderkoch.net>; Wed, 20 Jun 2012 22:06:01 +0200 (CEST)
Received: from localhost (mail89.sysmessage.net [46.167.40.90])
	by mail89.sysmessage.net (Postfix) with ESMTP id 7B80CED333A6
	for <mail@alexanderkoch.net>; Wed, 20 Jun 2012 21:46:36 +0200 (CEST)
MIME-Version: 1.0
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
From: Carola Gerber <carola@live-kameras.in>
To: mail@alexanderkoch.net
Subject: Kontaktanfrage
Message-ID: <1340221596.312.61884107@live-kameras.in>
Date: Wed, 20 Jun 2012 21:46:36 +0200
DKIM-Signature: v=1; a=rsa-sha1; s=c; d=live-kameras.in; l=180;
	t=1340221596; c=relaxed/relaxed;
	h=mime-version:content-type:content-transfer-encoding:from:to:subject:message-id:date;
	bh=PHke5WSAMx7YYOAPDF0i9PGyalA=;
	b=Scw49u8DJmqQ3FfNmqoukpaAvtg7+nif45MlE1Kqs8LSoMM8K96W5zJYg5TbLOpYBFRtYor8n6i/
	iJvPpU7sY1hwtBIpyeteus44NjV5HMZivINxQjs57hfhouN58zs5n5uN424Mid6qmbhK3cnxvXXL
	YFzc6ciq7OGm5iqipHI=
DomainKey-Signature: a=rsa-sha1; c=nofws; d=live-kameras.in; s=c;
	h=mime-version:content-type:content-transfer-encoding:from:to:subject:message-id:date;
	b=CNcWdpqE/rnJRUra4YbpLf3lh8JsLQ2OcB4h/lc4JvHOrQiDcut8lYwxOpAqLvPcAlmmKPIMLLrv
	3kqHqbcGkO31n77gIhum1j9UQiJdwrKp5X7m5gmm0P8buFIs3Oju1ZzFYEy8rsC+Fv5pJ6eV9+Ui
	jnBNeS5bN44sO7BT9Mg=
 
Hallo,
 
m=F6chtest Du deutschen M=E4dchen live vor der Kamera zuschauen?
Das kannst Du hier: http://www.live-kameras.in/
 
Viel Spa=DF!
 
Liebe Gr=FC=DFe,
Carola / Cam-Team

Tja, auch Spammer rüsten auf ;)

Munin Plugin für postfix-policyd-spf-python

Nachdem ich nach DKIM auch SPF auf meinem Mailserver aufgesetzt hatte (Paket postfix-policyd-spf-python) wollte ich natürlich auch sehen, welchen Effekt dieser zusätzliche Filter auf den Mailverkehr hat.

Wieder ein Grund zur Bash-Scripterei! :)  Folgendes kleine Plugin habe ich heute Morgen runtergehackt:

#!/bin/bash
#
#   Munin plugin to count postfix-policyd-spf-python results
#           2012 Alexander Koch <lynix47@gmail.com> 
# 
# Parameters understood:
#	config		(required)
#	autoconf 	(optional - used by munin-config)
# 
# Config variables:
#       logfile      - Where to find the postfix log (mail.log)
#
# Add the following line to a file in /etc/munin/plugin-conf.d:
# 	env.logfile /var/log/your/mail.log
#
# Magic markers (optional - used by munin-config and installation scripts):
#
#%# family=auto
#%# capabilities=autoconf
 
 
#
# Configuration
#
 
STAT_FILE=${STAT_FILE:-/var/lib/munin/plugin-state/plugin-plcyd-spf-python.state}
LOGFILE=${logfile:-/var/log/mail.log}
 
if [ "$1" = "autoconf" ]; then
	echo yes
	exit 0
fi
 
if [ "$1" = "config" ]; then
	echo 'graph_title SPF Check Results'
	echo 'graph_category postfix'
	echo 'graph_args --base 1000 -l 0'
	echo 'graph_vlabel Count/s'
 
	echo 'count_pass.label Pass'
	echo 'count_pass.type DERIVE'
	echo 'count_pass.min 0'
	echo 'count_pass.colour 00cc00'
	echo 'count_fail.label Fail'
	echo 'count_fail.type DERIVE'
	echo 'count_fail.min 0'
	echo 'count_fail.colour cc0000'
	echo 'count_none.label None'
	echo 'count_none.type DERIVE'
	echo 'count_none.min 0'
	echo 'count_none.colour 0066b3'
	echo 'count_temperror.label Temperror'
	echo 'count_temperror.type DERIVE'
	echo 'count_temperror.min 0'
	echo 'count_temperror.colour ff8000'
	echo 'count_neutral.label Neutral'
	echo 'count_neutral.type DERIVE'
	echo 'count_neutral.min 0'
	echo 'count_neutral.colour ffcc00'
 
	exit 0
fi
 
 
#
# Log parsing
#
 
function get_log_count() {
	egrep "policyd-spf\[[0-9]+\]: $1;" "$LOGFILE" | grep "$(date '+%b %e')" | wc -l
}
 
PASS=$(get_log_count "Pass")
FAIL=$(get_log_count "Fail")
NONE=$(get_log_count "None")
TEMPERR=$(get_log_count "Temperror")
NEUTRAL=$(get_log_count "Neutral")
 
echo "count_pass.value $PASS"
echo "count_fail.value $FAIL"
echo "count_none.value $NONE"
echo "count_temperror.value $TEMPERR"
echo "count_neutral.value $NEUTRAL"
 
 
exit 0

Wie immer gibts den Code auch in meinem GitHub-Repo.

Ein Screenshot des produzierten Graphen folgt, sobald ich genug Daten für eine vollständige Periode (24h) gesammelt habe. Edit: hier der Screeny, anscheinend habe ich zu wenig Traffic auf dem Mailserver ;)

DKIM mit Postfix für mehrere Domains

Gerade noch schnell DKIM für Nerd-grade Kommunikation auf meinen Domains aufgesetzt :)

Dabei war dieses Tutorial als Basis hilfreich, ich habe nur die Pfade der Keyfiles anders strukturiert.

Außerdem würde ich noch folgenden DNS-Record setzten:

_adsp._domainkey.DOMAIN     IN    TXT    "dkim=all"

Damit funktioniert dann auch ADSP.

RFC-ignorant

RFC2142 beschreibt u.A. die reservierte Adresse postmaster@ für jede Domain mit smtp-Server. Bisher habe ich mein Setup so konform wie möglich gehalten, um nicht auf einer Blacklist von rfc-ignorant.org zu landen.

Blöderweise sind 100% der ~7 SPAM-Mails, die ich täglich noch bekomme durch eben diese Ausnahmeregelung (kein Filtering) für die reservierten Adressen, insb. postmaster@, verschuldet.

Da simple Regex-Regeln mittlerweile nicht mehr darauf matchen, und ich absolut keine Lust habe, mit SpamAssassin & Co. anzufangen (ich teile diesbezüglich die Ansicht des Autors von Das Postfix-Buch, Peer Heinlein), schließe ich nun also die Lücke und pfeife auf RFC2142.

Mal schauen, wie schnell man gelistet wird ;)

Back to Thunderbird

Im Zuge der Umstellung meiner Mailkonten auf IMAP-Zugriff musste ich leider wieder zu Thunderbird wechseln. “leider”, weil ich den Lightweight-Ansatz und die Konfigurierbarkeit von Claws sehr genossen habe, und Thunderbird als bloatiges Java-Ungetüm vor noch nicht all zu langer Zeit satt hatte.
Zum Wechsel gezwungen sehe ich mich durch das IMAP-Ordnerverhalten und die beschränkten Darstellungsmöglichkeiten in Claws: es legt bei jedem IMAP-Account zwanghaft die Ordner “INBOX” (ja, vollständig uppercase), “Sent”, “Drafts”, etc. an, was mir meine halbe Ordnerhierarchie dupliziert. Außerdem lassen sich Accounts in der Seitenleiste nicht gruppieren, sodass bei neun Mailkonten das tägliche Abgrasen zur Scrollorgie entartet.

Bye Claws, es war schön mit dir… ;)

Qmail-SMTP über xinetd mit SSL

Kürzlich verweigerte der Qmail-SMTPd auf dem von mir betreuten Mailserver den Dienst, was ich als Anlass nahm, gleich von inetd auf xinetd umzusteigen. Das ermöglichte dann den Einsatz von Spamdyke als ultimatives Bollwerk gegen unerwünsche Mails.

Extrem hilfreich dabei waren dieses HowTo und die Stunnel-Homepage. TLS lief out-of-the-box; die SSL-Realisierung war etwas tricky, daher hier meine funktionierende config für xinetd mit stunnel für SSL und eingebundenem Spamdyke:

service smtps
{
	socket_type	= stream
	protocol	= tcp
	wait		= no
	disable		= no
	user		= root
	instances	= 100
	env		= SMTPAUTH=1 END=1
	server          = /usr/bin/stunnel
	server_args     = -D 3 -o /var/log/stunnel.log -T -p /var/qmail/control/servercert.pem -l /var/qmail/bin/tcp-env -- smtps -Rt0 /var/qmail/bin/relaylock /usr/local/bin/spamdyke -f /etc/spamdyke.conf /var/qmail/bin/qmail-smtpd /var/qmail/bin/smtp_auth /var/qmail/bin/true /var/qmail/bin/cmd5checkpw /var/qmail/bin/true
}