Greylisting als Konzept

"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 jedoch 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, dass Versender unerwünschter E-Mail, die namentlich auf spezielle Tools zum Massenversand von E-Mails setzen oder gekaperte Fremdrechner für den Versand nutzen, eine Auslieferung nur einmal versuchen, legitime Mailversender aber mehrfach. Diese Grundannahme trifft allerdings 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 (ursprünglich einmal Sarge, jetzt Stretch), wobei ich allerdings nicht die "split configuration" nutze, sondern vielmehr die Standard-Konfigurationsdatei des Exim-Upstreams einspiele. 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. Das erlaubt es mir, Blacklists zu verwenden, die für ein direktes Abweisen nicht geeignet sind, weil die Gefahr falsch positiver Treffer zu hoch ist. Außerdem werden "unbescholtene" Einlieferer nach Möglichkeit nicht gebremst. Das erscheint mir ein brauchbarer Kompromiss zu sein.

Implementation

Installation

Wenn Exim bereits installiert ist und läuft (ich verwende für Mailserver standardmäßig das "große" Paket exim4-daemon-heavy), ist zunächst greylistd zu installieren: aptitude install greylistd

Danach muss der Exim-Benutzer (hier Debian-Exim) der Gruppe greylist hinzugefügt werden: adduser Debian-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 bereits 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: service 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. Das ermöglicht allerdings nicht alle Features, die ich in meiner eigenen Lösung eingebaut habe!

Wer - wie ich - seinen Exim lieber selbst von Hand konfiguriert, muss 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.

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{/etc/exim4/greylist-rbls}{:}}
  condition      = ${readsocket{/var/run/greylistd/socket}\
                               {--grey \
                                $sender_host_address \
                                $sender_address \
                                $local_part@$domain}\
                               {5s}{}{false}}

Im einzelnen haben die Teile dieser ACL folgende Bedeutung:

SMTP-Fehlermeldung für den Einlieferer

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.

Lognachricht

log_message    = greylisted.

Diese Information schreibt Exim ins Log.

Whitelisting bestimmter Absender

!senders       = : postmaster@*

Diese Absender (Envelope-Sender!) 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.

Whitelisting bestimmter einliefernder Hosts

!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 (+relay_from_hosts), und

  • Einlieferungen durch Hosts, die auf einer der bereits zuvor genannten Whitelists stehen.

Welche Hosts Sie ggf. whitelisten müssen, dürfte sehr von Ihrem spezifischen Mailverkehr abhängig sein. Ich persönlich habe mit meinem Greylist-Filter - auch ohne explizites Whitelisting über die "mitgelieferten" Listen hinaus - in den letzten gut neun Jahren keine Schwierigkeiten gehabt (im Gegensatz bspw. zu Sender Callouts); das heißt aber nicht, dass nicht durch Greylisting - wie letztlich durch jeden Filter - auch erwünschte Mail verlorengehen kann. Die Wahrscheinlichkeit dafür hingegen erscheint mir in der hier vorgeschlagenen Konfiguration denkbar gering.

Whitelisting authentifizierter Clients

!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, für die das Greylisting greifen soll

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.

Man kann sich hier auch eine Whitelist von Empfänger-Domains konfigurieren, für die kein Greylisting erfolgen soll:

domains        = !+acl_whitelist : +local_domains : +relay_to_domains

+acl_whitelist muss dann passend definiert sei, bspw. direkt in der Exim-Konfiguration (domainlist acl_whitelist = maillists.mydomain.example), durch Einbinden einer Datei (domainlist acl_whitelist = /etc/exim4/domains-whitelist)) oder auch durch Abruf aus LDAP, einer Datenbank oder wie auch immer.

Beschränkung auf in RBLs gelistete Hosts

dnslists       = ${readfile{/etc/exim4/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. Wenn Sie diese Zeile weglassen, greift das Greylisting hingegen für alle Hosts, die nicht explizit ausgenommen wurden.

Überlegen Sie sich, welche Blacklists Sie nutzen wollen! In Betracht kommen bspw.

  • zen.spamhaus.org
  • bl.spamcop.net
  • dnsbl.sorbs.net
  • ix.dnsbl.manitu.net
  • psbl.surriel.com
  • cbl.abuseat.org
  • b.barracudacentral.org
  • dnsbl-1.uceprotect.net
  • dnsbl-2.uceprotect.net
  • dnsbl-3.uceprotect.net

Nicht jede dieser Listen werden Sie nutzen wollen; bitte kopieren Sie nicht einfach den Text, sondern prüfen Sie die Policy der jeweiligen Listen.

Der eigentliche greylistd-Aufruf

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 $sender_host_address auch ${mask:$sender_host_address/24} verwenden.

Weitere Konfigurationsmöglichkeiten

Für weitere Konfigurationsmöglichkeiten von greylistd, 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.

Lizenz

Creative Commons-Lizenzvertrag Dieser Inhalt ist unter der Creative Commons-Lizenz BY-NC-SA 4.0 DE 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.