Greylisting zur Spamvermeidung

Greylisting ist eine Methode zur Bekämpfung von Spam. Absender, die zum ersten Mal eine Mail schicken, werden zunächst mit einer temporären Fehlermeldung abgewiesen und in der Greylist gespeichert. „Echte“ Mailserver werden die Mail nach einiger Zeit erneut senden, da es nicht ungewöhnlich ist, dass Mails nicht sofort zustellbar sind. Bei diesem zweiten Zustellversuch ist der Absender bekannt und die Mail wird zugestellt. Weitere Mails vom selben Absender werden für einen gewissen Zeitraum ohne Verzögerungen zugelassen.

Spammer werden aber Mails nur einmal schicken, da sie häufig nur simple SMTP-Clients ohne Fehlerbehandlung verwenden. Selbst wenn einzelne Spammer reguläre Mailserver benutzen, ist die Chance hoch, dass der Spammer beim zweiten Zustellversuch bereits bekannt ist und durch RBLs und Spamfilter erkannt wird.

Installation von Postgrey für Postfix

Wenn auf dem eigenen Server Postfix als Mailserver eingesetzt wird, kann man Greylisting sehr leicht mit Postgrey nachträglich hinzufügen.

Schritt 1: Paket installieren

apt-get install postgrey

Schritt 2: Prüfen, dass der Postgrey-Daemon läuft

ps aux | grep postgrey

Es sollte dann etwa folgende Zeile zu sehen sein:

postgrey 31898 ?        Ss     0:00 /usr/sbin/postgrey --pidfile=/var/run/postgrey.pid --daemonize --inet=10023

Wichtig ist hier die Angabe –inet=10023 – das ist der Port, über den Postgrey Verbindungen entgegennimmt.

Auf Wunsch kann man in der Datei /etc/default/postgrey auch die Optionen anpassen – etwa die Zeit, ab der ein Absender beim zweiten Versuch akzeptiert wird (Standard sind 300 Sekunden – eine Reduzierung auf 50 Sekunden ist hier sinnvoll, da manche Server bereits nach einer Minute einen zweiten Zustellversuch machen):

POSTGREY_OPTS="--inet=10023 --delay=50"

Wenn man Änderungen an den Vorgaben für Postgrey vornimmt, sollte man danach den Daemon mit

/etc/init.d/postgrey restart

neu starten.

Schritt 3: Die Postfix-Konfiguration erweitern, damit Postgrey genutzt wird

Dazu ist die Datei /etc/postfix/main.cf wie folgt zu erweitern:

In der Zeile mit der Angabe smtpd_recipient_restrictions =  ist ein zusätzlicher Eintrag check_policy_service inet:127.0.0.1:10023 zu ergänzen (wenn Postgrey einen anderen Port als 10023 verwendet, ist die Angabe entsprechend anzupassen). Entweder man fügt eine zusätzliche Zeile ein oder hängt den Eintrag in der Zeile als letzte Angabe getrennt durch ein Komma an.

smtpd_recipient_restrictions =
  permit_mynetworks
  permit_sasl_authenticated
  reject_invalid_hostname
[...]
  check_policy_service inet:127.0.0.1:10023

Danach die Postfix-Konfiguration neu laden:

postfix reload

Schritt 4: Prüfen, ob Greylisting funktioniert

Dazu schickt man sich eine Test-Mail – von einer anderen Adresse aus – und kontrolliert, ob in der Datei /var/log/mail.info (oder /var/log/mail.log) Einträge auftauchen, die etwa wie folgt aussehen (manche Stellen wurden mit xxx anonymisiert – selbstverständlich sollte man dort die echten Daten vorfinden):

Sep 11 07:52:43 xxx postgrey[31898]: action=greylist, reason=new, client_name=xxx, client_address=xxx, sender=xxx, recipient=xxx
Sep 11 07:52:43 xxx postfix/smtpd[31972]: NOQUEUE: reject: RCPT from unknown[xxx]: 450 4.2.0 <xxx>: Recipient address rejected: Greylisted, see http://postgrey.schweikert.ch/help/xxx; from=<xxx> to=<xxx> proto=SMTP helo=<xxx>

Wenn der sendende Mailserver die Zustellung erneut versucht, sollte die Mail dann akzeptiert werden, was ebenfalls an einer entsprechenden Meldung erkennbar ist:

Sep 11 08:01:05 xxx postgrey[31898]: action=pass, reason=triplet found, delay=508, client_name=xxx, client_address=xxx, sender=xxx, recipient=xxx

Das Triplet aus IP-Adresse, Absender und Empfänger wird nun in der Datenbank von Postgrey als „bekannter Absender“ eingetragen und weitere Mails von der selben Adresse sollten ohne Verzögerung sofort zugestellt werden.

Da die meisten Spammer genau das nicht tun – die Zustellung erneut versuchen – werden die meisten Spam-Mails schlicht ignoriert :-).

Mögliche Probleme

/etc/init.d/postgrey funktioniert nicht richtig

Bei einigen Distributionen (z.B. neuere Versionen von Debian oder Ubuntu) gibt es ein Problem mit dem mitgelieferten Startscript (/etc/init.d/postgrey). Postgrey wird gestartet aber nicht beendet. Der Grund dafür ist die Art, wie das Script versucht, den laufenden Postgrey-Daemon zu beenden.

Eine Korrektur dafür ist in http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=670681 beschrieben. Dies trifft auch auf Ubuntu 12.04 zu (und möglicherweise auch auf neuere Versionen).

Postgrey akzeptiert keine Verbindungen

Mitunter kann es auch passieren, dass Postgrey auf dem konfigurierten Port keine Verbindungen von Postfix annimmt, erkennbar an entsprechenden Fehlermeldungen in /var/log/mail.log:

Nov 17 13:35:54 root postfix/smtpd[16821]: warning: connect to 127.0.0.1:10023: Connection refused
Nov 17 13:35:54 root postfix/smtpd[16821]: warning: problem talking to server 127.0.0.1:10023: Connection refused

In diesem Fall hilft es, in den Startoptionen in /default/postgrey auch die IP-Adresse 127.0.0.1 zu ergänzen:

POSTGREY_OPTS="--inet=127.0.0.1:10023 --delay=50"

Danach nicht vergessen, Postgrey neu zu starten.

Erweiterung durch selektives Greylisting

Ein Kritikpunkt an Greylisting ist die verzögerte Zustellung von Nachrichten. Auch wenn E-Mail kein „Echtzeitmedium“ ist, erwarten Nutzer, dass E-Mails möglichst „sofort“ ankommen. Eine Lösung dazu ist „selektives Greylisting“.

Selektives Greylisting bedeutet, dass nicht jeder Zustellversuch durch Greylisting geprüft wird, sondern nur solche, die „verdächtig“ aussehen (Server ohne Namen, Dial-Up-Adressen, Webserver etc.). Möglich wird dies durch die „SMTP restriction classes“ von Postfix.

Vorgehensweise:

Zunächst legt man in /etc/postfix eine Datei check_client_greylist mit folgendem Inhalt an, mit der IP-Adresse des Absenders über reguläre Ausdrücke geprüft wird. Trifft eine Bedingung zu, erfolgt die Einstufung als „prüfen mit Greylisting“, sonst nicht:

# regex to check clients which seem to be dynamic
# only those will be greylisted
#
# regex type, no postmap needed

/^unknown$/                                   check_greylist
/([0-9]{1,3}[.-]){3,4}[^0-9.]+/               check_greylist
/^(dhcp|dialup|ppp|adsl|host|static|www|server|client)[^.]*[0-9]/     check_greylist
/^[^.]*[0-9]{5}/                              check_greylist

Damit diese Prüfung angewendet wird, ist die Datei /etc/postfix/main.cf wie folgt zu erweitern:

smtpd_restriction_classes = check_greylist
check_greylist = check_policy_service inet:127.0.0.1:10023

Der Eintrag check_policy_service inet:127.0.0.1:10023 in smtpd_recipient_restrictions =  wird ersetzt durch check_client_access regexp:/etc/postfix/check_client_greylist:

smtpd_recipient_restrictions =
  permit_mynetworks
  permit_sasl_authenticated
  reject_invalid_hostname
[...]
  check_client_access regexp:/etc/postfix/check_client_greylist

Dabei auch daran denken, den richtigen Port anzugeben, falls postgrey nicht 10023 verwendet. Auch nach dieser Änderung muss die Konfiguration von Postfix mit postfix reload neu geladen werden.

Kommentar hinterlassen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.