Postfix Anti-Spam Konfiguration

Vorwort

Ein unserer Zeit wohl bekanntes Übel, welches ich hier behandeln möchte: Spam. Nein, nicht das amerikanische Dosenfleisch, sondern unerwünschte E-Mail Nachrichten, die meist von ganzen Bot-Netzen auf hunderte oder tausende Mail-Konten losgelassen werden, welche zum Großteil verseucht sind oder Werbung beinhalten. Es ist an den Administratoren der Mailserver, den Angreifern immer einen Schritt voraus zu sein, zumal ja heute einige wirksame Methoden existieren, dieser Flut zu entkommen, oder sie zumindest zu mildern. Ich werde in diesem Artikel beschreiben, wie man den bekannten und verbreiteten MTA Postfix gegen die Spam-Schleudern absichert und auch ein paar Worte zu den Vorgehensweisen der bösen Buben verlieren :-) Vorausgesetzt wird allerdings eine funktionierende Postfix-Installation, darauf werde ich hier nicht eingehen :-) Auf geht´s!

Software

Getestet wurde diese Anleitung auf einer Debian 5.0 „Lenny“ Linux-Distribution (x86_64), welche schon soweit konfiguriert ist, dass der Mail-Versand klappt. Nun zu den verwendeten Komponenten (dessen Installation noch folgt):

  • Postfix 2.5.5 (wird vorausgesetzt)
  • Spamassassin 3.2.5
  • Razor
  • Pyzor
  • Postgrey 1.31

Installation

Debian-typisch bedienen wir uns dem Paket-Manager und installieren alles in einem Rutsch (als root):

aptitude install spamassassin razor pyzor postgrey

Danach kann sofort mit der Einrichtung losgelegt werden.

Konfiguration

Dank Lizenz-rechtlichem Bla Bla sind vor einem ersten Start noch folgende Anpassungen notwendig.

Spamassassin

Spamassassin ist standardmäßig deaktiviert, sowie das automatische Updaten der Datenbank. Somit passen wir folgende Datei an:

/etc/default/spamassassin
# /etc/default/spamassassin
# Duncan Findlay
 
# WARNING: please read README.spamd before using.
# There may be security risks.
 
# Change to one to enable spamd
ENABLED=1
 
# Options
# See man spamd for possible options. The -d option is automatically added.
 
# SpamAssassin uses a preforking model, so be careful! You need to
# make sure --max-children is not set to anything higher than 5,
# unless you know what you're doing.
 
SAHOME="/home/spamassassin"
SAUSER="spamassassin"
OPTIONS="--create-prefs --max-children 5 --username ${SAUSER} --helper-home-dir ${SAHOME} -s /var/log/spamd.log"
 
# Pid file
# Where should spamd write its PID to file? If you use the -u or
# --username option above, this needs to be writable by that user.
# Otherwise, the init script will not be able to shut spamd down.
PIDFILE="/var/run/spamd.pid"
 
# Set nice level of spamd
#NICE="--nicelevel 15"
 
# Cronjob
# Set to anything but 0 to enable the cron job to automatically update
# spamassassin's rules on a nightly basis
CRON=1

Nun geht es ans Herz des spamd, die nachfolgenden Konfigurationsdateien sind entsprechend abzugleichen:

/etc/spamassassin/local.cf
local.cf
# SpamAssassin config file for version 3.x
# NOTE: NOT COMPATIBLE WITH VERSIONS 2.5 or 2.6
# See http://www.yrex.com/spam/spamconfig25.php for earlier versions
# Generated by http://www.yrex.com/spam/spamconfig.php (version 1.50)
 
# How many hits before a message is considered spam.
# Meine Empfehlung: nicht erhöhen, hat sich in der Praxis als tauglich erwiesen!
required_score           5.0
 
# Change the subject of suspected spam
# Wer seine Spam-Nachrichten deutlich kennzeichnen möchte, aktiviert nachfolgende Zeile.
#rewrite_header subject         *****SPAM*****
 
# Encapsulate spam in an attachment (0=no, 1=yes, 2=safe)
# Als Spam-gezeichnete Mails werden nicht in einem Bericht als Anhang ausgeliefert, sondern gelassen wie sie sind.
# Diese Option ist den eigenen Bedürfnissen anzupassen.
report_safe             0
 
