Startseite

Personenprofil

Projekte

Material zu Linux

Aufbau eines Mail-Servers auf Sendmail-Basis mit Spam- und Viren-Filter unter Debian

Dieses Dokument befasst sich mit mit dem Aufbau eines Mail-Servers mit Spam- und Viren-Filterung. Die verwendete Linux-Distribution ist GNU/Debian, als Mail-Transport-Agent wird Sendmail verwendet. Große Teile dieses Dokumentes dürften auf anderen Systemen analog funktionieren.

Dieses Dokument ist urheberrechtlich geschützt. Copyright (c) 2004 - 2013 Dirk Prösdorf
Es ist erlaubt, dieses Dokument unter den Bedingungen der GNU Free Documentation License (GNU FDL), Version 1.1 oder jeder späteren Version, die von der Free Software Foundation veröffentlicht wird, zu kopieren, verbreiten und/oder verändern.
Die Original-Version der GNU FDL http://www.gnu.org/copyleft/fdl.html und eine inoffizielle Übersetzung.


Vorbemerkung

Die für den Aufbau des Mailservers verwendete Linux-Distribution "GNU/Debian" zeichnet sich sicherlich durch ihre Stabilität aus, hat aber auch den Nachteil, dass einige Software-Pakete doch etwas überaltert sind. Gerade bei der Spam- und Virenerkennung helfen einem aber zwei Jahre "ausgereifte" Versionen nicht weiter. Deshalb sollte für diese Aufgaben Backports verwendet werden.
Einen Überblick über sehr viele Backports für GNU/Debian gibt es unter http://www.apt-get.org.
Von mir selber aus dem Entwicklung-Zweig von GNU/Debian in die Stable-Version zurück portierte Versionen sind unter http://www.proesdorf.de/debian/ zu finden oder können alternativ mittels des folgenden Eintrags in /etc/apt/sources.list verwendet werden:
deb http://www.proesdorf.de/debian/ stable main contrib non-free
Es sollten aber nur die benötigten Backports installiert werden und nicht alle verfügbaren (wer ein so aktuelles System benötigt sollte evtl. zum "unstable" Zweig von GNU/Debian wechseln und sich der hierdurch entstehenden anderen Problemen bewusst sein).

System vorbereiten

Beim Scannen der Mails werden Mailanhänge temporär unter /tmp gespeichert und infizierte Mails unter /var/spool gespeichert. Damit bei einem größerem Virenaufkommen nicht das gesamte System wegen einer vollen Festplattenpartition zum Stillstand kommt, sollte für beide Bereiche eine eigene Partion angelegt werden. Hierbei dürften jeweils 1 GB pro Partion bei heutigen Festplattengrößen durchaus sinnvoll sein, wobei bei Verwendung von LVM die Größe relativ flexibel auch später noch den eigenen Gegebenheiten angepasst werden kann.

Sendmail installieren

Bei der Sendmail-Installation mittels apt-get install sendmail müssen einige Fragen zur lokalen Konfiguration beantwortet werden. Da die lokalen Gegebenheiten durchaus unterschiedlich sein können, kann hier nicht weiter auf diese Fragen eingegangen werden. (Evtl. erfolgt dies in einer späteren Version dieses Dokumentes.)
Unter /etc/mail befinden sich nun die Makro-Vorlagen sendmail.mc und submit.mc, die aus diesen erzeugten Konfigurationsdateien sendmail.cf und submit.cf, sowie weitere Dateien.

Spam filtern

SpamAssassin lässt sich über unterschiedliche Wege in einen Mailserver einbinden. Für kleinere Umgebungen reicht es durchaus, SpamAssassin direkt bei der Mailzustellung über Procmail aufzurufen. Hier soll aber der Weg über die Mail-Filter-Api "Milter" von Sendmail und die Dämon-Version von SpamAssassin ("spamd") beschrieben werden.

SpamAssassin installieren

Zuerst muss mittels apt-get install spamassassin spamc die aktuellen Backports von SpamAssassin und des Clients von "spamd" installiert werden. Alternativ kann auch von http://www.spamassassin.org/ der Source verwendet werden.

