0x1b - ESCAPE
HTML PDF Postscript
 sendmail 

Sendmail in seiner aktuellen Version 8.11.x ist ein sehr umfangreicher MTA der nahezu all seine Schwächen aus der 8.9er Zeiten abgelegt hat. Leider liefern ihn viele Distributionen ohne die möglichen Features aus oder bauen ihn so um, dass er nicht mehr der allgemeinen Doskumentation im Web entspricht.

Obwohl ich Debian GNU/Linux verwende, installiere ich sendmail auf Mailservern von Hand. Damit bekomme ich folgende Features:

  • TLS - SSL-Verschlüsselung
  • Authentication - angemeldete Benutzer dürfen Relayen
  • Virus Scanner
  • Einbindung der diversen Relay Block Lists
  • Universelles Filter auf Headers und Content

Folgend ein kurzes Kochbuch, mit dem ich sendmail installiere:

Pakete

Vorab installiere ich einige Pakete, die für den späteren Compilierlauf nötig sind. Auf nicht Debian Systemen müssen diese meist von Hand installiert werden - das dauert oftmals länger als die Installation einer Debian ;-)

apt-get install libsasl-bin libsasl-modules libsasl-dev libsasl7 \
    sfio1999 sfio-dev libldap2 libldap2-dev libssl0.9.6 libssl09-dev \
    libdb2 libdb2-dev libdb2-util \
    lha unarj rar unrar zoo

ACHTUNG: Diese Pakete sind erst auf Debian Woody vorhanden - ältere Installationen müssen updated werden oder cyrus-sasl, sfio-1999 und allenfalls openssl von Hand installiert werden.

vi /usr/lib/sasl/Sendmail.conf

cd /usr/include
ln -s sfio/sfio.h
ln -s sfio/sfio_t.h
ln -s sfio/ast_common.h .

Leider fehlt Debian der arc - ich habe kurzerhand ein eigenes Paket gebaut.

dpkg -i arc_5.21-1_i386.deb

Perl

Für die libmilter und AMaViS brauchen wir Perl mit speziellen Modulen. Ich möchte klar von Debian's Perl unabhängig sein und installieren mein eigenes:

cd /usr/src
wget http://www.cpan.org/src/stable.tar.gz

tar xvfz stable.tar.gz
cd perl-5.6.1
sh Configure -ds -e -Dprefix=/opt -Dusethreads
make
make install
(cd /opt/bin; mv perl perl-thread)
(cd /opt/bin; mv perl5.6.1 perl5.6.1-thread)

cd /usr/src
rm -Rf perl-5.6.1
tar xvfz stable.tar.gz
cd perl-5.6.1
./configure.gnu --prefix=/opt
make
make install
make suidperl
cp suidperl /opt/bin
chmod u+s /opt/bin/suidperl

cd /usr/local/bin
ln -s /opt/bin/perl .
ln -s /opt/bin/suidperl .
ln -s /opt/bin/perl-thread .

cd /opt/bin
vi cpan

Uninstall sendmail

Der allenfalls bestehende sendmail muss deinstalliert werden. Um Debian zu befriedigen, muss ein Dummy Paket installiert werden:

cd /usr/src
vi mta.ctl
equivs-build mta.ctl
dpkg -P --force-depends sendmail
rm /etc/mail/*
dpkg -i /usr/src/mta-dummy_1.0_all.deb

sendmail

Nun kommt der eigentliche sendmail:

cd /usr/src
wget ftp://ftp.sendmail.org/pub/sendmail/sendmail.8.11.6.tar.gz
tar xvfz sendmail.8.11.6.tar.gz
ln -s sendmail-8.11.6/ sendmail
cd sendmail/devtools/Site
vi site.config.m4
cd ../..
./Build
cd libmilter
./Build
cd ../..

Falls die Compilation abbricht, so fehlen meist librarys oder deren -dev Paket. Dieses muss dann nachinstalliert und mit make ein neuer Versuch im sendmail-Verzeichnis gestartet werden.

Nun können wir den sendmail installieren:

cd /usr/src/sendmail
make install

mkdir /var/spool/mqueue
mkdir /var/spool/mqueue/df
mkdir /var/spool/mqueue/qf
mkdir /var/spool/mqueue/xf

mkdir -p /usr/adm/sm.bin
cd /usr/adm/sm.bin
ln -s /usr/bin/procmail .
ln -s /usr/bin/vacation .
ln -s /usr/bin/wmf .
cd

vi /etc/init.d/sendmail
update-rc.d sendmail defaults

cd /etc
rm aliases
ln -sf mail/aliases .

ln -s /usr/sbin/sendmail /usr/lib/sendmail
ln -s /usr/sbin/sendmail /usr/bin/sendmail

Auf meinem Fido Gateway gebe ich sendmail einen zusätzlichen Mailer:

cp /usr/share/sendmail.cf/mailer/ftn.m4 /usr/src/sendmail/cf/mailer

Sendmail::Milter

Sendmail::Milter ist ein Perlmodul das einem in jedem Schritt innerhalb des sendmails erlaubt, eine Perlroutine einzuklinken. Ich verwende ihn, um universelles Filtern über die Headers oder den Body einer Mail zu machen.

cd /usr/src
tar xvfz Sendmail-Milter-0.17.tar.gz
cd Sendmail-Milter-0.17
/opt/bin/perl-thread Makefile.PL ../sendmail ../sendmail/obj.*
make

Leider weiss Sendmail::Milter nichts von der libsfio, mit der wir sendmail gelinkt haben. Daher werfen wir das letzte Kommando aus dem Makelauf nochmals von Hand an, und fügen -lsfio hinzu:

LD_RUN_PATH="/usr/src/Sendmail-Milter-0.17/../sendmail/obj.*/libmilter\
  :/usr/src/Sendmail-Milter-0.17/../sendmail/obj.*/libsmutil:/lib" \
  cc  -shared -L/usr/local/lib Milter.o intpools.o callbacks.o  -o \
  blib/arch/auto/Sendmail/Milter/Milter.so \
  -L/usr/src/Sendmail-Milter-0.17/../sendmail/obj.*/libmilter \
  -L/usr/src/Sendmail-Milter-0.17/../sendmail/obj.*/libsmutil \
  -lmilter -lsmutil -lpthread -lnsl -lsfio
                                    ^^^^^^

make test
make install

uvscan

uvscan ist ein Bestandteil des kommerziellen Virenscanners von NAI - besser bekannt unter dem alten Namen McAfee. Wir installieren ab CD-ROM:

mount /cdrom
mkdir mcafee
cd mcafee
tar xvfz /cdrom/Netshld/Unix/Linux/vlnx412l.tar.Z
./install-uvscan

Which directory do you want to install into? [/usr/local/uvscan] /opt/uvscan
/opt/uvscan doesn't exist. Create it? [y]/n 
Do you want a link to uvscan placed in /usr/local/bin [y]/n n
Do you want a link to liblnxfv.so placed in /usr/local/lib [y]/n n
Do you want a link to uvscan.1 placed in /usr/local/man/man1 [y]/n n

Installation completed.

Do you want to perform a scan of all filesystems y/[n] n

uvscan benötigt eine shared library, die wir nicht automatisch im ldpath haben und verbeisst sich des öftern an grossen Zips. Ich habe deshalb einen Wrapper um uvscan geschrieben:

vi /opt/bin/uvscan
chmod a+x uvscan

Der Scanner kann nun gestestet werden:

uvscan EICAR.COM
uvscan 42.zip

AMaViS

AmAViS ist ein Wrapper zwischen MTA und Virenscanner. Er packt decodiert UUCODE und Mime, packt diverse Archive aus und startet den Scanner über die Files. Die Doku auf der Webseite ist leider ziemlich alt - das Programm sieht grundlegend anders aus als in der Doku beschrieben...

