Sendmail mit Milter, AMaViS, Cyrus IMAP + SSL, Anti Spam

Marcus Schopen <marcus dot schopen at uni dash bielefeld dot de>

Original website !

A) Sendmail bauen (8.12.1)

1) Download

ftp.sendmail.org/pub/sendmail/sendmail.8.12.1.tar.gz und auspacken mit

$ tar -xvzf sendmail.8.12.1.tar.gz

2) Benutzer und Gruppe

$ groupadd smmsp
$ useradd smmsp


3) Milter Support konfigurieren:

Datei site.config.m4 im Verzeichnis devtools/Site anlegen:

touch devtools/Site/site.config.m4 anlegen
und in diese folgende Zeile einfügen:
APPENDDEF(`conf_sendmail_ENVDEF', `-DMILTER')
 

4) sendmail bauen

Im sendmail Sourcen Verzeichnis 

sh ./Build 

aufrufen. In der Ausgabe des Build-Prozess sollte gleich in einer der ersten Zeilen auftauchen folgende Zeile auftauchen:

"Including /download/sendmail-8.12.1/devtools/Site/site.config.m4"

Ist dies nicht der Fall, wurde die Datei site.config.m4 nicht beachtet. Überprüfen Sie noch einmal Schritt 3 und lesen Sie ggf. die README Datein in devtools/Site/ und libmilter/.


5) sendmail.mc  erstellen

Im Verzeichnis cf/cf die Datei cyrusproto.mc nach sendmail.mc kopieren:

cp generic-linux.mc sendmail.mc

und entsprechend anpassen. Als eigene Änderungen (rote Zeilen) wurden hier die features use_cw_file, virtusertable, mailertable und genericstable hinzugefügt. Die Unterstützung für Anti Spam mittels ORBZ (dazu später) und AMaViS können schon hier mit eingebaut werden.

Die sendmail.mc sollte nun so aussehen:

VERSIONID(`$Id: generic-linux.mc,v 8.1 1999/09/24 22:48:05 gshapiro Exp $')
OSTYPE(linux)dnl
DOMAIN(generic)dnl
define(`confSMTP_LOGIN_MSG', `Jura Mailserver; $b')
define(`confBIND_OPTS',`-DNSRCH -DEFNAMES')
define(`confLOCAL_MAILER', `cyrus')
FEATURE(`nocanonify')
FEATURE(`always_add_domain')

# eigene Änderungen 
FEATURE(`use_cw_file')
FEATURE(`virtusertable', `hash -o /etc/mail/virtusertable')
FEATURE(`mailertable')
FEATURE(`genericstable', `hash -o /etc/mail/genericstable')

# Anti Spam
FEATURE(dnsbl,`inputs.orbz.org')dnl

# AMaViS Milter
define(`_FFR_MILTER', `1')dnl
INPUT_MAIL_FILTER(`milter-amavis', `S=local:/var/amavis/amavis-milter.sock, T=S:10m;R:10m;E:10m')dnl

MAILER(local)dnl
MAILER(smtp)dnl
MAILER(`cyrus')

LOCAL_RULE_0
Rbb + $+ < @ $=w . > $#cyrusbb $: $1


Infos zu weiteren Features finden sich auf der Sendmail Seite unter http://www.sendmail.org/m4/readme.html

Um zu verhüllen, welchen MTA man benutzt, kann noch folgende Zeile hinzugefügt werden:

define(`confSMTP_LOGIN_MSG', `Jura Mailserver; $b')


6) sendmail.cf generieren und installieren

Im cf/cf/ Verzeichnis folgende Kommando ausführen:

sh Build sendmail.cf

Vor der Installation der neuen sendmail.cf sollte noch schnell ein Backup der alten sendmail.cf Konfiguration und des sendmail binarys erstellt werden.

Jetzt die neu generierte sendmail.cf und submit.cf aus dem cf/cf Verzeichnis nach /etc/mail/ kopieren:

sh Build install-cf

7) sendmail utils bauen:

In den Verzeichnissen makemap und mailstatus jeweils 

sh Build; sh Build install

aufrufen


8) sendmail installieren 

im source root Verzeichnis 

sh Build install

aufrufen.

9) libmilter installieren:

cd libmilter
sh ./Build
sh ./Build install

10) sendmail starten