# Enable the Bayes system
use_bayes               1
 
# Enable Bayes auto-learning
bayes_auto_learn        1
 
# Enable or disable network checks
skip_rbl_checks         0
use_razor2              1
use_dcc                 1
use_pyzor               1
 
# Mail using languages used in these country codes will not be marked
# as being possibly spam in a foreign language.
# - english german
ok_languages            en de
 
# Mail using locales used in these country codes will not be marked
# as being possibly spam in a foreign language.
ok_locales              en
 
# Diese Direktive erlaubt dem Pyzor-Daemon seine Daten zu aktualisieren, mehr dazu später.
pyzor_options --homedir /home/spamassassin/

Die folgenden Erweiterungen müssen manuell aktiviert (also einkommentiert werden), um Razor, DCC und die Sprach-Analyse nutzen zu können:

/etc/mail/spamassassin/v310.pre
# DCC - perform DCC message checks.
#
# DCC is disabled here because it is not open source.  See the DCC
# license for more details.
#
loadplugin Mail::SpamAssassin::Plugin::DCC
 
# Razor2 - perform Razor2 message checks.
#
loadplugin Mail::SpamAssassin::Plugin::Razor2
 
# TextCat - language guesser
#
loadplugin Mail::SpamAssassin::Plugin::TextCat

Was jetzt noch fehlt, ist ein Verzeichnis, indem Spamassassin & Pyzor ihre Updates verrichten können, dazu legt man einen neuen Benutzer mit Home-Verzeichnis an:

useradd -m -s /bin/false spamassassin

Letztendlich kann es in den Endspurt gehen: die Konfiguration von Postfix:

/etc/postfix/master.cf

Diese Zeile ist entsprechend anzupassen:

smtp      inet  n       -       -       -       -       smtpd -o content_filter=spamassassin

Diese Zeile ist neu und wird ans Ende der Datei angefügt:

spamassassin   unix  -       n       n       -       -       pipe
   user=spamassassin argv=/usr/bin/spamc -e /usr/sbin/sendmail -oi -f ${sender} ${recipient}

Postfix-Restrictions

Postfix selbst gibt einiges an Regeln her, um nicht Standard-konforme SMTP-Kollegen rauszuwerfen:

/etc/postfix/main.cf
# Restrictions
# nachricht an den entfernten SMTP-Server, wenn er als "Spam-Schleuder" erkannt wurde
default_rbl_reply = $rbl_code RBLTRAP: Sorry, but I decided that you are a spammer, you are not welcome here!
# Zum eigene Wohl nicht ändern ;)
smtpd_delay_reject = yes
# Wir wollen begrüßt werden
smtpd_helo_required = yes
# Die Begrüßung muss aber höflich und korrekt sein :)
smtpd_helo_restrictions =
    permit_sasl_authenticated
    permit_mynetworks
    reject_unauth_destination
    reject_non_fqdn_sender
    reject_non_fqdn_recipient
    reject_unknown_recipient_domain
    reject_non_fqdn_hostname
    reject_invalid_hostname
    reject_rbl_client zen.spamhaus.org
    reject_unauth_pipelining
    permit
# Das Wichtigste: die Empfänger-Beschränkungen
smtpd_recipient_restrictions =
    permit_sasl_authenticated
    permit_mynetworks
    check_policy_service inet:127.0.0.1:60000
    reject_invalid_hostname
    reject_non_fqdn_hostname
    reject_non_fqdn_recipient
    reject_non_fqdn_sender
    reject_unknown_sender_domain
    reject_unknown_recipient_domain
    reject_sender_login_mismatch
    reject_unauth_pipelining
    reject_unauth_destination
    reject_multi_recipient_bounce
    reject_non_fqdn_helo_hostname
    reject_invalid_helo_hostname
    reject_rbl_client zen.spamhaus.org
    permit
# Die Sender-Restriktionen
smtpd_sender_restrictions =
    permit_sasl_authenticated
    permit_mynetworks
    reject_unauth_destination
    reject_non_fqdn_sender
    reject_non_fqdn_recipient
    reject_unknown_recipient_domain
    reject_unauth_pipelining
    reject_rbl_client zen.spamhaus.org
    permit
