Startseite : Infos : Infotexte : E-Mail : Greylisting mit Exim

Greylisting mit Exim und greylistd

"Greylisting" bezeichnet eine Vorgehensweise, bei der die Entscheidung über die Annahme oder Ablehnung einer E- Mail nicht sofort fällt, sondern die Annahme der Mail zunächst verzögert - der Auslieferungsversuch also mit einem temporären Fehlercode zurückgewiesen - wird; wenn in einem konfigurierbaren Zeitfenster (meist Stunden) nach einer gleichfalls konfigurierbaren Wartezeit eine erneute Auslieferung mit demselben Absender an denselben Empfänger von demselben Host aus erfolgt, wird die E-Mail angenommen und der Host als Absender legitimer Mail für eine konfigurierbaren Zeitraum (meist Wochen) von erneutem Greylisting ausgenommen. Das Konzept setzt also darauf, daß Versender unerwünschter E-Mail, namentlich mit Hilfe spezieller Tools zum Massenversand oder über gekaperte Fremdrechner, eine Auslieferung nur einmal versuchen, legitime Mailversender aber mehrfach. Diese Grundannahme trifft nicht immer zu; nach einigen erfolgreichen Jahren schaffen Spammer es zunehmend, mehrere Zustellversuche zu unternehmen; auf der anderen Seite gibt es Mailserver, die erhebliche Schwierigkeiten mit der im Standard vorgesehenen erneuten Auslieferung einer vorübergehend nicht zustellbaren E-Mail haben, bzw. Konstellationen, in denen der neue Zustellversuch von einem anderen Host als der erste ausgeht (Serverfarmen) oder einen anderen Absender hat (Mailinglisten mit VERP).

Vorsicht bei der Anwendung ist also geboten; für nähere Informationen zum Konzept und seinen Vor- und Nachteilen verweise ich auf die weiterführenden Links am Ende dieser Seite.

Vorbemerkungen

Meine Installation läuft unter Debian (früher sarge und etch, jetzt lenny), allerdings nicht mit dem Debian-Exim-Paket und seiner ungewöhnlichen Art der Konfiguration, sondern mit einem selbstkompilierten Exim (Exim 4.69) und ausgehend von der Standard-Konfigurationsdatei. Für das Greylisting verwende ich das Debian-Paket von greylistd, das die Integration mit dem Debian-Exim-Paket übrigens automatisiert hat (siehe die weiterführenden Links am Ende dieser Seite).

Mein Ziel war es, möglichst konservativ zu filtern; insbesondere will ich nur Hosts greylisten, die bereits auf einer "Real-time Blackhole List" (RBL) bzw. "DNS Blacklist" (DNSBL) stehen, filtern. Das erlaubt es mir, Blacklists zu verwenden, die für ein direktes Abweisen nicht sicher genug ist. Außerdem werden "unbescholtene" Einlieferer nach Möglichkeit nicht gebremst.

Implementation

Installation

Wenn Exim bereits installiert ist und läuft, ist zunächst greylistd zu installieren:

aptitude install greylistd

