Greylisting
Inhaltsverzeichnis
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.
Postgrey Cache leeren
cd /var/lib/postgrey/ rm *