$Id: README.AVP.de,v 1.5 2002/07/27 14:39:35 mjt Exp $

AVP von www.kaspersky-labs.com ist ein sehr guter Virenscanner. Aber -
wie ueblich - bleibt die Qualitaet der Implementation des Unix-Anteiles
hinter dieser hohen Qualitaet zurueck.

Standardmaessig laeuft AVP mit den Privilegien von "root" -- dies
widerspricht dem "principle of least privilege": Jedes Programm sollte
nur die minimalen, fuer seine Aufgabe erforderlichen Rechte und
Privilegien besitzen -- nicht mehr!

Wer garantiert, dass eine Software von der man den Quelltext nicht
kennt, korrekt programmiert ist?

Daher wird beim Einsatz von AVP mit avcheck gefordert, dass der AVP
daemon als unprivilegierter User im chroot Jail laeuft.

Dies mag einen initial groesseren Aufwand bedeuten, ist allerdings
besser als hinterher vor den Truemmern eines gehackten Systems zu
stehen.

Gluecklicherweise ist das kavdaemon Programm statisch gelinkt, sodass
es relativ einfach in ein chroot Gefaengnis zu "verbannen" ist.

Zuerst muss eine Gruppe "avgroup" mit zwei Benutzer "avdaemon" und
"avclient" erzeugt werden:

  groupadd avgroup
  useradd -g avgroup -d /non/existant -s /bin/false -c "AV Daemon" avdaemon
  useradd -g avgroup -d /non/existant -s /bin/false -c "AV Client" avclient

Dann muss das chroot-Gefaengnis Verzeichnis angelegt werden (wir gehen
davon aus, dass die umask von root auf 022 gesetzt ist!) und die von
kavdaemon benoetigten Devices dort angelegt werden:

  mkdir /var/spool/avp
  cd /var/spool/avp
  mkdir bases ctl tst tmp dev proc
  chown avdaemon:avgroup ctl
  chown avclient:avgroup tst
  chown avdaemon tmp
  chmod 750 tst ctl
  chmod 700 tmp
  cp -a /dev/null /dev/console dev/

Man kann dort auch einen zusaetzlichen /dev/log Eintrag erzeugen;
diese geschieht allerdings ueber eine separate Konfiguration von
syslogd (z.B. unter Linux wie folgt):

  syslogd -a /var/spool/avp/dev/log ... sontige Optionen ...

Was ist der Zweck der Verzeichnisse und Dateien in /var/spool/avp:

  /var/spool/avp:
    Das Wurzelverzeichnis fuer jegliche AVP Aktivitaet bzw. Dateien.
    Dieses Verzeichnis wird nur zur Installationszeit modifiziert,
    weder kavdaemon noch avcheck schreiben oder aendern Dateien hier.

  bases/:
    Hier werden die Antivirus Bases (Musterdateien) abgelegt.
    kavdaemon und avcheck benoetigen hier hoechstens Leserechte.
    Die Aufbewahrung der Musterdateien in einem Verzeichnis
    vereinfacht die Wartung ungemein. 
    
  ctl/ 
    Hier legt kavdaemon seinen Control Socket (AvpCtl) und seine
    PID Datei (AvpPid) an. Das Verzeichnis muss fuer avdaemon schreibbar
    sein und lesbar fuer avclient (Mitglied der Gruppe avgroup). Andere
    Benutzer duerfen keinerlei Zugriff haben, damit niemand sonst mit dem
    kavdaemon reden kann.

  tmp/  
    Hier ist nicht ganz klar, ob dieses Verzeichnis ueberhaupt
    benoetigt wird; allerdings koennte es vorkommen, dass dorthin
    von kavdaemon temporaerer Dateien geschrieben werden. Nur "avdaemon"
    sollte dorthin schreiben koennen.

  tst/
    Dies ist das Verzeichnis, in dem avcheck die zu testenden Dateien
    ablegt, wo sie dann von kavdaemon ueberprueft werden. Daraus folgt:
    schreibbar fuer avclient, lesbar fuer avdaemon. Andere Benutzer duerfen
    keinerlei Zugriff haben, damit niemand Mail mitlesen kann.

  proc/
    Diese Verzeichnis existiert nur um kavdaemon ruhigzustellen --
    ansonsten beklagt er sich bei jedem Start mit "unable to open
    /proc"!

Nun muss das Verzeichnis bases/ mit den aktuellen Musterdateien
gefuellt werden (root:root, mode 644 ist ausreichend), und der daemon
selber sowie seine Konfigurationsdateien in das /var/spool/avp
Verzeichnis kopiert werden.

Aenderungen an der kavdaemon Konfiguration
==========================================

Nicht vergessen: kavdaemon laeuft chrooted! Daher "sieht" er alle
Pfade, die mit "/var/spool/avp" beginnen, also ob sie mit "/"
begaennen -- d.h. alle Pfade muessen dementsprechend angepasst werden.

Es gibt zwei Konfigurationsdateien, die von kavdaemon verwendet
werden: defUnix.prf und AvpUnix.ini.  Kopieren Sie diese Dateien in
das chroot Verzeichnis (/var/spool/avp).
AvpUnix.ini enthaelt Grundeinstellungen wie Pfade und sollte
folgendermassen angepasst werde:

 KeysPath=/
 # die Datei AvpUnix.key muss nach /var/spool/avp/ kopiert werden
 BasePath=/bases 
 # dort liegen die Musterdateien

