Fortgeschrittene Spambekämpfung für Univention

Wir haben zwar dank SpamAssassin in den normalen Postfächern keine große Spam-Belastung, aber bei den office-Adressen gelang es bislang doch täglich mehreren Dutzend bis hundert Spam-E-Mails die Filter zu passieren. Um dem jetzt einen Riegel vorzuschieben, sollen Postgrey und policyd-weight eingerichtet werden. Diese werden zwar bei Debian mitgeliefert, nicht aber bei UCS. Ein einfaches Installieren der Pakete aus dem Debian-Repositories ist nicht empfehlenswert, da dieses dabei mit Univention-Spezifika kollidieren könnte. Glücklicherweise ist die Installation von Hand nicht sehr schwer.

Als erstes benötigen wir die Software. Im Falle von policyd-weight handelt es sich zwar nach der Namensgebung um eine Beta oder laut Changelog sogar Alpha, aber laut Aussage des Entwicklers ist die Software dennoch auf breiter Linie in produktivem Einsatz. Wir vertrauen ihm einfach mal:

$> mkdir software
$> cd software
$> wget  http://postgrey.schweikert.ch/pub/postgrey-1.33.tar.gz
$> wget http://www.policyd-weight.org/policyd-weight
$> chmod 0555 policyd-weight
$> tar xvf postgrey-1.33.tar.gz
$> mv policyd-weight postgrey-1.33/postgrey 
   postgrey-1.33/contrib/postgrey-report /usr/local/sbin/
$> mv postgrey-1.33/postgrey_whitelist_* /etc/postfix/
$> mv postgrey-1.33/contrib/postgrey.init /etc/init.d/postgrey
$> chown root:root /etc/init.d/postgrey
$> chmod 744 /etc/init.d/postgrey
$> useradd -r -s /bin/false postgrey
$> mkdir /var/spool/postfix/postgrey
$> chown postgrey /var/spool/postfix/postgrey/
$> useradd -r -s /bin/false polw
$> groupadd -r polw
$> usermod -a -G polw polw

Damit sind die meisten Dinge vorbereitet, jetzt kümmern wir uns erst noch darum, dass alle benötigten Perl-Pakete installiert wurden. Glücklicherweise geht das vollständig über apt-get, wobei die meisten sogar bereits installiert sein dürften.

$> apt-get update
$> apt-get install libnet-dns-perl libio-multiplex-perl libnet-server-perl 
   libberkeleydb-perl

Jetzt fehlen und noch ein Init-Skript und eine Konfigurationsdatei für policyd-weight. Auf letztere kann man unter Umständen verzichten, wenn man mit den Standardeinstellungen zufrieden ist – die man über policyd-weight defaults abrufen kann. Wir haben ein paar Werte angepasst, so haben wir dem RBL-Betreiber spamhaus.org auf Grund seines fragwürdigen Verhaltens in der Vergangenheit einen niedrigere Gewichtung zugewiesen und im Gegenzug die der “NiX Spam”-RBL erhöht. Außerdem haben wir die Schwellwerte für RBLs erhöht, um die Wahrscheinlichkeit von falsch-positiven Resultaten zu verringern.

/etc/policyd-weight.conf

/etc/policyd-weight.conf## DNSBL settings
   @dnsbl_score = (
#    HOST,                    HIT SCORE,  MISS SCORE,  LOG NAME
    'pbl.spamhaus.org',       2.50,          0,        'DYN_PBL_SPAMHAUS',
    'sbl-xbl.spamhaus.org',   3.35,       -1.5,        'SBL_XBL_SPAMHAUS',
    'bl.spamcop.net',         3.75,       -1.5,        'SPAMCOP',
    'dnsbl.njabl.org',        4.25,       -1.5,        'BL_NJABL',
    'ix.dnsbl.manitu.net',    4.90,          0,        'IX_MANITU',
    'rbl.ipv6-world.net',     4.25,          0,        'IPv6_RBL'
);

   $MAXDNSBLHITS  = 4;  # If Client IP is listed in MORE
                        # DNSBLS than this var, it gets
                        # REJECTed immediately

   $MAXDNSBLSCORE = 9;  # alternatively, if the score of
                        # DNSBLs is ABOVE this
                        # level, reject immediately

Für die init-Datei haben wir die Debian-Variante herangezogen:

/etc/init.d/policyd-weight

#! /bin/sh
#               Written by Miquel van Smoorenburg .
#               Modified for Debian
#               by Ian Murdock .
#
# Version:      @(#)skeleton  1.9  26-Feb-2001  miquels@cistron.nl
# /etc/init.d/policyd-weight: v1 2006/11/08 Jan Wagner 

### BEGIN INIT INFO
# Provides: policyd-weight
# Required-Start: $local_fs $network $remote_fs $syslog
# Required-Stop: $local_fs $network $remote_fs $syslog
# Default-Start:  2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: start and stop the policyd-weight daemon
# Description: a Perl policy daemon for the Postfix MTA
### END INIT INFO

PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
NAME=policyd-weight
DAEMON=/usr/local/sbin/$NAME
PIDFILE=/var/run/$NAME.pid
DESC=policyd-weight
DAEMON_OPTS=""

test -x $DAEMON || exit 0

# Include policyd-weight defaults if available
if [ -f /etc/default/policyd-weight ] ; then
        . /etc/default/policyd-weight
fi

set -e

case "$1" in
  start)
        echo -n "Starting $DESC: "
                $DAEMON $DAEMON_OPTS start
        echo "$NAME."
        ;;
  stop)
        echo -n "Stopping $DESC (incl. cache): "
                $DAEMON -k && start-stop-daemon --stop --quiet 
                  --oknodo --pidfile $PIDFILE && rm -rf $PIDFILE
        echo "$NAME."
        ;;
  dstop)
        echo -n "Stopping $DESC (without cache): "
                $DAEMON $DAEMON_OPTS stop
        echo "$NAME."
        ;;
  reload)
        echo "Reloading $DESC configuration files."
                $DAEMON $DAEMON_OPTS reload
        ;;
  restart|force-reload)
        echo -n "Restarting $DESC (incl. cache): "
                $DAEMON -k && $DAEMON $DAEMON_OPTS restart
        echo "$NAME."
        ;;
  drestart)
        echo -n "Restarting $DESC (without cache): "
                $DAEMON $DAEMON_OPTS restart
        echo "$NAME."
        ;;
  *)
        N=/etc/init.d/$NAME
        echo "Usage: $N {start|stop|dstop|restart|drestart|reload|" 
          "force-reload}" >&2
        exit 1
        ;;
esac

exit 0

Die Init-Skripte sind damit installiert; wir tragen sie folglich abschließend in den “Autostart” ein:

$> update-rc.d postgrey defaults
$> update-rc.d policyd-weight defaults

Bleibt nur noch, Postfix wissen zu lassen, dass er die beiden Dienste nutzen soll. Wir benutzen dafür den für UCS 2.4 bevorzugten Pfad: die Univention Configuration Registry. Ein Postfix-Reload übernimmt abschließend die Änderungen bei laufendem Betrieb.

$> ucr set mail/postfix/smtpd/restrictions/recipient/80=
   "check_policy_service inet:127.0.0.1:12525"
$> ucr set mail/postfix/smtpd/restrictions/recipient/85=
   "check_policy_service inet:127.0.0.1:10023"
$> /etc/init.d/postfix reload

Wir empfehlen, die Konfiguration zuerst auf einer Testmaschine auszuprobieren und ausgiebig zu prüfen. Wir haben dazu u.a. E-Mails von einer externen Maschine aus mittels Telnet geschickt.