<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>HowTo: Postfix und SpamAssassin</title>
</head>

<body>
<img src="http://news.spamassassin.org/themes/SeaBreeze/images/ninjalogo-small.png" align="absmiddle" style="float: right; margin-left:10px; margin-bottom:10px">
<font color=red>Hinweis: Dieses HowTo basiert auf einer Mail an die SuSE-Linux-Mailingliste vom 9. Dezember 2002 von Johannes Studt. Original: <a href="http://lists.suse.com/archive/suse-linux/2002-Dec/3889.html" target="_blank">http://lists.suse.com/archive/suse-linux/2002-Dec/3889.html</a></font>
<p>
<b>Installation der Perl-Module</b>
<p>
Als Grundvorraussetzung von SpamAssassin ist die Installation von Perl und der Einfachheit halber das Modul CPAN.pm. CPAN erleichtert uns die Installation der Module, indem es diese und die Abhängigkeiten lädt und installiert. Für SpamAssassin werden sinnvollerweise diese drei Module benötigt:
<ul>
<li> Time::HiRes</li>
<li> Net::DNS</li>
<li> Mail::SpamAssassin</li>
</ul>
Also ruft man zuerst als User root "<code>perl -MCPAN -e shell</code>" auf. Jetzt reicht ein "<code>install Mail::SpamAssassin</code>" zur Installation aus. Ist das Module installiert, so loggt man sich per "<code>quit</code>" aus. Aktuelle CPAN-Versionen installieren die benötigten Module selbstständig nach. 
<p>
Soweit, so gut. Jetzt wird ein Useraccount angelegt, unter dem der Filter dann laufen wird. Der bekommt als Homeverzeichnis gleich das Verzeichnis, in dem dann das Skript die temporären Daten ablegen wird. Man könnte ihm aber sicher auch ein eigenes Home geben:
<p>
<table bgcolor="#DDDDFF" border="0" cellspacing="5">
<tr>
<td>
<code>
mkdir /var/spool/spamassassin<br>
groupadd filter<br>
useradd -g filter -d /var/spool/spamassassin -s /bin/false filter<br>
passwd -l filter<br>
chown filter.filter /var/spool/spamassassin<br>
chmod 770 /var/spool/spamassassin
</code>
</td>
</tr>
</table>
<p>file:///home/udo/howto_postfix_sa.html
Jetzt wird das Skript erstellt, welches später die Filterung erledigt (oder besser aufruft):
<p>
<b>Listing 1: /usr/local/bin/spamassassin.sh</b><br>
<table bgcolor="#DDDDFF" border="0" cellspacing="5">
<tr>
<td>
<code>
#!/bin/sh<br>
INSPECT_DIR=/var/spool/spamassassin<br>
SENDMAIL=/usr/sbin/sendmail<br>
SPAMASSASSIN=/usr/bin/spamc<br>
<br>
# Exit codes from <sysexits.h&g;<br>
EX_TEMPFAIL=75<br>
EX_UNAVAILABLE=69<br>
<br>
cd $INSPECT_DIR || { echo $INSPECT_DIR does not exist; exit $EX_TEMPFAIL; }<br>
<br>
# Clean up when done or when aborting.<br>
trap "rm -f in.$$; rm -f out.$$" 0 1 2 3 15<br>
<br>
# Parameter for $SPAMASSASSIN<br>
#  -P   Pipe message, don\'t deliver<br>
#  -x   Disable user config files<br>
#  -a   Use auto-whitelists<br>
# cat | $SPAMASSASSIN -P -x -a > out.$$ || { echo Message content rejected; exit $EX_UNAVAILABLE; }<br>
cat | $SPAMASSASSIN  > out.$$ || { echo Message content rejected; exit $EX_UNAVAILABLE; }<br>
<br>
$SENDMAIL -i "$@" < out.$$<br>
<br>
exit $?
</code>
</td>
</tr>
</table>
<p>
SpamAssassin wird über den Init-Prozess aufgerufen:
<p>
<b>Listing 2: /etc/init.d/spamd</b><br>
<table bgcolor="#DDDDFF" border="0" cellspacing="5">
<tr>
<td>
<code>
#! /bin/sh<br>
# Copyright (c) 1996 S.u.S.E. Gmbh Fuerth, Germany.  All rights reserved.<br>
#<br>
# Author: Burchard Steinbild <bs@suse.de>, 1996<br>
# Modified: Michael@Schaarwaechter.de 8/2002<br>
#<br>
### BEGIN INIT INFO<br>
# Provides:       SpamAssassin / Spamd<br>
# Required-Start:<br>
# Required-Stop:<br>
# Default-Start:  2 3 5<br>
# Default-Stop:<br>
# Description:    SpamAssassin daemon<br>
### END INIT INFO<br>
<br>
. /etc/rc.status<br>
<br>
# Determine the base and follow a runlevel link name.<br>
base=${0##*/}<br>
link=${base#*[SK][0-9][0-9]}<br>
<br>
# The echo return value for success (defined in /etc/rc.config).<br>
return=$rc_done<br>
case "$1" in<br>
 start)<br>
   echo -n "Starting service spamd daemon:"<br>
   startproc /usr/bin/spamd -a -u filter -x || return=$rc_failed<br>
   echo -e "$return"<br>
   ;;<br>
 stop)<br>
   echo -n "Shutting down service spamd daemon:"<br>
   killproc -TERM /usr/bin/spamd || return=$rc_failed<br>
   echo -e "$return"<br>
   ;;<br>
 status)<br>
   echo -n "Checking for service spamd deamon: "<br>
   checkproc /usr/bin/spamd && echo OK || echo No process<br>
   ;;<br>
 reload)<br>
   $0 stop  &&  $0 start  ||  return=$rc_failed<br>
   ;;<br>
 restart)<br>
  $0 stop  &&  $0 start  ||  return=$rc_failed<br>
   ;;<br>
 *)<br>
   echo "Usage: $0 {start|stop|status|restart|reload}"<br>
   exit 1<br>
   ;;<br>