/usr/sbin/sendmail -bd -q30m -om
WARNING: Xmilter-amavis: local socket name /var/amavis/amavis-milter.sock missing

Die Waring Ausgabe ist o.k., da wir ja noch keinen AMaViS Dämon installiert haben. Der Mailserver sollte sich jetzt dennoch schon folgendermaßen melden:

cornholio:# telnet localhost 25

Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 Jura ESMTP Mailserver; Tue, 16 Oct 2001 21:34:56 +0200

bzw. ganz normal mit

cornholio:# telnet localhost 25

Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 cornholio ESMTP Sendmail 8.12.1/8.12.1; Sat, 13 Oct 2001 17:40:45 +0200

wenn unter 5) die sendmail.mc ohne den Zusatz confSMTP_LOGIN_MSG erstellt wurde.

12) Sonsiges

War auf dem System bereits eine ältere sendmail Version installiert, sollte man vor einem Start des neuen sendmails die Mailertables genericstable, mailertable und virtusertable mit:

makemap hash file.db < file

neue erstellen.

Auf älteren Linux System z.B. SuSE 6.x muss noch die /etc/sendmail.cw nach /etc/mail/local-host-names kopiert werden. Dasselbe gilt auf für /etc/aliases. Sie muss in das Verzeichnis /etc/mail/ verschoben werden. Danach sollte aus dem /etc/ Verzeichnis ein symbolischer Link auf die aliases und aliaes.db im mail Verzeichnis gelegt werden:

ln -s /etc/mail/aliases /etc/aliases
ln -s /etc/mail/aliaes.db /etc/aliases.db

De aliases.db neue bauen:

cornholio:/ # newaliases

Das Verzeichnis /var/spool/mqueue sollte dem User root und der Gruppe daemon gehören.

Weiter Aufschlüsse gibt ein Blick in die /var/log/mail nach dem Start von sendmail.

 

B) Cyrus

Verabbemerkung: Cyrus und SASL müssen gegen dieselbe BerkeleyDB gebaut werden. Die BerkeleyDB muss mindestens in der Version 3.x 
vorliegen.

1) BerkeleyDB 3.x (http://www.sleepycat.com)

Überprüfen Sie vor der Installation, ob auf Ihrem System nicht bereits eine ausreichend aktuelle BerkeleyDB installiert ist (siehe usr/local/BerkeleyDB.3.x). Ist dies nicht der Fall, kann parallel zu der alten Datenbank eine 3.x installiert werden:

a) Download

lynx --source http://www.sleepycat.com/update/3.3.11/db-3.3.11.tar.gz > db-3.3.11.tar.gz

und auspacken:

tar -xvzf db-3.3.11.tar.gz

b) bauen und installieren

cd dist
configure; 
make;
make install

Den Pfad "/usr/local/BerkeleyDB.3.3/lib" in die "/etc/ld.so.config" eintragen und ldconfig aufrufen:

ldconfig -v

2) SASL (http://asg.web.cmu.edu/sasl/)

a) Download: ftp.andrew.cmu.edu/pub/cyrus-mail/cyrus-sasl-1.5.24.tar.gz

b) bauen und installieren mit Berkely 3.3 

cornholio:# env CPPFLAGS="-I/usr/local/BerkeleyDB.3.3/include" \
LDFLAGS="-L/usr/local/BerkeleyDB.3.3/lib -R/usr/local/BerkeleyDB.3.3/lib" \
./configure --with-dblib=berkeley 

Im Configure-Durchlauf sollte folgende Zeile auftauchen:

checking whether the C compiler (gcc -L/usr/local/BerkeleyDB.3.3/lib -R/usr/local/BerkeleyDB.3.3/lib) works... yes

Jetzt ganz normal bauen mit:

make
make install

Symlink von /usr/lib/sasl auf /usr/local/lib/sasl setzen:

ln -s /usr/local/lib/sasl /usr/lib/sasl

Den Pfad "/usr/local/lib/sasl" in die "/etc/ld.so.conf" eintragen und ldconfig aufrufen:

ldconfig -v

3) openssl (http://www.openssl.org)

Wir wollen unsere Mails später verschlüsselt abholen und benötigen daher openssl, um Cyrus mit SSL Support bauen zu können

a) Download

