21x9.org

E-Mail-Server 4: postgrey, spamassassin, clamav, postfix-filter

Categories: [blog]
Tags: [imported]

Nachdem sowohl [[/e-mail-server-1-ldap-debian-wheezy/|LDAP]], [[/e-mail-server-2-dovecot-debian-wheezy/|Dovecot]] und [[/e-mail-server-3-postfix-debian-wheezy/|Postfix]] eingerichtet sind kommen wir nun zu den SPAM-Filtern und Virenchecks.

Spamfilter/Virenscanner

Die Installation wird gestartet mit:

apt-get install amavisd-new clamav-daemon spamassassin razor pyzor 

Gesteuert werden Spamfilter und Virenscanner über amavis, damit dieser mit clamav interagieren darf ist noch ein Benutzer anzulegen und der Gruppe amavis zuzuordnen:

adduser clamav amavis

Nun kann amavis mit clamav (und dem Spamfilter) bekannt gemacht werden. Dies geschieht über die Datei /etc/amavis/conf.d/15-content_filter_mode:

# /etc/amavis/conf.d/15-content_filter_mode

use strict;

@bypass_virus_checks_maps = (
   \%bypass_virus_checks, \@bypass_virus_checks_acl, \$bypass_virus_checks_re);

@bypass_spam_checks_maps = (
   \%bypass_spam_checks, \@bypass_spam_checks_acl, \$bypass_spam_checks_re);

1;

Die neue Konfiguration wird über /etc/init.d/amavis restart aktiviert. Der korrekte Start kann mit lsof -i TCP:10024 überprüft werden. Das Ergebnis sollte wie folgt aussehen:

COMMAND    PID   USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
amavisd-n 7745 amavis    5u  IPv4  29777      0t0  TCP localhost:10024 (LISTEN)
amavisd-n 7747 amavis    5u  IPv4  29777      0t0  TCP localhost:10024 (LISTEN)
amavisd-n 7748 amavis    5u  IPv4  29777      0t0  TCP localhost:10024 (LISTEN)

Der Spamfilter wird durch setzen von ENABLED=1 in /etc/default/spamassassin und den Aufruf von /etc/init.d/spamassassin restart aktiviert.

Damit amavis und somit Virenscanner und Spamfilter überhaupt aktiv werden, müssen diese noch mit Postfix verheiratet werden. Dies geschieht über /etc/postfix/main.cf bzw. /etc/postfix/master.cf.

/etc/postfix/main.cf erhält folgende Zeile:

# /etc/postfix/main.cf

content_filter=smtp-amavis:[127.0.0.1]:10024

Die Konfigurationseinstellungen in /etc/postfix/master.cf sind etwas komplexer, am Ende der Datei wird folgendes angefügt:

# /etc/postfix/master.cf

smtp-amavis     unix    -       -       -       -       2       smtp
        -o smtp_data_done_timeout=1200
        -o smtp_send_xforward_command=yes
        -o disable_dns_lookups=yes
        -o max_use=20

127.0.0.1:10025 inet    n       -       -       -       -       smtpd
        -o content_filter=
        -o local_recipient_maps=
        -o relay_recipient_maps=
        -o smtpd_restriction_classes=
        -o smtpd_delay_reject=no
        -o smtpd_client_restrictions=permit_mynetworks,reject
        -o smtpd_helo_restrictions=
        -o smtpd_sender_restrictions=
        -o smtpd_recipient_restrictions=permit_mynetworks,reject
        -o smtpd_data_restrictions=reject_unauth_pipelining
        -o smtpd_end_of_data_restrictions=
        -o mynetworks=127.0.0.0/8
        -o smtpd_error_sleep_time=0
        -o smtpd_soft_error_limit=1001
        -o smtpd_hard_error_limit=1000
        -o smtpd_client_connection_count_limit=0
        -o smtpd_client_connection_rate_limit=0
        -o receive_override_options=no_header_body_checks,no_unknown_recipient_checks

Unterhalb der Zeile pickup fifo n - - 60 1 pickup werden folgende Zeilen hinzugefügt:

# /etc/postfix/master.cf

         -o content_filter=
         -o receive_override_options=no_header_body_checks

