Greylisting

Aus Doku-Wiki
Zur Navigation springenZur Suche springen

Postgrey unter Debian einrichten

Erklärung

postgrey ist ein sehr nützliches Tool zur E-Mail-Spambekämpfung. postgrey arbeitet mit postfix zusammen (der Name verrät es schon) und basiert auf einem interessanten Konzept: Spam wird nicht durch Inhaltsfilter geprüft, wie es zum Beispiel Spamassassin macht, sondern bereits beim Vorgang der Einlieferung auf dem Mailserver aussortiert.

Vereinfacht kann man sich das Konzept von postgrey folgendermaßen vorstellen: Die wenigsten Spammer benutzen vernünftig aufgesetzte Mailserver. Ein solcher würde unter anderem bei einem erfolglosen Versuch eine Mail auf einem fremden Mailserver einzuliefern eine Weile warten und es erneut probieren. So kann man gewährleisten, dass im Falle einer temporären Nichterreichbarkeit eines Mailservers (Wartungsarbeiten, Reboot o. ä.) keine Mails verloren gehen. Über 95% aller Rechner, welche Spam versenden, machen dies mit einer "Fire and Forget"-Strategie: Wenn ein Mailserver die Mail nicht annimmt, wird nach einer Weile nicht noch einmal probiert die Mail einzuliefern. Viren, welche sich selbst verbreiten, verhalten sich in den allermeisten Fällen genauso wie die meisten Spammer.

Genau das macht man sich beim Greylisting zu Nutze. Ein Greylisting-Daemon prüft genau drei Dinge bei einer versuchten Maileinlieferung:

die IP-Adresse der Maschine, welche eine Mail einliefern möchte, die Senderadresse (Envelope) und die Empfängeradresse (Envelope). Nun hat man ein Triplet, welches eine Beziehung zwischen Sender, Empfänger und Sendehost herstellt. Hat man dieses Triplet, geht man wie folgt vor:

Wenn dieses Triplet noch nicht aufgetaucht ist, wird die Maileinlieferung mit einem temporären SMTP-Fehler (450) abgebrochen. Sobald eine erneute Einlieferung mit dem selben Triplet nach einer einzustellenden Zeitspanne versucht wird, darf diese erfolgen.

Mit dieser Methode erschlägt man den meisten Spam, bevor er überhaupt den Rechner erreicht und spart sich obendrein sogar noch die Rechenzeit fressende Untersuchung mit Filtern wie Spamassassin. postgrey sammelt alle bekannten Triplets in einer Datenbank, man kann so bekannte Triplets direkt erkennen und die entsprechende Einlieferung erlauben. Auch Clients, welche das Greylisting bereits mehrfach erfolgreich durchlaufen haben werden automatisch in einer Whitelist gesammelt.

Ein kleiner Nachteil der Methode soll hier nicht verschwiegen werden: Auf Grund der Abweisung einer Mail bei Auftreten eines unbekannten Triplets wird ein bestimmter Anteil der Mails mit einer kleinen Verzögerung von wenigen Minuten ankommen. Anfangs wird die durchschnittliche Verzögerung etwas höher sein, später merkt man kaum noch was davon.

  • Wie implementiert man nun postgrey?
    • Ich gehe davon aus, dass eine der folgenden Debian "Sarge/Etch/Lenny" eingesetzt wird und Postfix bereits läuft. Wenn diese Voraussetzungen erfüllt sind, ist es eigentlich ein Kinderspiel:

Installation und Konfiguration

  • Zuerst installiert man postgrey. Unter Debian wie immer besonders einfach:
aptitude install postgrey

Eventuelle Abhängigkeiten (diverse Perl-Module) werden automatisch mitinstalliert.

  • Nun sollte der sogenannte Policy-Server auf dem lokalen Interface auf Port 60000 lauschen. Überprüfen kann man das ganz einfach mit netstat:
netstat -l -p -n | grep 60000
  • Diese Ausgabe sollte etwa so aussehen:
tcp        0      0 127.0.0.1:60000  0.0.0.0:*               LISTEN     23979/postgrey.pid
  • Jetzt muss postfix nur noch gesagt werden, dass postgrey auch benutzt werden soll. Dazu wird in der main.cf (meist in /etc/postfix/ zu finden) folgendes zu smtpd_recipient_restrictions hinzugefügt:
check_policy_service inet:127.0.0.1:60000
  • Die Zeile sieht dann vielleicht so aus:
smtpd_recipient_restrictions =
   permit_mynetworks
   permit_sasl_authenticated
   reject_unauth_destination
   check_policy_service inet:127.0.0.1:60000
  • Nun wird die Konfiguration von postfix neu eingelesen:
postfix reload 

und das Greylisting arbeitet! Mit ein paar Testmails von verschiedenen Accounts und Mailservern sowie dem Logfiles von postfix kann man die korrekte Funktion von postgrey überprüfen.

Will man Statistiken zur Effektivität von postgrey haben, bieten sich Tools wie mailgraph http://people.ee.ethz.ch/~dws/software/mailgraph/ oder pflogsumm http://people.ee.ethz.ch/~dws/software/mailgraph/ an. Die Anzahl der abgelehnten Mails wird ungeahnte Höhen erreichen ;-)

Bei meinem Projekt mtb-news.de werden mit der Greylisting-Methode pro Tag zwischen 3000 und 5000 Spammails gar nicht erst angenommen. Wenn man sich überlegt, dass sonst jede einzelne dieser Mails einen recht rechenzeitintensiven Filter wie Spamassassin durchlaufen würde wird man erleichtert sein, dass man neben der Vermeidung von lästigem Spam und Virenmails auch noch die Load auf dem Mailserver durch den Einsatz von Greylisting entscheidend senken konnte.

Debian Mailrelay mit Postfix und Greylisting

Versionen

Alle Programme basieren auf den Standard-Paketen von:

Debian 5.0 / Lenny

Installation

  • Postfix und PostGrey
aptitude install postgrey postfix

Konfiguration

FQDN Prüfen

hostname -f
  mail.example.com
  • Wenn hier nicht der FQDN erscheint, sollten die Angaben in folgenden Dateien angepasst werden:
/etc/hosts
/etc/hostname
/etc/mailname

main.cf

# Debian specific:  Specifying a file name will cause the first
# line of that file to be used as the name.  The Debian default
# is /etc/mailname.
#myorigin = /etc/mailname

# --- System
smtpd_banner = $myhostname ESMTP $mail_name ([BANNER-TEXT EINFUEGEN])
biff = no
append_dot_mydomain = no
append_at_myorigin = no
readme_directory = no

mydomain = [MAILSERVER-DOMAIN]
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases

myorigin = /etc/mailname
mydestination = $mydomain $myhostname localhost localhost.localdomain localhost.$mydomain
relayhost =

# --- Netzwerke von denen Relaying erlaubt ist
mynetworks =
       127.0.0.0/8
       172.16.0.0/24

# --- sender_canonical_maps verändert die Absenderadresse
sender_canonical_maps=hash:/etc/postfix/tables/sender_canonical

# --- Empfänger Beschränkungen (z.B Greylisting)
smtpd_recipient_restrictions =
   permit_sasl_authenticated,
   permit_mynetworks,
   reject_unauth_destination,
   check_policy_service inet:127.0.0.1:60000 # Greylisting

# --- Domain für die Mails angenommen werden
relay_domains =
        example.com
        example.org

# --- Mailserver an die die Mails weitergeleitet werden
transport_maps = hash:/etc/postfix/tables/transport

# --- Netzwerk-Interface
inet_interfaces = all

/etc/postfix/tables/sender_canonical

root   root@myDomain.org

/etc/postfix/tables/transport

#  MAILDOMAIN :[MAIL-SERVER]
#-------------------------------
  example.com :[mail.example.lo]
  example.orq :[mail.example.lo]

# Mailserver mit anderem Port
#------------------------------- 
  example.org smtp:[mail1.example.lo]:2525

So kann für jede Mail-Domain ein andere Mail-Server als Empfänger eingetragen werdem

Postfix Lookup-Tabellen anlegen

  • Postfix-Lookup-Tabellen sind Üblicherweise Unix-Datenbanken, d.h. speziell indizierte Dateien, die einen schnellen Zugriff auf die gespeicherte Daten ermöglichen.
  • Es gibt zwei unterschiedliche Befehle Einen zum erstellen der aliases-Tabelle und einen zum erstellen der restlichen Lookup.Tabellen
    • Die Lookup-Tabellen müssen in der main.cf konfiguriert sein:
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases

transport_maps = hash:/etc/postfix/tables/transport
  • postalias
postalias /etc/aliases
  • postmap
postmap /etc/postfix/tables/transport
postmap /etc/postfix/tables/sender_canonical
  • Nun noch Postfix neu laden
postfix reload

Testen

Um die Greylisting-Funktion zu testen, kann man entweder eine Mail von einem anderen Webmailer senden, oder mittels Telnetn"zu Fuß" eine Mail versenden. Wichtig ist, dass der Mailsender nicht im Subnetz des Greylisting-Servers ist, da diese Mails aus diesem Netz nicht Greylistet.

Mailgraph

Doku zu Mailgraph

PFlogsumm

Doku PFlogsumm