lynx --source http://www.openssl.org/source/openssl-0.9.6b.tar.gz > openssl-0.9.6b.tar.gz

b) bauen, testen und installieren

./config
make
make test
make install

Den Pfad "/usr/local/ssl/lib" in die "/etc/ld.so.conf" eintragen und ldconfig aufrufen:

ldconfig -v

4) Cyrus (http://asg.web.cmu.edu/cyrus/)

1) Download: ftp.andrew.cmu.edu/pub/cyrus-mail/cyrus-imapd-2.0.16.tar.gz

2) User für Cyrus anlegen

user cyrus in der Gruppe mail mit homedir /usr/cyrus anlegen:

useradd -d /usr/cyrus -g mail cyrus


3) Konfigurieren und bauen

configure --with-auth=unix --with-dbdir=/usr/local/BerkeleyDB.3.3\
--with-sasl=/usr/local/lib/sasl --with-openssl=/usr/local/ssl

make; make install


4) cyrus.conf

Die Datei /etc/cyrus.conf anlegen. Es kann die normal.conf aus master/conf verwendet werden:

# standard standalone server implementation

START {
   # do not delete these entries!
   mboxlist cmd="ctl_mboxlist -r"
   deliver cmd="ctl_deliver -r"

   # this is only necessary if using idled for IMAP IDLE
   # idled cmd="idled"
}

# UNIX sockets start with a slash and are put into /var/imap/socket
SERVICES {
   # add or remove based on preferences
   imap cmd="imapd" listen="imap" prefork=0
   imaps cmd="imapd -s" listen="imaps" prefork=0
   pop3 cmd="pop3d" listen="pop3" prefork=0
   pop3s cmd="pop3d -s" listen="pop3s" prefork=0
   sieve cmd="timsieved" listen="sieve" prefork=0

   # at least one LMTP is required for delivery
   # lmtp cmd="lmtpd" listen="lmtp" prefork=0
   lmtpunix cmd="lmtpd" listen="/var/imap/socket/lmtp" prefork=0
}

EVENTS {
   # this is required
   checkpoint cmd="ctl_mboxlist -c" period=30

   # this is only necessary if using duplicate delivery suppression
   delprune cmd="ctl_deliver -E 3" period=1440
}



5) imapd.conf

Die Datei /etc/cyrus.conf mit folgendem Inhalt anlegen.

configdirectory: /var/imap
partition-default: /var/spool/imap
admins: cyrus root
allowanonymouslogin: no
sasl_passwd_check: sasldb
tls_cert_file: /var/imap/server.pem
tls_key_file: /var/imap/server.pem

 

6) Verzeichnisse

Die Verzeichnisse /var/imap und /var/spool/imap anlegen und mit entsprechenden Rechten versehen:

cd /var
mkdir imap
chown cyrus imap
chgrp mail imap
chmod 750 imap
cd /var/spool
mkdir imap
chown cyrus imap
chgrp mail imap
chmod 750 imap

Als User cyrus den Rest mit "mkimp" aus dem tools Verzeichnis der cyrus sourcen erledigen lassen:

su cyrus
tools/mkimap
exit

7) /etc/services anpassen

pop3 110/tcp
imap 143/tcp
imsp 406/tcp
acap 674/tcp
imaps 993/tcp
pop3s 995/tcp
kpop 1109/tcp
sieve 2000/tcp
lmtp 2003/tcp
fud 4201/udp

In der "/etc/inetd.conf" pop3 und imap auskommentieren und den inted mit "killall -HUP inetd" neu starten

8) /etc/sasldb initialisieren

Als root "/usr/local/sbin/salspasswd cyrus" aufrufen und ein Password für cyrus setzen. Schlägt dies fehlt, liegt es wahrscheinlich daran, dass die Datei /etc/sasldb schon existiert. Die Datei mit "rm /etc/sasldb" löschen.
Die Rechte auf die generierte /etc/sasldb jetzt mit "chown cyrus:mail /etc/sasldb" ändern.

9) SSL key generieren:

Wir brauchen noch einen SSL key:

