\documentclass[a4paper,german,dvips]{article}
\usepackage{babel}
\usepackage{german}
\usepackage[T1]{fontenc}
\usepackage[dvips]{graphicx}
\usepackage[isolatin]{inputenc}

\begin{document}

\title{Postfix und avcheck}

\date{\today}

\author{codeblau GmbH\\
Ralf Hildebrandt {\tt hildeb@codeblau.de}}

\maketitle
\begin{abstract}
\noindent Dieses Dokument beschreibt die Einbindung von avcheck in einen Postfix Mailserver.
\newpage
\end{abstract}

\section*{Überblick}

avcheck mit Postfix zu nutzen ist relativ einfach.

Postfix besitzt seit dem 20000228 Release ein sog. {\tt content\_filter}
Feature. Grob gesagt erm"oglicht dieses Feature, die Mail durch
beliebige Programme zu bearbeiten (und somit z.B. nach
Schl"usselw"ortern zu suchen, Viren zu erkennen usw.)

Der {\tt content\_filter} ist in der Datei {\tt FILTER\_README} in der
Postfix Distribution dokumentiert.

Die avcheck zugrundeliegende Idee ist, da"s jede Mail, die von Postfix
bearbeitet wird, den {\tt content\_filter}-Transport passieren mu"s.
Dieser Filter prüft die Mail und, wenn kein Virus gefunden wird,
reinjiziert die Mail zur weiteren Zustellung erneut in Postfix hinein.
Natürlich mu"s dies auf einem Wege geschehen, der {\bf nicht} erneut der
Filterung unterworfen ist.

Damit wir nun avcheck mit Postfix nutzen koennen, mu"s zuallererst der
Antivirus Daemon installiert und gestartet werden.

\section*{"Anderungen in Postfix}
Danach müssen die folgenden "Anderungen in der Konfiguraton von
Postfix vornehmen.

In der Datei {\tt /etc/postfix/master.cf} müssen die folgenden Zeilen
eingefügt werden. Die hier gezeigten Kommentare dienen nur der
übersichtlichkeit:

\begin{small}
\begin{verbatim}
# =======================================================================
# service       type private unpriv chroot wakeup  maxproc command + args
#                    (yes)   (yes)  (yes)  (never) (50)
# =======================================================================

localhost:1025  inet n       -      n      -       -       smtpd -o content_filter=
\end{verbatim}
\end{small}
(Ja, das letzte Zeichen ist ein Gleichheitszeichen).

Man kann ganz einfach die schon vorhandene Zeile {\tt smtp inet ...
smtpd} kopieren und anpassen. Darüberhinaus kann man hier über {\tt
-o {\ldots}} z.B. spezielle {\tt smtpd\_.*\_restrictions}
spezifizieren, die unn"otige überprüfungen abschalten, z.B.:
{\tt -o smtpd\_recipient\_restrictions=permit\_mynetworks,reject}

Als n"achstes mu"s ein Transport {\tt avcheck} in der {\tt master.cf}
definiert werden. Wir zeigen hier den avcheck Aufruf für einen im
chroot-Jail laufenden {\tt kavdaemon}:

\begin{small}
\begin{verbatim}
# ==================================================================
# service  type private unpriv chroot wakeup  maxproc command + args
#               (yes)   (yes)  (yes)  (never) (50)
# ==================================================================
 avcheck   unix -       n      n      -       5      pipe
        flags=q user=avc argv=/var/spool/avp/avcheck
        -d /var/spool/avp/./tst -s AVP:/var/spool/avp/ctl/AvpCtl
	-f ${sender} -S :1025 -- ${recipient}
\end{verbatim}
\end{small}
(die letzten drei Zeilen {\bf müssen} mit einem Leerzeichen/Tabulator
anfangen: alle vier Zeilen bilden eigentlich eine logische Zeile,
sind aber der Lesbarkeit halber so umgebrochen worden!)

Bitte beachten Sie die Option {\tt -S :1025}: Sie gibt an, wie Mail ins
System reinjiziert werden kann, soda"s sie {\bf nicht} erneut gefiltert
wird. Hier handelt es sich um Port 1025 auf {\tt localhost}.

Man kann hier eine Option {\tt -t timeout} hinzufügen, welche eine obere
Schwelle für die Zeit angibt, die der Filter ben"otigen darf (in
Sekunden).
Hier ist es natürlich sinnvoll einen Wert anzugeben, der {\tt kleiner} ist
als Postfixs eingebautes globales {\tt command\_time\_limit} (bzw. ein
explizites {\tt avcheck\_time\_limit}, sollte es definiert worden sein).

Beachten Sie ausserdem das Limit von "5" für die Spalte {\tt maxproc}:
Maximal 5 {\tt avcheck}-Prozesse/Transports werden zu jeder Zeit
gleichzeitig laufen. Passen Sie diesen Parameter auf die
Leistungsf"ahigkeit Ihrer Maschine an! Dazu ist anzumerken, daß ein
Mailserver üblicherweise durch die Plattenbandbreite in seiner
Geschwindigkeit begrenzt wird. D.h. die CPU Last wird nicht das Problem sein.

Als n"achstes mu"s das Skript {\tt infected} auf die eigenen Bedürfnisse
angepasst werden. avcheck liefert mehrere verschiedne {\tt infected} Skripte
in verschiedenen Sprachen mit. Man kann 

\begin{verbatim}
  content_filter = avcheck
\end{verbatim}

in der {\tt /etc/postfix/main.cf} angeben. Dann wird {\bf alle} Mail, sogar lokal
via {\tt /usr/sbin/sendmail} generierte Mail dem {\tt content\_filter} unterworfen.

Oder man fügt:

\begin{verbatim}
  -o content_filter=avcheck
\end{verbatim}
  
der {\tt smtpd}-Zeile in der {\tt master.cf} hinzu:

\begin{verbatim}
 smtp inet  n - n - - smtpd -o content_filter=avcheck
\end{verbatim}

soda"s nur Mail, die über das Netzwerk auf Port 25 hereinkommt
gescannt wird. 

Nachdem alle "Anderungen vorgenommen wurden, mu"s

\begin{verbatim}
  postfix reload
\end{verbatim}

ausgeführt werden. Zum Testen mu"s nun eine Mail auf einem Pfad in
das Mailsystem geschickt werden, der der Filterung unterworfen ist und
w"ahrenddessen das Logfile beobachtet werden.

\section*{Tests}

Generell ist es immer ein guter Plan zu {\bf testen}, ob {\tt avcheck}
tats"achlich funktioniert: Am besten sollte man es manuell starten,
bevor man versucht, es über den {\tt content\_filter} in Postfix einzubinden.

Dazu siehe auch das andere README.

Dies mu"s natürlich unter derselben Userid ({\tt avc}) geschehen; man
pipe'd einfach eine ``saubere'' und eine ``infizierte'' Mail an {\tt
avcheck}.
Dies sollten funktionieren, bevor man es in Postfix einbaut.

W"ahrend der Testphase kann es Sinn machen, in der {\tt main.cf}

\begin{verbatim}
soft_bounce = yes
\end{verbatim}

zu setzen. So wird verhindert, da"s im Fehlerfall Mail gebounced wird.
\end{document}