cpan
install Bundle::libnet
install MD5
install Unix::Syslog
install Convert::UUlib
install Convert::TNEF
install Compress::Zlib
install Archive::Tar
install N/NE/NEDKONZ/Archive-Zip-0.11.tar.gz
install G/GB/GBARR/MailTools-1.15.tar.gz

cd /usr/src
wget http://www.amavis.org/dist/perl/amavis-perl-11.tar.gz
tar xvfz amavis-perl-11.tar.gz 
cd amavis-perl-11

vi amavis/amavis-milter.c      <- Change #define AMAVIS_PERL_PATH to
                                   "/opt/amavis/sbin/amavis"

LDFLAGS="-L /usr/src/sendmail/obj.*/libsmutil \
  -L/usr/src/sendmail/obj.*/libmilter" LIBS=-lsfio
./configure \
  --prefix=/opt/amavis --with-perl=/opt/bin/perl \
  --with-sendmail-source=/usr/src/sendmail --enable-milter --enable-syslog \
  --with-maxlevel=2 --enable-credits \
  --with-runtime-dir=/opt/amavis/var/amavis \
  --with-logdir=/opt/amavis/var/log \
  --with-virusdir=/opt/amavis/var/virusmails
make
make install

configure muss folgenden Output zeigen:


  Install amavis as:          /opt/amavis/sbin/amavis
  Configured for use with:    sendmail/libmilter
  Use virus scanner(s):       McAfee Virusscan
  Scanner runs as:            root
  Logging to syslog:          yes
  Quarantine directory:       /opt/amavis/var/virusmails
  Max. recursion depth:       2
  Add X-Virus-Scanned header: yes
  Display AMaViS credits:     yes 
  Warn sender:                yes
  Reports sent to:            virusalert
  Reports sent by:            postmaster

Ich hatte lange Probleme mit dem check der libmilter - muss muss für den configure-Script erreichbar sein.

Sigfile und Engine-Update

Die auf der AMaViS Wesite angeboteten Updatescripts funktionieren entweder nur teilweise bzw. gar nicht :-( Mein eigenes checkt über die "richtigen" Weg, ob die Searchengine und das Signaturfile verändert wurde und schickt den Output an den virusalert:

cd /opt/amavis
mkdir bin tmp
cd bin
vi update.pl
./update.pl

crontab -e

#
# Update NAI Scanner
10 7 * * * /opt/amavis/bin/update.pl 2>&1 | mail -s "NAI Update" virusalert

myfilter.pl

myfilter.pl ist ein eigenes Script das den Mailheader und Body nach beliebigen Regular expressions scannt und dann entscheidet, ob der sendmail die Mail annehmen, temporär oder fix rejecten oder einfach fortwerfen soll. Ich verwende es, um einem Spammer das Leben schwer zu machen:

cd /etc/mail
vi myfilter.pl
vi myfilter.conf
mkdir /var/lib/myfilter
mkdir /var/lib/myfilter/DISCARD
mkdir /var/lib/myfilter/REJECT 
mkdir /var/lib/myfilter/TEMPFAIL

Konfiguration

Nun geht's an's Eingemachte - die Konfiguration des sendmails. Ich zeige hier eine generische Konfiguration, die sich problemlos erweitern lassen sollte.

/etc/mail/Makefile
/etc/mail/README	-> /usr/src/sendmail/cf/README
/etc/mail/access
/etc/mail/aliases
/etc/mail/domaintable
/etc/mail/genericstable
/etc/mail/local-host-names
/etc/mail/mailertable
/etc/mail/sendmail.mc
/etc/mail/trusted-users
/etc/mail/virtusertable

Ein make in /etc/mail erstellt alle nötigen Files neu. ACHTUNG: ein allfällig laufender sendmail muss mit killall -HUP sendmail neu gestartet werden, wenn an local-host-names oder sendmail.mc etwas geändert wurde.

Relaytest

MAPS bietet einen hübschen Service, mit dem man die Relayfestigkeit seines Servers testen kann. Dazu muss vom Mailserver her folgender Befehl eingegeben werden:

telnet relay-test.mail-abuse.org