cornhoilio:/# /usr/local/ssl/bin/openssl req -new -x509 -nodes \
-out /var/imap/server.pem -keyout /var/imap/server.pem -days 365
Using configuration from /usr/local/ssl/openssl.cnf
Generating a 1024 bit RSA private key
.................................................++++++
............................++++++
writing new private key to '/var/imap/server.pem'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:DE
State or Province Name (full name) [Some-State]:Northrhein Westfalia
Locality Name (eg, city) []:Bielefeld
Organization Name (eg, company) [Internet Widgits Pty Ltd]:University of Bielefeld
Organizational Unit Name (eg, section) []:Faculty of Law
Common Name (eg, YOUR name) []:cornholio.jura.uni-bielefeld.de
Email Address []:marcus.schopen@uni-bielefeld.de

Der "Common Name" im vorletzten Punkt ist der Hostname des Servers und nicht der einer natürlichen Person.

10) master starten

/usr/cyrus/bin/master &


Der Master sollte sich so melden:

telnet localhost imap
cornholio:/var # telnet localhost imap
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
* OK cornholio Cyrus IMAP4 v2.0.16 server ready
". logout" um zur shell zurückzukehren

11) cyradm installieren:

Cyradm wird benötigt, um Cyrus zu administrieren

cd perl/imap

Vorab ist zu prüfen, ob die Pfade auf die ssllibs in Makefile.PL passen:

'LIBS' => ["$SASL_LIB -L/usr/local/ssl/lib -lssl -lcrypto"],

perl Makefile.PL
make
make install

12) IMAP User anlegen

Hierzu rufen wir als User cyrus den eben gebauten cyradm auf:

su - cyrus
cyrus@cornholio:~ > /usr/bin/cyradm localhost
Please enter your password:
localhost> createmailbox user.schoppa
localhost> listmailbox
user.schoppa
localhost> /usr/local/sbin/saslpasswd schoppa
Password:
Again (for verification):

Einen User wieder löschen:

setaclmailbox user.schoppa cyrusadm c
deletemailbox user.schoppa

13) Sonstiges

Der  SSL Support kann mit

imtest -t "" your.server.de

gestestet werden. Testen Sie auch, ob Sie z.B. mit Netscape im via SSL auf Ihren IMAP Server zugreifen können. Mit Outlook lässt sich auf verschlüsselt auf den POP3 von Cyrus zugreifen.

Desweiteren finden sich in der Dokumentation in den cyrus sourcen Anleitungen zur Anpassungen des Loggings im Syslog sowie das Setzen von Quotas auf die Cyrus Spool Verzeichnisse.

Das Verhalten des Cyrus kann mittels "tail -f /var/log/messages" oder "tail -f /var/log/mail" verfolgt werden. Wichtig ist auch, dass das Verzeichnis "/var/spool/imap/stage." dem User cyrus und der Gruppe mail gehört.

Auf der cyrus Homepage befindet sich ein Perl Script "user2cyrus.pl". Hiermit lassen sich sehr einfach alte UN*X Mailboxen ins IMAP Format konvertieren.


C) ANTI Spam Support für Sendmail:

Entsprechende Zeilen sind in der sendmail.mc hinzuzufügen. Danach muss die sendmail.cf wie oben beschrieben neu gebaut werden.