esac<br>
<br>
# Inform the caller not only verbosely and set an exit status.<br>
test "$return" = "$rc_done" || exit 1<br>
exit 0<br>
</code>
</td>
</tr>
</table>
<p>
Ein "<code>insserv /etc/init.d/spamd</code>" installiert den Filter in den Bootprozeß und ein anschließendes "<code>/etc/init.d/spamd start</code>" startet ihn. Sollte die Linuxdistribution "<code>/etc/sysconfig</code>" unterstützen, so kann man auch ein alternatives Startscript benutzen. Jetzt sollte <code>spamd</code> in der Prozessliste auftauchen. Wenn nicht, ist was faul und man kann ihn zur Fehlersuche im Debugmodus starten (mittels "<code>/usr/sbin/spamd -a -x -u filter -D</code>", beenden mit Ctrl-C).
<p>
<b>Postfix-Konfiguration</b>
<p>
Wenn das bis hierher alles geht, muss nur noch in der Postfix-Konfiguration /etc/postfix/master.cf der Filter eingetragen werden und fertig:
<p>
<b>Listing 3: /etc/postfix/master.cf</b><br>
<table bgcolor="#DDDDFF" border="0" cellspacing="5">
<tr>
<td>
<code>smtp        inet    n  -  n  -  -  smtpd -o content_filter=filter:
<br><br>
# SpamAssassin<br>filter  unix    -       n       n       -       -       pipe<br>    user=filter argv=/usr/local/bin/spamassassin.sh -f ${sender} -- ${recipient}</code>
</td>
</tr>
</table>
<p>
Postfix muß danach mit "<code>postfix reload</code>" seine Konfigurationsdatei neu einlesen. Ein "<code>tail -f /var/log/mail</code>" zeigt, ob alles korrekt installiert und konfiguriert worden ist.
<p>
<table bgcolor="#DDDDFF" border="0" cellspacing="5">
<tr>
<td>
<code>Feb 19 14:40:14 server spamd[29722]: server started on port 783 (running version 2.44)</code>
</td>
</tr>
</table>
<p>
Falls da was in der Art "<code>spamc[28752]: connect() to spamd failed: Connection refused</code>" steht, dann läuft der Daemon nicht. Ist nicht weiter schlimm, weil die Mail dann einfach ungecheckt ausgeliefert wird, aber dann hätte man ja den Aufwand nicht treiben brauchen... ;-)
<p>
Anschließend kann man SpamAssassin einstellen. Das Beispielscript erschlägt schon die meisten Mails, indem nur westliche Sprachen zugelassen werden. Das defaultmäßige Umschreiben des Betreffs habe ich abgeschaltet.
<p>
<b>Listing 4: /etc/mail/spamassassin/local.cf</b><br>
<table bgcolor="#DDDDFF" border="0" cellspacing="5">
<tr>
<td>
<code>
# This is the right place to customize your installation of SpamAssassin.<br>
# See \'perldoc Mail::SpamAssassin::Conf\' for details of what can be<br>
# tweaked.<br>
#<br>
###########################################################################<br>
#<br>
rewrite_subject 0<br>
report_header 0<br>
report_safe 0<br>
defang_mime 0<br>
auto_whitelist_path /var/spool/spamassassin/auto-whitelist<br>
ok_locales en<br>
ok_languages de en<br>
whitelist_from ... # Kein Spam von diesen Mailaddies
</code>
</td>
</tr>
</table>
<p>
Im Header der Mail würde man dann sowas finden können:
<p>
<table bgcolor="#DDDDFF" border="0" cellspacing="5">
<tr>
<td>
<code>
X-Spam-Status: No, hits=-18.8 required=5.0<br>
  tests=AWL,EMAIL_ATTRIBUTION,IN_REP_TO,QUOTED_EMAIL_TEXT,<br>
    REFERENCES,REPLY_WITH_QUOTES,USER_AGENT_PINE<br>
  autolearn=ham version=2.53<br>