Danach muß der Exim-Benutzer (bei mir exim, bei Debian Debian-Exim der Gruppe greylist hinzugefügt werden:

adduser exim greylist

Konfiguration von greylistd

Danach ist greylistd zu konfigurieren. Die Konfigurationsdatei findet sich unter /etc/greylistd/config; man sollte insbesondere das Wartezeitintervall kritisch prüfen, 60 Minuten erscheinen mir zu viel.

Außerdem sollte man sich überlegen, welche einliefernden Hosts man whitelisten, also vom Greylisting ausnehmen will. Eine Liste von Servern, die mit Greylisting Schwierigkeiten haben, wird bei greylistd unter /var/lib/greylistd/whitelist-hosts mitgeliefert. Eigene Ergänzungen - bspw. große deutschsprachige Mailanbieter, Mailserver der eigenen Firma oder von Freunden und Bekannten - kommen in /etc/greylistd/whitelist- hosts. Beide Dateien werden allerdings nicht von greylistd selbst ausgewertet, sondern von Exim! Sie müssen also bei der Anbindung an Exim berücksichtigt werden.

Vergessen Sie nicht, die Konfiguration von greylistd neu laden zu lassen:

/etc/init.d/greylist reload

Einbindung in Exim

Für die Nutzung mit dem Standard-Debian-Exim-Paket genügt der Aufruf von "greylistd-setup-exim4" als Root; näheres bitte ich der Dokumentation des Pakets zu entnehmen.

Wer - wie ich - seinen Exim lieber selbst von Hand konfiguriert, muß von Hand eine weitere ACL einfügen, sinnvollerweise nach allen anderen Spamfiltern und der Überprüfung, ob der Adressat der E-Mail existiert, und vor der Annahme der E-Mail. Meine Lösung dafür, die ich anschließend dann im einzelnen zur Erläuterung auseinandernehme, sieht - ausgehend von den Beispielen aus der greylistd-Konfiguration - so aus:

  # greylisting
  # greylistd(8) configuration follows.
  #
  # Perform greylisting on incoming messages from remote hosts.
  # We do NOT greylist messages with no envelope sender, because that
  # would conflict with remote hosts doing callback verifications, and we
  # might not be able to send mail to such hosts for a while (until the
  # callback attempt is no longer greylisted, and then some).
  #
  # We also check the local whitelist to avoid greylisting mail from
  # hosts that are expected to forward mail here (such as backup MX hosts,
  # list servers, etc).
  #
  # Because the recipient address has not yet been verified, we do so
  # now and skip this statement for non-existing recipients.  This is
  # in order to allow for a 550 (reject) response below.  If the delivery
  # happens over a remote transport (such as "smtp"), recipient callout
  # verification is performed, with the original sender intact.

  defer
    message        = $sender_host_address is not yet authorized to deliver \
                     mail from <$sender_address> to <$local_part@$domain>. \
                     Please try later.
    log_message    = greylisted.
    !senders       = : postmaster@*
    !hosts         = : +relay_from_hosts : \
                     ${if exists {/etc/greylistd/whitelist-hosts}\
                                 {/etc/greylistd/whitelist-hosts}{}} : \
                     ${if exists {/var/lib/greylistd/whitelist-hosts}\
                                 {/var/lib/greylistd/whitelist-hosts}{}}
    !authenticated = *
    domains        = +local_domains : +relay_to_domains
    dnslists       = ${readfile{/usr/exim/greylist-rbls}{:}}
    condition      = ${readsocket{/var/run/greylistd/socket}\
                                 {--grey \
                                  $sender_address \
                                  $sender_address \
                                  $local_part@$domain}\
                                 {5s}{}{false}}

Im einzelnen haben die Teile dieser ACL folgende Bedeutung:

    message        = $sender_host_address is not yet authorized to deliver \
                     mail from <$sender_address> to <$local_part@$domain>. \
                     Please try later.

Diese Nachricht erhält der einliefernde Server, wenn Greylisting greift.

    log_message    = greylisted.

Diese Information schreibt Exim ins Log.

    !senders       = : postmaster@*

Diese Absender werden vom Greylisting generell ausgenommen; das betrifft den leeren Absender <> und den Absender postmaster. Wer hier keine Ausnahmen macht, riskiert Probleme mit der Mailauslieferung an Hosts, die durch einen Callout die Gültigkeit der Absenderadresse zu prüfen versuchen.

    !hosts         = : +relay_from_hosts : \
                     ${if exists {/etc/greylistd/whitelist-hosts}\
                                 {/etc/greylistd/whitelist-hosts}{}} : \
                     ${if exists {/var/lib/greylistd/whitelist-hosts}\
                                 {/var/lib/greylistd/whitelist-hosts}{}}

Diese Hosts werden vom Greylisting generell ausgenommen: Einlieferungen, die nicht per SMTP erfolgen, sondern durch lokalen Aufruf von Exim; Einlieferungen durch Hosts, die per SMTP relayen dürfen, und Einlieferungen durch Hosts, die auf einer der bereits zuvor genannten Whitelists stehen.

    !authenticated = *

Mail, die durch authentifizierte Nutzer eingeliefert wird, wird gleichfalls vom Greylisting ausgenommen. Das ist schon deshalb empfehlenswert, weil es sich dabei zumeist nicht um andere Mailserver, sondern Mailclients von Endnutzern handeln dürfte.

    domains        = +local_domains : +relay_to_domains

Nur Mail an Domains, für die der Server zuständig ist, wird dem Greylisting unterworfen, also nur eingehende Mail.

    dnslists       = ${readfile{/usr/exim/greylist-rbls}{:}}

Das Greylisting greift nur für Hosts, die bereits auf einer der in der Datei greylist-rbls genannten Blacklists (eine pro Zeile) stehen. Überlegen Sie sich, welche Listen Sie nutzen wollen!

    condition      = ${readsocket{/var/run/greylistd/socket}\
                                 {--grey \
                                  $sender_host_address \
                                  $sender_address \
                                  $local_part@$domain}\
                                 {5s}{}{false}}

Hier wird greylistd aufgerufen und erhält die IP-Adresse des einliefernden Hosts, die Absenderadresse und die Zieladresse übergeben. Wenn der Host schon auf der Whitelist steht, darf er sofort ausliefern (die condition ist false). Ist er noch unbekannt, wird die Einlieferung verzögert (die condition ist true); zugleich wird das Tripel aus Host-IP, Absender und Empfänger in die Greylist-Datenbank aufgenommen. Wenn jetzt binnen des in der greylistd-Konfiguration definierten Zeitfensters noch einmal derselbe Host eine Mail mit demselben Absender an denselben Empfänger einzuliefern versucht, wird die Mail diesmal angenommen und der Host zugleich auf die Whitelist übernommen, d.h. bei späteren Einlieferversuchen - auch von Mails anderer Absender an andere Empfänger - nicht mehr verzögert.

Wenn Sie nicht nur einen Host, sondern immer direkt einen ganzen Netzblock, bspw. ein /24, whitelisten wollen, dann können Sie statt der fettgedruckten Zeile

                                  $sender_address \

die Zeile

                                  ${mask:$sender_host_address/24} \

verwenden.

Weitere Konfigurationsmöglichkeiten

Für weitere Konfigurationsmöglichkeiten, bspw. das Greylisting von Bounces in der DATA-ACL - wo es Callouts nicht mehr behindert - oder die Auswertung der Blacklist von greylistd, verweise ich auf die Dokumentation in /usr/share/doc/greylistd und die weiterführenden Links am Ende dieser Seite.

Bedienung

Zugriff auf die Datenbanken von greylistd zum Ausgeben oder Bearbeiten der Grey- und Whitelist oder zur Anzeige von Statistiken erhalten Sie über den Befehl greylist (ohne "d" am Ende!). Die verfügbaren Befehle erhalten Sie durch Aufruf von

greylist --help

Weiterführende Links

Buchempfehlungen bei Amazon

Lizenz

Creative Commons-Lizenzvertrag Dieser Inhalt ist unter einer Creative Commons-Lizenz lizenziert; er darf unter Namensnennung des Autors nicht-kommerziell weitergegeben und auch bearbeitet werden, soweit das neue Werk gleichfalls wieder dieser Creative-Commons-Lizenz unterliegt. Die Einzelheiten ergeben sich aus dem Lizenzvertrag.