1) ORBZ (http://www.orbz.org)

FEATURE(dnsbl,`inputs.orbz.org')dnl

2) MAPS für blackhole, relay und dialup Liste (http://www.mail-abuse.org)

FEATURE(dnsbl,`blackholes.mail-abuse.org')dnl
FEATURE(dnsbl,`relays.mail-abuse.org'}dnl
FEATURE(dnsbl,`dialups.mail-abuse.org')dnl

Achtung: MAPS ist nun kostenpflichtig geworden.

Weitere Informationen zu den beiden ANTI-Spam Systemen finden Sie auf der jeweiligen Website.

 


D) ANTI Virus mit AMaViS (www.amavis.org)

1) benötigte Perl-Module

die Perl-Module mit cpan installieren ( http://www.cpan.org/modules/by-module/ )

# cpan
cpan> install Unix::Syslog
cpan> install Convert::UUlib
cpan> install Convert::TNEF
cpan> install Archive::Zip

2) Virenscannner

Wir installieren beispielhaft drei Scanner. Eine Übersicht gibt es auf http://www.amavis.org.

a) Sophos Anti-Virus (http://www.sophos.com/)

Auf der Homepage unter Download den "Sophos Anti-Virus for Unix" wählen und hier je nach System "Linux on Intel using libc5" oder "Linux on Intel using libc6".

Wir installieren Sophos ohne InterCheck Modus

tar -xvzf linux.intel.libc6.tar.z
cd sav-install
install -ni
./install

b) H+BEDV AntiVir fuer Linux und FreeBSD (http://www.antivir.de)

AntiVir fuer Linux ist bei einem ausschliesslich(!) privaten Einsatz kostenfrei. Sie können sich registrieren lassen und erhalten dann eine Lizenzdatei (hbedv.key) per eMail.

Auf der Homepage unter Download "AntiVir für Server" Linux source (avlxsrv.tgz)

tar -xvzf avlxsrv.tgz
cd antivir-6.10.00.01-linux-glibc
./install

Die Lizendatei "hbedv.key" in das Verzeichnis "/usr/lib/AntiVir" kopiert werden um von AntiVir gefunden zu werden.

c) McAfee VirusScan (http://www.nai.com)

Auf der Homepage unter "Download / Product Evaluations" - McAfee VirusScan for Unix Linux (4.14.0) herunterladen. Vor dem Auspacken ein eigendes Verzeichnis anlegen:

mkdir nai
mv vlnx414e.tar.z nai/
cd nai
tar -xvzf vlnx414e.tar.z

cornholio:/nai # ./install-uvscan
Which directory do you want to install into? [/usr/local/uvscan]
Uninstalling previous version ... done.
Do you want a link to uvscan placed in /usr/local/bin [y]/n y
Do you want a link to liblnxfv.so placed in /usr/local/lib [y]/n y
Do you want a link to uvscan.1 placed in /usr/local/man/man1 [y]/n y

Installation completed.

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

 

3) AMaViS bauen

a) Download: Snapshot von http://www.amavis.org/download.php3 (Dämon Version wählen) besorgen und auspacken.

b) Konfiguration

Grundsätzlich sollte es reichen, AMaViS folgendermaßen zu installieren:

./configure --enable-milter --with-warnrecip=yes

Die vorher installierten Virenscanner werden von AMaViS selbständig gefunden. Die Option " --enable-relay" braucht bei dieser Konfiguration nicht eingesetzt zu werden.

Wichtig ist, dass beim configure die milter libs (rot) gefunden werden:

...
checking for libmilter/mfapi.h... yes
checking for smfi_main in -lmilter... yes
We will use libmilter as the MTA
...

** Configuration summary for amavisd snapshot-20010714 2001-0714:

Install amavis daemon as: /usr/sbin/amavisd
Install amavis client as: /usr/sbin/amavis
Daemon config file: /etc/amavisd.conf
Path to socket: /var/amavis/amavisd.sock
Configured for use with: sendmail/libmilter
Use virus scanner(s): McAfee Virusscan
Scanner runs as: root
Logging to syslog: yes
Warn sender: yes
Warn recipient(s): no
Notify admin: yes
To accept the above, type "make"


Läuft das configure nur mit "Configured for use with: sendmail" durch, wurden die entsprechenden libs nicht gefunden:

checking for sm_errstring in -lsm... no
checking for libmilter/mfapi.h... no
We will use sendmail as the MTA

In diesem Fall kann folgende Lösung hilfreich sein:

a) Zunächst im sendmail-sourcen Verzeichnis mit "mkdir mylib" ein Unterverzeichnis mylib anlegen:

b) In dieses Verzeichnis wechseln und die folgenden symbolischen Links anlegen:

ln -s ../obj.linux.2.2.16.i686/libmilter/libmilter.a libmilter.a
libsm.a -> ../obj.linux.2.2.16.i686/libsm/libsm.a
libsmdb.a -> ../obj.linux.2.2.16.i686/libsmdb/libsmdb.a
libsmutil.a -> ../obj.linux.2.2.16.i686/libsmutil/libsmutil.a

Die exakte Position der Dateien hängt von der verwendeten Plattform ab.

c) Im AMaViS sourcen Verzeichnis zunächst den alten configure cache mit "rm config.cache" löschen.

d) Jetzt bauen wir AMaViS neu, aber jetzt direkt gegen das sendmail sourcen Verzeichnis:

LDFLAGS="-L/download/sendmail-8.12.1/mylib/" \
./configure --with-sendmail-source=/download/sendmail-8.12.1 \
--enable-milter --with-warnrecip=yes