Aus Sicherheitsgründen sollte die Überprüfung der Mails nicht mit Root-Rechten statt finden. Deshalb sollte für Spamassassin ein eigener Account (ohne Loginmöglichkeit) angelegt werden.
Mittels adduser --system --group --disabled-login --no-create-home spamd wird der User "spamd" mit entsprechender Gruppe als Systemuser ohne Loginmöglichkeit und ohne eigenes Verzeichnis in GNU/Debian angelegt. Soll SpamAssassin um Razor und/oder Pyzor ergänzt werden (s.u.) dann muss der Aufruf adduser --system --group spamd lauten.

Als nächstes müssen einige Einstellungen in der vom Init-Script eingelesenen Datei /etc/default/spamassassin vorgenommen werden. Auf anderen Systemen als GNU/Debian muss das entsprechende Init-Script oder die dortige Konfigurationsdatei angepasst werden.

# Change to one to enable spamd
ENABLED=1

# Options
# See man spamd for possible options. The -d option is automatically added.
OPTIONS="-m 10 -u spamd --socketpath=/var/run/spamd.sock"

Die Option -m 10 legt fest, dass immer nur maximal 10 Kindprozesse gestartet werden, also maximal 10 Mails gleichzeitig von SpamAssassin überprüft werden. Welcher Wert hier der optimale ist, hängt stark davon ab, wieviel Mails das System parallel zu verarbeiten hat und welche Aufgaben dieses System sonst noch zu erledigen hat. Außerdem ist zu berücksichtigen, dass jedes System einen Maximalwert an zulässigen Kindprozessen hat (Linux i.a. 128).
Mittels der Option -u spamd wird festgelegt, dass das Programm "spamd" als User "spamd" ausgeführt wird.
Da Unix-Sockets schneller sind als IP-Sockets werden diese mittels der Option --socketpath=/var/run/spamd.sock aktiviert.

Weitergehende Informationen über die Startoptionen ist man 8 spamd zu entnehmen.

Da die Charakteristik von Spam einer ständigen Anpassung an die Spamerfilter unterliegt und somit die Spamfilter auch immer wieder angepasst werden müssen, sollte "SpamAssassin" regelmäßig auf die aktuelle Version aktualisiert werden.

SpamAssassin Milter Plugin installieren

Mittels apt-get install spamass-milter wird der aktuelle Backports von spamass-milter installiert. Alternativ kann auch der Source von http://savannah.nongnu.org/projects/spamass-milt/ verwendet werden.
Im Startscript (bzw. bei Debian in /etc/default/spamass-milter) können nun noch einige Startoptionen eingeben werden:

OPTIONS="-b postmaster@localhost -i 10.0.0.0/24 -- -U /var/run/spamd.sock"

Wenn eine als Spam erkannte Mail nicht an den Empfänger zugestellt werden soll, sondern an einen Admin weiter geleitet werden soll, dann muss OPTIONS um den Parameter -b <mailadresse> ergänzt werden.
Das lokale Netz (und damit die ausgehende Mail) kann mittels des Parameters -i <ip-adresse|netzwerk> aus der Überprüfung heraus genommen werden.
Über den Parameter -- werden die folgenden Optionen direkt an "spamc" übergeben, was hier dazu genutzt wird "spamc" mitzuteilen auf welchem Unix-Socket der SpamAssassin-Daemon lauscht.

Weitere Einstellungsmöglichkeiten wären z.B. die Option -m, die Verhindert das als Spam erkannte Mails verändert werden und die Option -p, die den verwendeten Unix-Socket angibt. Bei GNU/Debian ist im Init-Script der Socket /var/run/sendmail/spamass.sock voreingestellt.

Razor und/oder Pyzor integrieren

SpamAssassin bietet die Möglichkeit, mittels weiterer einzubindender Programme, Mails (bzw. der Signatur des Mailinhalts) gegen zentrale Datenbanken zu prüfen.

Mittels apt-get install razor wird das Programm Razor installiert. Als User 'spamd' muss noch einmal razor-admin -create aufgerufen werden, damit die Konfigurationsdateien erstellt werden. Nun wird Razor automatisch von SpamAssassin verwendet, kann aber auch dort deaktiviert werden.