Als naechstes kommt die Datei defUnix.prf. Einige Werte muessen
modifiziert werden. Hier eine Liste der empfohlenen Aenderungen.
Hinweis: Das Format der Datei defUnix.prf aendert sich von Zeit zu
Zeit, und unterschiedliche Parameter koennen in unterschiedlichen
Teilen der Datei auftauchen. Bitte suchen Sie jeden Parameter in Ihrer
defUnix.prf Datei bevor Sie ihn aendern.

List=/tst 
# welche Objekte duerfen gescanned werden;
# Manchmal wird diese Einstellung von kavdaemon ignoriert, sodass man
# sie auf der Kommandozeile separat spezifizieren muss,

MailBases=No
# MailBases sind Dateien, in denen MS Exchange, MS Outlook usw. Mail
# ablegen, also ein proprietaeres Format. avcheck legt Mail in diesem
# Format niemals ab, also ist das ueberfluessig.
# Ausserdem gibt es einen Performance-Malus.

InfectedAction=0
# Sehr wichtig. Standardmaessig fragt kavdaemon, was mit der
# infizierten Datei passieren soll. avcheck muss aber nur wissen OB
# die Mail infiziert ist.
# Wird hier NICHT 0 spezifiziert, so beschwert sich avcheck mit 
# "unexpected avdaemon response code" -- und funktioniert nicht.

Warnings=No
# Dies soll verhindern, dass AVP Warnungen fuer falsche
# Positivmeldungen ausgibt. Wenn AVP einer Datei begegnet die AUSSIEHT
# wie ein Virus, wird eine Warnung generiert. Avcheck wird dann die
# Datei behandeln, als sei sie infiziert. Indem Sie diesen Parameter
# auf "No" setzen, verhindern Sie dies.  Bemerkung: Solch eine
# vermeintliche "falsche" Positivmeldung kann auch tatsaechlich wahr
# sein!

ShowOk=No
ShowPack=No
Report=No
# Wir wollen nicht mit tausenden von Meldungen im syslog ueberschuettet
# werden!
UseSysLog=No
# Falls /var/spool/avp/dev/log nicht existiert. Aber Vorsicht: Dieses
# Device kann nicht einfach mit touch oder mknod erzeugt werden; es muss
# an syslogd beim Start ein zusaetzlicher Parameter uebergeben werden.
# (s.o.)

Alle anderen Werte koennen uebernommen werden.

Nun muessen avcheck, das "infected" Script und "uchroot" irgendwohin
kopiert werde. Am einfachsten ist natuerlich /var/spool/avp!

Dann kann kavdaemon gestartet werden. Die nun folgende, sehr lange
Befehlszeile MUSS benutzt werden, damit die Umgebung korrekt gesetzt
ist:

  /usr/bin/env - HOME=/ \
  /usr/bin/nice \
  /var/spool/avp/uchroot -u avdaemon /var/spool/avp \
  /kavdaemon -dl -f=/ctl /tst

Man kann hier noch Limits auf die Resourcen (mit "ulimit") setzen.

Ein bisschen was zu den Optionen, die kavdaemon bietet (eine Uebersicht
erhaelt man mit `kavdaemon -?'):
  -dl d
  Logging abstellen. Ansonsten startet kavdaemon einen separaten
  Prozess fuers Logging.
  -f=/ctl
  Wo die AvpCtl und AvpPid Sockets/Dateien erzeugt werden.
  /tst
  Verzeichnis wo Dateien gescanned werden (Location.List option in defUnix.prf)

Nachdem kavdaemon laeuft, kann die Installation getestet werden:

 /var/spool/avp/uchroot -u avclient / \
 /var/spool/avp/avcheck -n -f root -d /var/spool/avp/./tst \
  -s avp:/var/spool/avp/ctl/AvpCtl root < eicar.msg

(Das Kommand uchroot wird so benutzt wie "su".)
Nun sollte das "infected" Skript gestartet werden. Stoesst avcheck auf
Probleme, wird nach stderr eine Fehlermedlung ausgegeben und avcheck
beendet sich mit dem Exit-Status EX_TEMPFAIL.

Um sicherzustellen, dass die Erkennung von Viren funktioniert, kann
das "infected" voruebergehend Script durch folgendes Skript
ausgetauscht werden:

  #! /bin/sh
  MAIL=$1 MSG="$2" FROM="$3"; shift 3
  echo "$MAIL (from $FROM, to $*) is infected:"
  echo "$MSG"
  rm -f $MAIL
  exit 0

Der Aufruf zum Testen sollte mit diesem "infected" Skript in etwa die
folgende Ausgabe liefern:

  /var/spool/avp/./tst/123.msg (from root, to root) is infected:
  infected by EICAR-Test-File

Nachdem dieser Test erfolgreich ist, kann das Mailsystem so
konfiguriert werden, das avcheck tatsaechlich genutzt wird.

Konsultieren sie das entsprechende README.