# Die MUA Restriktionen
smtpd_client_restrictions = reject_invalid_hostname
# Mail Body Restriktionen
smtpd_data_restrictions =
    reject_unauth_pipelining
    reject_multi_recipient_bounce
    permit

Mehr zu all den Filtern findet sich in den Weblinks und im Netz ;-)

Zu Beachten sind die führenden Leerzeichen vor den Listen-Elementen!

Bogus MX

Eine weitere Schutzmaßnahme ist das Abweisen von Mails aus bekannten „falschen“ oder „gefälschten“ Netzen, sog. „Bogus MX Networks“. Folgende Datei legt man selbst an und trägt diese Netze ein:

/etc/postfix/bogus_mx
bogus_mx
# bogus networks
 
0.0.0.0/8   550 Mail server in broadcast network
1.0.0.0/8   550 Mail server in IANA reserved network
10.0.0.0/8  550 No route to your RFC 1918 network
127.0.0.0/8 550 Mail server in loopback network
224.0.0.0/4 550 Mail server in class D multicast network
172.16.0.0/12   550 No route to your RFC 1918 network
192.168.0.0/16  550 No route to your RFC 1918 network
69.6.0.0/18 550 REJECT Listed on Register Of Known Spam Operations
64.94.110.11/32 550 REJECT VeriSign Domain wildcard

Wie bereits beschrieben bindet man diesen Filter in Postfix mit ein:

/etc/postfix/main.cf
smtpd_recipient_restrictions =
    permit_sasl_authenticated # Erlaube Authentifizierte Nutzer
    permit_mynetworks         # Erlaube Nutzer aus dem eigenen LAN
    ...
    check_sender_mx_access cidr:/etc/postfix/bogus_mx # Ans Ende der Restriktionen

Postgrey

„Der Begriff Graue Liste bzw. Greylisting (brit.) oder Graylisting (USA) bezeichnet eine Form der Spam-Bekämpfung bei E-Mails, bei der die erste E-Mail von unbekannten Absendern zunächst abgewiesen und erst nach einem weiteren Zustellversuch angenommen wird. Greylisting ist zweierlei: eine Methode Spam zu erkennen, und eine Methode den Absender aussortierter E-Mails zu benachrichtigen.“ - wikipedia

Auch hier ist noch etwas zu Schrauben:

/etc/default/postgrey
# postgrey startup options, created for Debian
# (c)2004 Adrian von Bidder <avbidder@fortytwo.ch>
# Distribute and/or modify at will.
 
# you may want to set
#   --delay=N   how long to greylist, seconds (default: 300)
#   --max-age=N delete old entries after N days (default: 35)
# see also the postgrey(8) manpage
 
# Je nach Wunsch kann das Delay verkürzt oder verlängert werden (Wert in Sekunden)
POSTGREY_OPTS="--inet=127.0.0.1:60000 --delay=60"
 
# the --greylist-text commandline argument can not be easily passed through
# POSTGREY_OPTS when it contains spaces.  So, insert your text here:
#POSTGREY_TEXT="Your customized rejection message here"

Wie schon beschrieben sollte man die Reihenfolge in der Postfix-Konfiguration einhalten, um die besten Ergebnisse in Sachen Performance zu erreichen:

/etc/postfix/main.cf
smtpd_recipient_restrictions =
    permit_sasl_authenticated # Erlaube Authentifizierte Nutzer
    permit_mynetworks         # Erlaube Nutzer aus dem eigenen LAN
    # Vor allen anderen Prüfungen erst mal Greylisten,
    # wer dann noch nicht aufgegeben hat, wird mit den
    # restlichen Policies gründlich durchgetestet :)
    check_policy_service inet:127.0.0.1:60000

Simpel und Wirksam :-)

Fertig

Das war´s, schlimm oder? ^_^ Nun noch Pyzor Updaten lassen und alle Dienste durchstarten und es sollte laufen wie geschmiert:

sudo -u spamassassin pyzor --homedir /home/spamassassin discover
invoke-rc.d postgrey restart
invoke-rc.d spamassassin restart
invoke-rc.d postfix restart

Was sich danach alles tun wird :-)

tail -n 100 -f /var/log/mail.log

Quellen

Kommentare