X-Spam-Level:<br>
X-Spam-Checker-Version: SpamAssassin 2.53 (1.174.2.15-2003-03-30-exp)<br>
</code>
</td>
</tr>
</table>
<p>
Ein Test auf "<code>X-Spam-Flag: YES</code>" per procmail oder Sieve filtert die so gefunden Mails raus. Für den Anfang würde ich die Mails in einen eigenen Ordner verschieben, um die erwünschten von den unerwünschten Mails trennen zu können (Stichwort: whitelist).
<p>
<b>Anmerkungen</b>
<p>
Postfix versteht bereits von Haus aus ein paar Regeln, die Spam verhindern hilft: <a href="http://www.postfix.org/uce.html" target="_blank">UCE Controls</a>. Man sollte diese Regeln unbedingt ebenso konfigurieren, um einen maximalen Schutz zu erreichen. Nur sicher kann man sich nie sein :( Desweiteren sollte unbedingt ein Antivirenprogramm eingebunden sein. Hier wäre Amavis, AntivirMailgate oder andere Systeme anwendbar.
<p>
<table bgcolor="#DDDDFF" border="0" cellspacing="5">
<tr>
<td>
<code>
X-Virus-Scanned: by AMaViS 0.3.12pre8
</code>
</td>
</tr>
</table>
<p>oder<p>
<table bgcolor="#DDDDFF" border="0" cellspacing="5">
<tr>
<td>
<code>
X-AntiVirus: OK! AntiVir MailGate Version 2.0.0.7<br>
  at server has not found any known virus in this email.<br>
</code>
</td>
</tr>
</table>
</body>
</html>