Analog verläuft die Einbindung von Pyzor in SpamAssassin. Der Aufruf von apt-get install pyzor installiert Pyzor. Als User 'spamd' muss dann noch pyzor discover aufgerufen werden. SpamAssassin verwendet auch Pyzor sofort.

Bayes-Filter aktivieren

Beim einem Bayes'schen-Filter handelt es sich um einen lernenden Filter, der aufgrund der Einteilung der bisher empfangenen Mails in "Spam" und "Ham" statistisch die Wahrscheinlichkeit berechnet, ob es sich bei neuer Mail um erwünschte oder unerwünschte Mail handelt.
In SpamAssassin ist ab Version 2.50 ein Bayes'scher-Filter integriert, der automatisch aktiviert ist und alle Mails lernt, die relativ eindeutig Spam oder Ham sind. Die Ergebnisse werden in zwei Datenbanken im jeweiligen Home-Verzeichnis des Users gespeichert.
Bei der in diesem Text beschriebenen zentrallen Prüfung der Mails funktioniert dieses Konzept der dezentrallen Speicherung nicht, weshalb in der Konfigurationsdatei von SpamAssassin /etc/spamassassin/local.cf ein zentraler Speicherort angegeben werden muss:

bayes_path /home/spamd/bayes

Hierdurch werden nun die beiden Datenbanken "bayes_seen" und "bayes_toks" im Verzeichnis /home/spamd/ abgelegt. Dieses Verzeichnis ist insoweit hierfür sinnvoll, als dass SpamAssassin (wie oben angelegt) ja als User "spamd" ausgeführt wird und somit ein Verzeichnis benötigt, wo dieser User Schreibrechte hat.
Nach einem Aufruf von /etc/init.d/spamassassin reload werden nun diese Datenbanken gefüllt und sobald je 200 Spam- und Ham-Mails erfasst sind wird der Bayes-Filter von SpamAssassin mit zur Spamerkennung verwendet.

Test und Integration des Spam-Filters

Nun sollte die SpamAssassin-Installation mittels spamc -U /var/run/spamd.sock < /usr/share/doc/spamassassin/examples/sample-spam.txt getestet werden. Alternativ ist eine Testmail auch hier zu bekommen. Im Ergebnis sieht man auch, ob die evtl. Einbindung von Razor und/oder Pyzor funktioniert hat.

Für die Einbindung in "sendmail" muss in der Datei /etc/mail/sendmail.mc der folgende Eintrag zugefügt werden:

INPUT_MAIL_FILTER(`spamassassin', `S=local:/var/run/sendmail/spamass.sock, F=T, T=S:6m;R:6m;E:15m')dnl

Hierbei wird dem Namen des Mailfilters "spamassassin" die drei Werte "S", "F" und "T" übergeben.
Mit S wird der Socket festgelegt. Neben local (oder auch unix) für einen Unix-Socket kann dies auch noch inet für einen TCP-Socket sein. Wichtig ist, das der Socket identisch ist mit dem bei der Installation des SpamAssassin Milter Plugin angegebenen Socket.
Der Wert von F bestimmt, was mit einer Mail geschehen soll, wenn der Filter (aufgrund von Zeitüberschreitung, Programmabstürzen, Fehlkonfiguration, etc.) nicht erreichbar ist. Hier gibt es drei Möglichkeiten. Ein einfaches F= legt fest, dass die Mail dann zugestellt wird, während ein F=T dazu führt, dass die Mail bis zur Behebung des Problems nicht zugestellt wird und ein F=R weist die Mail komplett ab. Welche Methode verwendet wird, hängt stark von den lokalen Anforderungen an den jeweiligen Filter ab, sprich was ist wichtiger, schnelle Mailzustellung oder Spamschutz (bzw. Virenschutz). Persönlich favorisiere ich in Umgebungen, wo ich Probleme relativ schnell beseitigen kann, die zeitweilige Zurückstellung der Mails bei Problemen.
T bestimmt das Timeout eines Mailscans. Hierfür gibt es drei, mittels Semikolon getrennte, Einstellungen, die aus einem Dezimalwert und einem einzelnen Buchstaben (s für Sekunde und m für Minute) bestehen. "S" gibt den Timeout für das Senden einer Information vom MTA zum Filter an (Voreinstellung 10s), "R" für das Lesen der Antwort vom Filter (Voreinstellung 10s) und "E" den Gesamtzeitraum von Senden bis zur Antwort (Voreinstellung 5m). Welche Werte hier optimal sind hängt von der Leistungsfähigkeit des Server, der Anzahl der gleichzeitig zu bearbeitenden Mails und der Konfiguration ab. Mit obiger Einstellung ist es aber selbst dann, wenn der Server zugleich die Mails für mehrere Tage verarbeiten muss noch zu keinen Problemen gekommen.

Mittels des Aufrufes von make im Verzeichnis /etc/mail wird dann aus der sendmail.mc die sendmail.cf erzeugt. (Der manuelle Weg wäre m4 /etc/mail/sendmail.mc > /etc/mail/sendmail.cf.)

Viren filtern

Es gibt unterschiedliche Virenscanner für Linux und ebenso unterschiedliche Möglichkeiten diese in einen Mailserver einzubinden. Dieser Text beschreibt die Einbindung der Scan-Engine von "F-Prot" mittels "AMaViS - A Mail Virus Scanner".

Virenscanner F-Prot installieren

Mittels apt-get install f-prot-installer wird unter GNU/Debian ein Script installiert, dass dann die eigentlich Installation von "F-Prot" übernimmt. Hierbei werden einige weitere benötigte Programm-Pakete (libhtml-tree-perl libwww-perl unzip wget) mit installiert.
Bei der Installation von "F-Prot" sind die Lizenz-Bedingungen unter http://www.f-prot.com/ zu beachten. Dort ist auch eine "F-Prot" Linux-Version zu erhalten, wenn man den den Weg über den GNU/Debian-Installer nicht gehen kann oder möchte.

Ein Aufruf von f-prot -verno testet ob "F-Prot" erfolgreich installiert wurde. Mittels einer "eicar Anti-Virus Test-Datei", die unter http://www.eicar.org/anti_virus_test_file.htm zu finden ist, kann auch die Funktionsfähigkeit des Viren-Scanners überprüft werden.

AMaViS installieren

Damit Mails mit Attachments und diese wiederum mit unterschiedlich gepackten Dateien von AMaViS überprüft werden können, müssen diverse Programme installiert werden. Mittels apt-get install amavis-ng-milter-helper wird das Milter-Paket von AMaViS installiert. Dabei werden zusätzlich über Abhängigkeiten die Pakete amavis-ng, libconfig-inifiles-perl, libfile-mmagic-perl, libio-stringy-perl, libmailtools-perl, libmime-perl, libtimedate-perl und perl-suid mit installiert.
Nun müssen noch die Pakete der einzelnen Entpacker installiert werden. Mit apt-get install libconvert-tnef-perl libcompress-zlib-perl libarchive-tar-perl libarchive-zip-perl bzip2 arj nomarch gzip unzoo lha unrar werden alle unterstützten Entpacker installiert.
Die Projektseite von "AMaViS" ist unter http://sourceforge.net/projects/amavis zu finden. Dort ist auch der der Source von "amavis-ng" zu finden.

In der Konfigurationsdatei /etc/amavis-ng/amavis.conf müssen nun die benötigten Einstellungen vorgenommen werden. Hierbei können die meisten Vorgaben durch auskommentieren übernommen werden.

[global]

;; Which MTA to use. Specify one.

mail-transfer-agent = Milter

;; Which virus scanner to use. Use more than one if you desire

virus-scanner = FPROT

AMaViS soll über das Milter-Interface angesprochen werden und den Virenscanner "F-Prot" verwenden.

;; Extractor modules. 
;; "Mail" should definitely be used, it is used for decoding MIME
;; attachments
;;
;; It is not recommended to use the "Text" extractor any more.
;; Convert::UUlib is buggy and most of its work is done by
;; MIME::Parser (which is used by the "Mail" extractor) already.

;; This default setup uses only DFSG-free archivers
;extractors=Mail, GZIP, BZIP2, ARC, Zip, Tar, ZOO, TNEF, ARJ, COMPRESS

;; lha, rar, are DFSG-non-free and disabled by default.
extractors=Mail, GZIP, BZIP2, LHA, ARC, Zip, Tar, ZOO, RAR, TNEF, ARJ, COMPRESS

Die Voreinstellung sieht hier nur die Verwendung von Entpackern vor, die unter einer Open-Source Lizenz stehen. Hier sollte die zweite Einstellung verwendet werden, die auch mit "LHA" oder "RAR" gepackte Archive scannt.

;; Who should be notified?

; notifiers=Sender, Recipients, Admin
notifiers=Admin

Hier wird festgelegt, wer über Mails, die einen Virus beinhalten, informiert wird. In Zeiten, wo aktuelle Würmer wahllos Absender und Empfänger einer Mail aus dem Adressbuch zusammen bauen und somit die Absender- und Empfänger-Angaben einer Mail keine Aussagekraft haben, ist es unverantwortlich, automatische Mitteilungen an im Zweifelsfall unbeteiligte Dritte zu senden. Deshalb sollte diese Mitteilung alleine an den Administrator gehen (dessen E-Mail Adresse wird weiter unten eingegeben wird).

[MIME]

;; Ignore MIME message extracting errors?

ignore errors = no

;; What to do if such error occues?
;; freeze - default behaviour, message will be frozen
;; drop+notify - drop message, notify sender

error action = freeze

Beim Extrahieren einer Mail kann es zu Fehlern kommen. Hier wird angeben, was dann mit der Mail geschehen soll. Wenn ignore errors = yes angeben wird, wird solche Fehler ignoriert und diese Mail normal weiter verarbeitet. Ansonsten wird entweder die Mail nicht angenommen (error action = freeze) oder aber eingelagert und eine Mitteilung an den unter notifiers angegebenen Personenkreis gesendet (error action = drop+notify).
Hier ist die Erläuterung ";; drop+notify - drop message, notify sender" etwas irreführend, da der Source von "amavis-ng" eindeutig etwas anderes sagt.

[paths]

;; Where should mails be unpacked to?

unpack dir = /tmp/

;; Where should infected mail be stored? (Only the actual mail, not
;; the unpacked attachments)

quarantine dir = /var/spool/amavis-ng/quarantine

;; If problems occur, put message into this directory

problem dir = /var/spool/amavis-ng/problems

;; Should the unpacking directory be removed afterwards? Set to 'no'
;; only for debugging purposes

cleanup = yes

Wichtig ist hier, dass die angegebenen Verzeichnisse auch auf den separaten Partitionen liegen, wie sie unter Punkt System vorbereiten eingerichtet wurden.
Außerdem sollte darauf geachtet werden, dass diese Partitionen nicht irgend wann voll laufen, da bei entsprechender Virenbelastung doch einiges an Daten dort gespeichert wird.

[Logging]

;; Use syslog? Facility (e.g. mail|info) or "no"

syslog = mail
syslog loglevel = 3

;; Log to which file? And atwhat level?

logfile = /var/log/amavis-ng/amavis-ng.log
logfile loglevel = 7

"AMaViS" bietet zwei unterschiedliche Logging Möglichkeiten. Zum einen über über "syslog" und zum anderen über ein eigenes Logfile. So werden in obigen Beispiel alle Fehler-Meldungen an das Mail-Subsystem von "syslog" gesendet und alle Meldungen (Debug-Level) an das Logfile. Weitere Infos zum Logging sind man 3 syslog zu entnehmen.

[Notify]

;; Which domains should be considered local? Recipients are notified
;; about mail that was stopped only if they are local. The domain name
;; is matches against this Perl regular expression, case-insensitively

; local domain = .*example\.com

;; What address will appear in the From:-header of warning messages

mail from = amavis@localhost

;; Who is the mail admin? Comma separated list if multiple admins

admin = postmaster@localhost

Hier wird nun festgelegt, welches die E-Mail-Adresse des Admin ist, der die Virenmeldungen erhalten soll. Außerdem kann hier eine Absende-Adresse für diese Mails angegeben werden. Selbstverständlich kann "localhost" auch durch einen Fully Qualified Domain Name (FQDN) ersetzt werden, wobei "sendmail" entsprechend konfiguriert "localhost" beim versenden auch durch diesen ersetzt.

In den nächsten Abschnitten werden die Einstellungen für die unterschiedlichen Mailprogramme vorgenommen. Hier ist nur den Abschnitt über "Milter" relevant. Die Anderen bleiben auskommentiert und die Vorgaben für "Milter" können einfach durch auskommentieren übernommen werden.

[external]

;; Free (un)compression programs
bzip2 = /usr/bin/bzip2
arj = /usr/bin/arj
nomarch = /usr/bin/nomarch
gzip = /bin/gzip
unzoo = /usr/bin/unzoo

;; lha, unrar are non-free.
lha = /usr/bin/lha
unrar = /usr/bin/unrar

Da oben die Konfiguration der extractors um die Entpacker für "LHA" und "RAR" erweitert wurde müssen hier die Pfade eingebunden werden.

[security]

;; Resource limits for unpacking each message

;; How many levels of unpacking do we do?

maxlevels = 20

;; How many files do we want to write?

maxfiles = 1000

;; How much diskspace do we want to consume?

maxspace = 30M

;; If amavis is run as UID root, drop root privileges to uid, gid.

uid = amavis
gid = amavis

Die Security-Einstellungen können auch ohne Änderung übernommen werden, wobei aber die Werte für "maxlevels" und "maxfiles" auch etwas großzügig ausgefallen sind. Bei diesen Werten und dem Wert von "maxspace" geht es um den Schutz des Virenscanners vor Archiven wie "42.zip", einer "Entpackungsbombe (decompression bomb) die gepackt nur 42 KB groß ist und vollständig entpackt 256 TB.

Die übrigen Einstellungen beziehen sich auf den Aufruf des verwendeten Viren-Scanners. Hier ist nur noch die Einstellung von "F-Prot" zu aktivieren.

Abschließend muss nun nur noch mittels /etc/init.d/amavis-ng start "AMaViS" gestartet werden. Es lohnt sich dann auch mal einen Blick in das oben definierte Logfile /var/log/amavis-ng/amavis-ng.log zu werfen, ob auch alles funktioniert hat.

Integration des Viren-Filters

Für die Einbindung in "sendmail" muss in der Datei /etc/mail/sendmail.mc der folgende Eintrag zugefügt werden:

INPUT_MAIL_FILTER(`amavis', `S=local:/var/run/amavis-ng/socket.milter, F=T, T=S:6m;R:6m;E:15m')dnl

Bezüglich der Parameter gilt hier das Gleiche wie oben unter Test und Integration des Spam-Filters beschrieben.

Da "AMaViS" beim Senden einer Virus-Warnung einen leeren Sender-Envelope verwendet, erscheint in jeder Mail (und den Logfiles) der Hinweis "X-Authentication-Warning: mail.example.org: amavis set sender to <> using -f". Um dies zu vermeiden sollte "amavis" als "Trusted User" in "Sendmail" registriert werden.
Hierfür muss in der Datei /etc/mail/submit.mc die Auswertung der entsprechenden Datenbank mittels des folgenden Eintrags aktiviert werden:

FEATURE(`use_ct_file')dnl

Anschließend muss in der Datei /etc/mail/trusted-users nur noch der User "amavis" aufgenommen werden.

Abschließend muss noch im Verzeichnis /etc/mail make aufgerufen werden, damit aus den beiden Makro-Dateien die aktuellen Konfigurations-Dateien erzeugt werden.

Nun sollte mittels einer Test-Mail, die eine "eicar Anti-Virus Test-Datei" beinhaltet, noch einmal das gesamte System geprüft werden.

Update des Viren-Filters

Für das Update der Virensignaturen hat sich das folgende kleine Shell-Script bewährt, dass per Cronjob stündlich ausgeführt wird:

#!/bin/sh

if [ -x /usr/lib/f-prot/tools/check-updates ]; then
/usr/lib/f-prot/tools/check-updates -cron
fi

Der entsprechende Cron-Eintrag könnte wie folgt aussehen:

0   *   *   *   *   /root/bin/f-prot-update.sh

Druckversion