Nach diesen Änderungen wird postfix neu gestartet: /etc/init.d/postfix restart

Wenn die Einstellungen korrekt gesetzt sind sollte eine E-Mail folgendes Header aufweisen:

Received: from localhost (localhost [127.0.0.1])
    by ldap.21x9.org (Postfix) with ESMTP id 26E7F76BC1
    for <gpkvt@ldap.21x9.org>; Thu, 25 Aug 2011 16:52:31 +0200 (CEST)
X-Virus-Scanned: Debian amavisd-new at ldap.21x9.org
Received: from ldap.21x9.org ([127.0.0.1])
    by localhost (ldap.21x9.org [127.0.0.1]) (amavisd-new, port 10024)
    with ESMTP id xYZrfPsjOUas for <gpkvt@ldap.21x9.org>;
    Thu, 25 Aug 2011 16:52:28 +0200 (CEST)
Received: from [192.168.1.23] (unknown [192.168.1.23])
    by ldap.21x9.org (Postfix) with ESMTPSA id 8D5F276B13
    for <gpkvt@ldap.21x9.org>; Thu, 25 Aug 2011 16:52:28 +0200 (CEST)

Der Spamfilter ist derzeit noch so eingestellt, dass der Spamfilter Mails nicht kennzeichnet werden. Um dies zu ändern müssen in /etc/amavis/conf.d/20-debian_defaults folgende Variablen (um)gesetzt werden:

# /etc/amavis/conf.d/20-debian_defaults

$sa_tag_level_deflt  = undef;
$sa_tag2_level_deflt = 5;
$sa_kill_level_deflt = 10;

Die entsprechenden Zeilen sind bereits vorhanden und müssen nur abgeändert werden.

Zum Übernehmen der Änderungen muss Amavis neu gestartet werden:

/etc/init.d/amavis restart

Eine erneute Testmail sollte nun folgendes im Header aufweisen:

X-Virus-Scanned: Debian amavisd-new at ldap.21x9.org
X-Spam-Flag: NO
X-Spam-Score: -0.2
X-Spam-Level: 
X-Spam-Status: No, score=-0.2 required=5 tests=[ALL_TRUSTED=-1,
    DKIM_ADSP_NXDOMAIN=0.8] autolearn=no

WICHTIG: In der Anfangsphase sollte der Wert $sa_kill_level_deflt recht hoch gewählt werden. In den gewünschten Mails sollte dann der Maximalwert ermittelt und der Wert entsprechend nach unten korrigiert werden. Alternativ kann man Spamassassin auch ein HAM und SPAM-Postfach übergeben aus welchem es entsprechend lernt. Dank der Filterlisten razor und pyzor sollte das aber überflüssig sein.

postgrey/greylisting

Postgrey ist derzeit nicht installiert, sollte das Spamaufkommen zu hoch steigen kann dies aber leicht nachgeholt werden. Postgrey schützt vor Spam, indem Mails von unbekannten Absendern zunächst mit einem temporären Fehler abgelehnt werden. Der einliefernde Mailserver ist dann für einen weiteren Zustellversuch verantwortlich. Je nach Einstellung des Mailservers kann es wenige Sekunden, aber auch mehrere Stunden dauern, bis ein erneuter Zustellversuch unternommen wird. Erfolgt ein zweiter Versuch innerhalb einer definierten Zeitspanne lässt postgrey die Mail passieren. Typische SPAM-Botnetze unternehmen keinen erneuten Zustellversuch.

Die Installation wird gestartet durch:

apt-get install postgrey

Ob postgrey korrekt gestartet wurde kann mit lsof -i TCP:10023 überprüft werden, es sollte folgendes ausgegeben werden:

COMMAND   PID     USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
postgrey 4382 postgrey    6u  IPv4  18839      0t0  TCP localhost:10023 (LISTEN)

Nun muss postgrey noch in die postfix-Config übernommen werden, hierzu wird die Zeile smtpd_recipient_restrictions in /etc/postfix/main.cf erweitert durch:

# /etc/postfix/main.cf

check_policy_service inet:127.0.0.1:10023