Die Option --with-sendmail-source gibt an, wo configure die milter include Dateien finden kann.

Das vorangestellte LDFLAGS ist zum Auffinden der libs nötig.

Diesen Umweg musste ich z.B. auf einer SuSE 6.0, 6.1 und 7.1 gehen. Das configure sollte jetzt mit milter Funktionalität durchlaufen. Nun noch ein schnelles

make
make install

und AMaViS ist installiert.

4) AMaViS starten

rm -rf /var/amavis/amavis-milter.sock
nohup /usr/sbin/amavis-milter -p /var/amavis/amavis-milter.sock &
/usr/sbin/amavisd

Ein "ps -ax | grep amavis" sollte folgende Prozesse anzeigen:

27316 ? S N 0:04 /usr/sbin/amavis-milter -p /var/amavis/amavis-milter.sock
27320 ? S N 0:10 /usr/sbin/amavis-milter -p /var/amavis/amavis-milter.sock
27321 ? S N 0:00 /usr/sbin/amavis-milter -p /var/amavis/amavis-milter.sock
27322 ? S 0:01 perl -T /usr/sbin/amavisd

Zum Schluß sendmail noch einmal neu starten !

5) AMaViS testen

Auf der McAfee VirusScan Homepage (http://www.nai.com) befindet sich unter "Download / McAfee Anti-Virus Beta Program / Beta Utilities" das sog. EICAR Standard AntiVirus Test File.

Schicken Sie dieses Files als Attachment von einer externen Adresse auf einen lokalen Account. Ein "tail -f /var/log/mail" sollte im Maillog folgende Zeile anzeigen:

Oct 17 02:26:10 cornholio sendmail[26059]: f9H0Q77k026059: 
Milter add: header: X-Virus-Scanned: by amavisd-milter (http://amavis.org/

Diese besagt nur, dass die Mail von AMaViS nach Viren durchforstet wurde. 

Wurde aber wie in unserem Fall ein Virus gefunden erhält der Postmaster folgende Mail:

Subject: FOUND VIRUS IN MAIL from <marcus.schopen@uni-bielefeld.de>
   Date: Wed, 17 Oct 2001 02:26:07 +0200
   From: virusalert@cornholio.jura.uni-bielefeld.de
     To: virusalert@cornholio.jura.uni-bielefeld.de
A virus was found in an email from:

<marcus.schopen@uni-bielefeld.de>

The message was addressed to: 

-> <marcus@cornholio.jura.uni-bielefeld.de>

The message has been quarantined as:

/var/virusmails/virus-20011017-022601-26026

Here is the output of the scanner:

AntiVir/Linux Version 6.9.0.0, (Jun 25 2001, 14:09:18)
Copyright(c) 1994-2001 by H+BEDV Datentechnik GmbH

Loading /usr/lib/AntiVir/antivir.vdf ...

VDF version: 6.9.0.3 - FUP(0), created 07/31/2001

checking drive/path (list): /var/amavis/amavis-milter-XXa26023/parts
/var/amavis/amavis-milter-XXa26023/parts/part-00001
 Date: 17.10.2001  Time: 02:26:01  Size: 68
 VIRUS: file contains code of the virus 'Eicar-Test-Signatur'

----- scan results -----
 directories:        1
       files:        2
    infected:        1
    repaired:        0
     deleted:        0
     renamed:        0
   scan time: 00:00:01
--------------------------
Thank you for using AntiVir


Here are the headers:
....


Desweiteren erhalten der Absender und Empfänger (--with-warnrecip=yes) eine Benachrichtigung. Beides lässt sich im configure aber abstellen  Einfach mal "./configure --help" aufrufen.

 

6) Virensignaturen updaten

Damit die einzelnen Virenscanner aktuell bleiben, sollten man in regelmäßigen Abständen die neuesten Virenfiles von den Homepages der Hersteller laden und installieren. Dies lässt sich mit Hilfe einige Skripten automatisieren. Auf der Seite User Contributed Software von AMaViS gibt es hierzu noch einige weitere Progamme. Diese zwei von mir erstellten Skripten leisten seit geraumer Zeit zuverlässige Arbeit:

a) Update für Sophos Sweep:

#!/bin/sh
echo -e "From: root"
echo -e "To: admin@domain.de"
echo -e "Subject: Virus Update: Sophus\n"
cd /usr/local/sav/
lynx --source http://www.sophos.com/downloads/ide/ides.zip > ides.zip
unzip -o ides.zip

und folgender Eintrag in der /etc/crontab

0 6 * * * root /root/bin/virusupdate/sophos_update.sh | sendmail -t

um das Skipt z.B. täglich um 6:00 Uhr aufzurufen.


b) Update für McAfee VirusScan / NAI

Vor einem Download wird geprüft, ob überhaupt ein neues Update zur Verfügung gestellt wird. Nur in diesem Fall wird ein Download angestoßen.

#!/usr/bin/perl

# Stand: 11.02.2001 (Marcus Schopen)

$debug == 1; # 0 ohne Debug
$versionpath = "/usr/local/uvscan";
$versionfile = "$versionpath\/VERSION";

use Net::FTP;

# -- hier gibt's das Zeug
#
my $host = 'ftp.nai.com';
my $user = 'anonymous';
my $pass = 'me@home.com';
my $dir = '/pub/datfiles/english/';

# -- ein bisschen Fehlerabfang
#
my $ftp = Net::FTP->new($host) or 
die "Error connecting to $host: $!\n";
$ftp->login($user, $pass) or die "Error logging in to $host: $!\n";
my $ret = $ftp->pwd() or die "Error on pwd: $!\n";
$ftp->cwd($dir) or die "Error cd $dir: $!\n";
$ret = $ftp->dir() or die "Error on dir: $!\n";

my @dirs;
my @files;

# wir sondern die filename von den directory namen aus ...
#
foreach (@$ret) {
   chomp;
   next if length $_ < 39;
   my $filename = substr ($_, 39); 
   my $dir = substr ($_, 24, 5); 
   push @dirs, $filename if $dir eq '<DIR>';
   push @files, $filename if $dir ne '<DIR>';
}

print $files;

# ... sortieren alle gefundenen Filenamen.
#
my @sorted = sort @files;

# -- jetzt erst einaml die alte Version auslesen
#
if (-e $versionfile) {
   open(FILE, $versionfile);
   while (<FILE>) {
      chop;
      $old_version = $_;
   }
   close(FILE);
} else {
exit 0;
} 

# alle files durchlaufen und anhand von "dat-" untersuchen, ob es sich um
# ein dat-xxxx.tar" file handelt. Da die Liste sortiert ist, ist die letzte
# zutreffende if-Abfrage das dat-File mit hoechsten Nummer, also das
# aktuellste (geht bestimmt einfacher).
#
foreach (@sorted) { 
   ($name,$suffix) = split(/\./); 
   $is_dat = substr($name, 0, 4);

   if ($is_dat eq "dat-" && $suffix eq "tar") {

      ($trash, $version) = split(/\-/, $name);
   } 
}


# -- wir testen ob unsere Version noch aktuell ist. 
#
if ( $version > $old_version ) {
   $ftp->binary(); # konkretem binary Modus
   $ftp->get("dat-$version.tar","/usr/local/uvscan/dat-$version.tar");
   system("echo $version > $versionfile"); # neue Version wegschreiben
   chdir $versionpath; # ins DAT Verszeichnis wecheln
   system("tar -xf $versionpath/dat-$version\.tar");
}

open (MAIL, "|/usr/lib/sendmail -t") || die ("Error: opening sendmail:$!\n");
print MAIL "From: root\@cornholio.jura.uni-bielefeld.de\n";
print MAIL "To: marcus\@\n";
print MAIL "Subject: Virus Update: NAI\n\n";
print MAIL "update von Version $old_version auf $version\n";
close (MAIL);

if ($debug == 1) {
   print "Pfad: $versionpath\n";
   print "Versionsfile: $versionfile\n";
   print "files: @sorted\n";
   print "old version: $old_version\n";
   print "new version: $version";
}

# -- wir verabschieden uns
$ftp->quit;

exit 0;

Und folgender Eintrag in der /etc/crontab

0 6 * * * root /root/bin/virusupdate/nai_update.pl


Stand: 17.10.2001
Änderungen und freundliche Kritik an:  <marcus dot schopen at uni dash bielefeld dot de>