Normalerweise überprüft Postfix erst nachdem die smtpd_recipient_restrictions abgearbeitet wurden ob ein Empfänger einer Mail überhaupt existiert. Damit ein externer Mailserver eine solche Mail nicht durch das Greylisting erneut zustellt sollte vor der check_policy_service Zeile noch reject_unlisted_recipient eingefügt werden, damit Mails an unbekannte Empfänger sofort verworfen werden.

Anschließend wird postfix neu gestartet: /etc/init.d/postfix restart

In /etc/default/postgrey kann festgelegt werden, wie lange ein Mailserver mind. mit einem erneuten Zustellversuch warten darf, und wie lange der erste Versuch maximal zurückliegen darf. Außerdem können Absender, deren Mails regelmäßig durch das Greylisting hindurchgelassen wurden automatisch in eine Whitelist aufgenommen werden:

# /etc/default/postgrey

# postgrey startup options, created for Debian
# (c)2004 Adrian von Bidder <avbidder@fortytwo.ch>
# Distribute and/or modify at will.

# you may want to set
#   --delay=N   how long to greylist, seconds (default: 300)
#   --max-age=N delete old entries after N days (default: 30)
# see also the postgrey(8) manpage

POSTGREY_OPTS="--inet=127.0.0.1:10023 --delay=60 --max-age=120 --auto-whitelist-clients=1"

# the --greylist-text commandline argument can not be easily passed through
# POSTGREY_OPTS when it contains spaces.  So, insert your text here:
POSTGREY_TEXT="Temporarily rejected (greylisting), please try again later."

WICHTIG: Bis Debian 5.0 war der postgrey-Standardport 60000, ab Debian 6.0 wechselte er auf 10023. In älteren Anleitungen zu Postgrey findet man daher noch die veraltete Portangabe 60000.

Sollte ein Mailserver (von dem Mails gewünscht werden) sehr hohe Wiederholintervalle aufweisen, so kann er in die Whitelist (/etc/postgrey/whitelist_clients) aufgenommen werden. Derzeit gibt es (neben den Standardeinträgen) folgende Whitelisteinträge:

# /etc/postgrey/whitelist_clients

# postgrey version: 1.34, build date: 2011-05-04

# Debian-specific additions
# I *know* they run real mail queues, so greylisting only creates
# bigger load for them.
debconf.org
debian.org
spi-inc.org
/.*\.startcom\.org$/

# greylisting.org: Southwest Airlines (unique sender, no retry)
southwest.com
# greylisting.org: isp.belgacom.be (wierd retry pattern)
isp.belgacom.be
# greylisting.org: Ameritrade (no retry)
ameritradeinfo.com
# greylisting.org: Amazon.com (unique sender with letters)
amazon.com
# 2004-05-20: Linux kernel mailing-list (unique sender with letters)
vger.kernel.org
# 2004-06-02: karger.ch, no retry
karger.ch
# 2004-06-02: lilys.ch, (slow: 4 hours)
server-x001.hostpoint.ch
# 2004-06-09: roche.com (no retry)
gw.bas.roche.com
# 2004-06-09: newsletter (no retry)
mail.hhlaw.com
# 2004-06-09: no retry (reported by Ralph Hildebrandt)
prd051.appliedbiosystems.com
# 2004-06-17: swissre.com (no retry)
swissre.com
# 2004-06-17: dowjones.com newsletter (unique sender with letters)
returns.dowjones.com
# 2004-06-18: switch.ch (works but personnel is confused by the error)
domin.switch.ch
# 2004-06-23: accor-hotels.com (slow: 6 hours)
accor-hotels.com
# 2004-06-29: rr.com (no retry, reported by Duncan Hill)
/^ms-smtp.*\.rr\.com$/
# 2004-06-29: cox.net (no retry, reported by Duncan Hill)
/^lake.*mta.*\.cox\.net$/
# 2004-06-29: motorola.com (no retry)
mot.com
# 2004-07-01: nic.fr (address verification, reported by Arnaud Launay)
nic.fr
# 2004-07-01: verizon.net (address verification, reported by Bill Moran and Eric, adapted by Adam C. Mathews)
/^s[cv]\d+pub\.verizon\.net$/
# 2004-07-02: cs.columbia.edu (no retry)
cs.columbia.edu
# 2004-07-02: papersinvited.com (no retry)
66.216.126.174
# 2004-07-02: telekom.de (slow: 6 hours)
/^mail\d+\.telekom\.de$/
# 2004-07-04: tiscali.dk (slow: 12 hours, reported by Klaus Alexander Seistrup)
/^smtp\d+\.tiscali\.dk$/
# 2004-07-04: freshmeat.net (address verification)
freshmeat.net
# 2004-07-11: zd-swx.com (unique sender with letters, reported by Bill Landry)
zd-swx.com
# 2004-07-11: lockergnome.wc09.net (unique sender with letters, reported by Bill Landry)
lockergnome.wc09.net
# 2004-07-19: mxlogic.net (no retry, reported by Eric)
p01m168.mxlogic.net
p02m169.mxlogic.net
# 2004-09-08: intel.com (pool on different subnets) 
/^fmr\d+\.intel\.com$/
# 2004-09-17: cox-internet.com (no retry, reported by Rod Roark)
/^fe\d+\.cox-internet\.com$/
# 2004-10-11: logismata.ch (no retry)
logismata.ch
# 2004-11-25: brief.cw.reum.de (no retry, reported by Manuel Oetiker)
brief.cw.reum.de
# 2004-12-03: ingeno.ch (no retry)
qmail.ingeno.ch
# 2004-12-06: rein.ch (no retry)
mail1.thurweb.ch
# 2005-01-26: tu-ilmenau.de (no retry)
piggy.rz.tu-ilmenau.de
# 2005-04-06: polymed.ch (no retry)
mail.polymed.ch
# 2005-06-08: hu-berlin.de (slow: 6 hours, reported by Joachim Schoenberg)
rz.hu-berlin.de
# 2005-06-17: gmail.com (big pool, reported by Beat Mueller)
proxy.gmail.com
# 2005-06-23: cacert.org (address verification, reported by Martin Lohmeier)
cacert.org
# 2005-07-27: polytech.univ-mrs.fr (no retry, reported by Giovanni Mandorino)
polytech.univ-mrs.fr
# 2005-08-05: gnu.org (address verification, reported by Martin Lohmeier)
gnu.org
# 2005-08-17: ciphirelabs.com (needs fast responses, reported by Sven Mueller)
cs.ciphire.net
# 2005-11-11: lufthansa (no retry, reported by Peter Bieringer)
/^gateway\d+\.np4\.de$/
# 2005-11-23: arcor-online.net (slow: 12 hours, reported by Bernd Zeimetz)
/^mail-in-\d+\.arcor-online\.net$/
# 2005-12-29: netsolmail.com (no retry, reported by Gareth Greenaway)
netsolmail.com
# mail.likopris.si (no retry, reported by Vito Robar)
193.77.153.67
# jcsw.nato.int (several servers, no retry, reported by Vito Robar)
195.235.39
# tesla.vtszg.hr (no retry, reported by Vito Robar)
tesla.vtszg.hr
# mailgw*.iai.co.il (pool of several servers, reported by Vito Robar)
/^mailgw.*\.iai\.co\.il$/
# gw.stud-serv-mb.si (no retry, reported by Vito Robar)
gw.stud-serv-mb.si
# mail.commandtech.com (no retry, reported by Vito Robar)
216.238.112.99
# duropack.co.at (no retry, reported by Vito Robar)
193.81.20.195
# mail.esimit-tech.si (no retry, reported by Vito Robar)
193.77.126.208
# mail.resotel.be (ocasionally no retry, reported by Vito Robar)
80.200.249.216
# mail2.alliancefr.be (ocasionally no retry, reported by Vito Robar)
mail2.alliancefr.be
# webserver.turboinstitut.si (no retry, reported by Vito Robar)
webserver.turboinstitut.si
# mil.be (pool of different servers, reported by Vito Robar)
193.191.218.141
193.191.218.142
193.191.218.143
194.7.234.141
194.7.234.142
194.7.234.143
# mail*.usafisnews.org (no retry, reported by Vito Robar)
/^mail\d+\.usafisnews\.org$/
# odk.fdv.uni-lj.si (no retry, reported by Vito Robar)
/^odk.fdv.uni-lj.si$/
# rak-gentoo-1.nameserver.de (no retry, reported by Vito Robar)
rak-gentoo-1.nameserver.de
# dars.si (ocasionally no retry, reported by Vito Robar)
mx.dars.si
# cosis.si (no retry, reported by Vito Robar)
213.143.66.210
# mta?.siol.net (sometimes no or slow retry; they use intermail, reported by Vito Robar)
/^mta[12].siol.net$/
# pim-N-N.quickinspirationsmail.com (unique sender, reported by Vito Robar)
/^pim-\d+-\d+\.quickinspirationsmail\.com$/
# flymonarch (no retry, reported by Marko Djukic)
flymonarch.com
# wxs.nl (no retry, reported by Johannes Fehr)
/^p?smtp.*\.wxs\.nl$/
# ibm.com (big pool, reported by Casey Peel)
ibm.com
# messagelabs.com (big pool, reported by John Tobin)
/^mail\d+\.messagelabs\.com$/
# ptb.de (slow, reported by Joachim Schoenberg)
berlin.ptb.de
# registrarmail.net (unique sender names, reported by Simon Waters)
registrarmail.net
# google.com (big pool, reported by Matthias Dyer, Martin Toft)
google.com
# orange.fr (big pool, reported by Lo?c Le Loarer)
/^smtp\d+\.orange\.fr$/
# citigroup.com (slow retry, reported by Michael Monnerie)
/^smtp\d+.citigroup.com$/
# cruisingclub.ch (no retry)
mail.ccs-cruising.ch
# digg.com (no retry, Debian #406774)
diggstage01.digg.com
# liberal.ca (retries only during 270 seconds, Debian #406774)
smtp.liberal.ca
# pi.ws (pool + long retry, Debian #409851)
/^mail[12]\.pi\.ws$/
# rambler.ru (big pool, reported by Michael Monnerie)
rambler.ru
# free.fr (big pool, reported by Denis Sacchet)
/^smtp[0-9]+-g[0-9]+\.free\.fr$/
/^postfix[0-9]+-g[0-9]+\.free\.fr$/
# thehartford.com (pool + long retry, reported by Jacob Leifman)
/^netmail\d+\.thehartford\.com$/
# abb.com (only one retry, reported by Roman Plessl)
/^nse\d+\.abb\.com$/
# 2007-07-27: sourceforge.net (sender verification)
lists.sourceforge.net
# 2007-08-06: polytec.de (no retry, reported by Patrick McLean)
polytec.de
# 2007-09-06: qualiflow.com (no retry, reported by Alex Beckert)
/^mail\d+\.msg\.oleane\.net$/
# 2007-09-07: nrl.navy.mil (no retry, reported by Axel Beckert)
nrl.navy.mil
# 2007-10-18: aliplast.com (long retry, reported by Johannes Feigl)
mail.aliplast.com
# 2007-10-18: inode.at (long retry, reported by Johannes Feigl)
/^mx\d+\..*\.inode\.at$/
# 2008-02-01: bol.com (no retry, reported by Frank Breedijk)
/^.*?.server.arvato-systems.de$/
# 2008-06-05: registeredsite.com (no retry, reported by Fred Kilbourn)
/^(?:mail|fallback-mx)\d+.atl.registeredsite.com$/
# 2008-07-17: mahidol.ac.th (no retry, reported by Alex Beckert)
saturn.mahidol.ac.th
# 2008-07-18: ebay.com (big pool, reported by Peter Samuelson)
ebay.com
# 2008-07-22: yahoo.com (big pool, reported by Juan Alonso)
yahoo.com
# 2008-11-07: facebook (no retry, reported by Tim Freeman)
/^outmail\d+\.sctm\.tfbnw\.net$/
# 2009-02-10: server14.cyon.ch (long retry, reported by Alex Beckert)
server14.cyon.ch
# 2009-08-19: 126.com (big pool)
/^m\d+-\d+\.126\.com$/
# 2010-01-08: tifr.res.in (no retry, reported by Alex Beckert)
home.theory.tifr.res.in
# 2010-01-08: 1blu.de (long retry, reported by Alex Beckert)
ms4-1.1blu.de
# 2010-03-17: chello.at (big pool, reported by Jan-willem van Eys)
/^viefep\d+-int\.chello\.at$/
# 2010-05-31: nic.nu (long retry, reported by Ivan Sie)
mx.nic.nu
# 2010-06-10: Microsoft servers (long/no retry, reported by Roy McMorran)
bigfish.com
frontbridge.com
microsoft.com
# 2010-06-18: Google/Postini (big pool, reported by Warren Trakman)
postini.com
# 2011-02-04: evanzo-server.de (no retry, reported by Andre Hoepner)
/^mx.*\.evanzo-server\.de$/
# 2011-05-02: upcmail.net (big pool, reported by Michael Monnerie)
upcmail.net

Es ist auch möglich bestimmte (Empfänger-)Mailadressen vom Greylisting auszunehmen. Dies geschieht über die Datei /etc/postgrey/whitelist_recipients:

# /etc/postgrey/whitelist_recipients

postmaster@
abuse@

Weitere Anti-SPAM-Maßnahmen können Header-Checks oder die Einbindung von Spamlisten (z.B. spamhaus.org) sein((http://www.debian-administration.org/articles/168)).

Logfiles

Sowohl Dovecot als auch Postfix teilen sich ein gemeinsames Logfile /var/log/mail.*. In der Regel reicht es aus, sich /var/log/mail.info anzusehen. In /var/log/mail.err werden ausschließlich Fehlermeldungen gesammelt, die aber auch in /var/log/mail.info zu finden sind und oftmals ist der Kontext bei der Fehlersuche hilfreich.

Bei Problemen kann es hilfreich sein alle Mailserverdienste einmal neu zu starten und dabei das Logfile (tail -f /var/log/mail.info) im Auge zu behalten:

/etc/init.d/postfix restart
/etc/init.d/dovecot restart
/etc/init.d/postgrey restart
/etc/init.d/amavis restart
/etc/init.d/clamav-daemon restart
/etc/init.d/spamassassin restart

Auch empfangene E-Mails selbst können sehr aufschlussreich sein, z.B. wenn der Mailempfang stark verzögert wird, oder ein Kunde einen Bounce erhält und weiterleitet.

Received: from localhost (localhost [127.0.0.1])
    by ldap.21x9.org (Postfix) with ESMTP id 42F1476B0B
    for <gpkvt@ldap.21x9.org>; Fri, 26 Aug 2011 13:55:35 +0200 (CEST)
X-Virus-Scanned: Debian amavisd-new at ldap.21x9.org
X-Spam-Flag: NO
X-Spam-Score: -0.2
X-Spam-Level: 
X-Spam-Status: No, score=-0.2 required=5 tests=[ALL_TRUSTED=-1,
    DKIM_ADSP_NXDOMAIN=0.8] autolearn=no
Received: from ldap.21x9.org ([127.0.0.1])
    by localhost (ldap.21x9.org [127.0.0.1]) (amavisd-new, port 10024)
    with ESMTP id s1pSRz-BcPdj for <gpkvt@ldap.21x9.org>;
    Fri, 26 Aug 2011 13:55:31 +0200 (CEST)
Received: from [192.168.1.42] (unknown [192.168.1.42])
    by ldap.21x9.org (Postfix) with ESMTPSA id CD47476B0A
    for <denis.witt@ldap.21x9.org>; Fri, 26 Aug 2011 13:55:30 +0200 (CEST)

Wichtig ist den Mailheader von unten nach oben zu lesen. Bei diesem Beispiel wurde die Mail vom Rechner mit der IP 192.168.1.42 an den SMTP-Server ldap.21x9.org eingeliefert. Anschließend wurde die Mail vom SMTP-Server an Amavis weitergeleitet und es erfolgte der Spam- und Virencheck. Anschließend wurde die Nachricht in ein lokales Postfach einsortiert.

Der Received-Headerabschnitt kann durchaus sehr lang werden, wenn mehrere Mailserver an Versand/Empfang beteiligt sind. So ist es möglich den kompletten Weg einer Mail durch das Internet (und interne Netze) nachzuvollziehen. Die Angaben können auch sehr hilfreich sein um eine postgrey-Whitelist anzulegen, falls ein Mailserver sehr lange Wiederholintervalle gesetzt hat.

Tests

Um zu überprüfen, ob der Spamfilter korrekt funktioniert reicht es aus eine Mail mit folgendem Inhalt zu versenden:

XJS*C4JDBQADN1.NSBN3*2IDNEN*GTUBE-STANDARD-ANTI-UBE-TEST-EMAIL*C.34X

Daraufhin sollte der Spamfilter, je nach Konfiguration entweder eine Mail mit folgendem Inhalt zurücksenden:

A message from <gpkvt@ldap.21x9.org> to:
-> test@ldap.21x9.org

was considered unsolicited bulk e-mail (UBE).

Our internal reference code for your message is 08116-01/k2HigvqkQGJ1

The message carried your return address, so it was either a genuine mail
from you, or a sender address was faked and your e-mail address abused
by third party, in which case we apologize for undesired notification.

We do try to minimize backscatter for more prominent cases of UBE and
for infected mail, but for less obvious cases of UBE some balance
between losing genuine mail and sending undesired backscatter is sought,
and there can be some collateral damage on both sides.

First upstream SMTP client IP address: [192.168.1.42] 
According to a 'Received:' trace, the message originated at: [192.168.1.42],
  [192.168.1.42] unknown [192.168.1.42]

Return-Path: <gpkvt@ldap.21x9.org>
From: Denis Witt <gpkvt@ldap.21x9.org>
Message-ID: <4E566C7D.2020708@ldap.21x9.org>
Subject: test

Delivery of the email was stopped!

Oder aber folgender Logfileeintrag (/var/log/mail.log) entstehen:

Jun 26 11:03:53 pdc amavis[9242]: (09242-17) Blocked SPAM, [217.11.61.100] [217.11.61.100] <root@example.de> -> <gpkvt@example.de>, quarantine: A/spam-AzRT6ktii1L3.gz, Message-ID: <20120626090318.A5D222D04185@mx1.example.de>, mail_id: AzRT6ktii1L3, Hits: 1000, size: 746, 11821 ms

Neben dem Spam- und Virenscanner werden außerdem bestimmte Dateitypen geblockt. Dies kann z.B. mit einer EXE als Dateianhang getestet werden. Folgende Mail sollte die Folge sein:

No viruses were found.

Banned name: application/x-ms-dos-executable,.empty,Screensaver.exe
Content type: Banned
Internal reference code for the message is 08116-02/sccgLIuv6Pm5

First upstream SMTP client IP address: [192.168.1.23] 
According to a 'Received:' trace, the message originated at: [192.168.1.23],
  [192.168.1.23] unknown [192.168.1.23]

Return-Path: <fkochem@ldap.21x9.org>
From: fabian kochem <fkochem@ldap.21x9.org>
Message-ID: <4E566CA2.5080605@ldap.21x9.org>
Subject: Test
The message has been quarantined as: s/banned-sccgLIuv6Pm5

The message WAS NOT relayed to:
<gpkvt@ldap.21x9.org>:
   554 5.7.0 Reject, id=08116-02 - BANNED: application/x-ms-dos-executable,.empty,Screensaver.exe

Um den Virenscanner zu testen ist eine Mail mit folgendem Inhalt (als Dateianhang, gerne auch als ZIP-Datei) praktisch:

X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*

Resultat sollte folgendes sein:

A virus was found: Eicar-Test-Signature

Scanner detecting a virus: ClamAV-clamd

Content type: Virus
Internal reference code for the message is 08116-03/Y7ztyO-Q1+fE

First upstream SMTP client IP address: [192.168.1.42] 
According to a 'Received:' trace, the message originated at: [192.168.1.42],
  [192.168.1.42] unknown [192.168.1.42]

Return-Path: <gpkvt@ldap.21x9.org>
From: Denis Witt <gpkvt@ldap.21x9.org>
Message-ID: <4E566DF7.2030908@ldap.21x9.org>
Subject: test
The message has been quarantined as: Y/virus-Y7ztyO-Q1+fE

The message WAS NOT relayed to:
<fkochem@ldap.21x9.org>:
   250 2.7.0 Ok, discarded, id=08116-03 - INFECTED: Eicar-Test-Signature

Virus scanner output:
  p002: Eicar-Test-Signature FOUND

Die Mails werden hierbei nicht sofort gelöscht, sondern im Verzeichnis /var/lib/amavis/virusmails gespeichert (sowohl SPAM- als auch Virusmails). Sie können von dort einfach in das entsprechende Empfängerpostfach verschoben werden, sollten sie dennoch zugestellt werden. Zuvor müssen die Nachrichten ggf. mit gunzip entpackt werden. Anhand der Dateinamen (z.B. spam-Nq9fd5lGtsFT.gz, virus-Y7ztyO-Q1+fE oder banned-sccgLIuv6Pm5) kann man leicht erkennen, warum eine Mail in der Quarantäne gelandet ist.

Whitelist

Leider gibt es immer wieder Kundenserver mit falscher/nicht ausreichender Konfiguration. Oft fehlt z.B. der korrekte Reverse DNS-Eintrag was unseren Mailserver veranlasst die Kommunikation zu beenden. Per Whitelist ist es aber möglich die entsprechenden Server von der Prüfung auszunehmen.

Hierbei ist es wichtig alle Server-IPs zu erfassen. In der Regel lässt sich eine entsprechende Liste über die Abfrage der MX-Server erstellen:

dig MX example.com

Der Output sollte folgendes enthalten:

;; ANSWER SECTION:
example.com.            7386    IN  MX  10 mail1.example.com.
example.com.            7386    IN  MX  20 mail2.example.com.

Mittels ping lässt sich nun die IP-Adresse ermitteln:

ping -c 1 mail1.example.com
PING mail1.example.com (1.2.3.4) 56(84) bytes of data.
64 bytes from 1.2.3.4: icmp_req=1 ttl=242 time=36.5 ms
...
ping -c 1 mail2.example.com
PING mail2.example.com (2.3.4.5) 56(84) bytes of data.
64 bytes from 2.3.4.5: icmp_req=1 ttl=242 time=36.5 ms

Die beiden IPs werden nun in die Whitelist eingetragen:

# /etc/postfix/client_whitelist

1.2.3.4 OK
2.3.4.5 OK

Nun muss die Whitelist aktiviert werden:

postmap /etc/postfix/client_whitelist
postfix reload

Der Befehl postmap erstellt hierbei die eigentliche Whitelist (client_whitelist.db) und das reload aktiviert die Änderungen.

Damit die Whitelist überhaupt Verwendung findet ist einmalig die Postfix-Config selbst anzupassen. Hierzu wird der Parameter check_client_access in die smtpd_recipient_restrictions aufgenommen:

# /etc/postfix/main.cf

smtpd_recipient_restrictions = 
     check_client_access hash:/etc/postfix/client_whitelist

Hierbei ist die Reihenfolge entscheidend. Fügt man den Check erst hinter einen anderen Check ein, so wird dieser wie gewohnt durchgeführt und erst die nachfolgenden Checks werden übersprungen. Um einen rDNS-Check zu umgehen muss der Eintrag der Whitelist also zwingend vor reject_invalid_hostname liegen. Es ist möglich check_client_access mehrfach zu verwenden, so können verschiedene Whitelists genutzt werden, die nur einzelne Checks überspringen.

Header Checks

Die oben genannte Whitelist lässt sich nur auf IP-Adressen anwenden. Will man andere Daten nutzen um Mails an- oder abzulehnen kann PCRE mit header_checks genutzt werden.

Hierzu wird folgende Zeile in /etc/postfix/main.cf eingefügt:

# /etc/postfix/main.cf

header_checks = pcre:/etc/postfix/header_checks

Anschließend wird die Datei mit Regeln befüllt:

# /etc/postfix/header_checks

/^To:.*noreply\@/           REJECT  noreply means no reply, please write to info@21x9.org instead, thanks.
/^To:.*no-reply\@/          REJECT  no-reply means no reply, please write to info@21x9.org instead, thanks.
/^From: <info@example\.com>/    REJECT

Im ersten Teil wird der reguläre Ausdruck eingefügt. Anschließend kommt die Aktion welche bei einem Match ausgeführt wird. Optional kann noch eine eigene Meldung angegeben werden, welche der Mailserver als Fehlermeldung an den Client zurückliefert.