Mailserver 3 von 10: Virenprüfung mit ClamAV

Jahrelang habe ich mich davor gedrückt, doch endlich ist es geschafft - die Einrichtung eines eigenen Mailservers. In einer kleinen Artikelserie möchte ich einmal meine Erfahrungen und Konfigurationsschritte festhalten. Diese Serie basiert auf zahllosen Tutorials, Best Practices, Gesprächen mit Mailserver-Betreibern, aus endlosem Dokumentationen lesen und dem Wissen der Bücher "Postfix" von Kyle D. Dent und "Postfix - Einrichtung, Betrieb und Wartung" von Ralf Hildebrandt und Patrick Ben Koetter. Vielleicht werden sie ja nützlich für andere Leute sein, die das gleiche erreichen wollen.

Doch eines vorab: Die Einrichtung und der Betrieb eines Mailservers ist eine komplexe Sache. Klar, die Software lässt sich schnell installieren, doch fertig ist man danach noch lange nicht, wenn man ernsthaft damit arbeiten möchte.

Der Fahrplan der Artikelserie:

  1. Einleitung
  2. Mailempfang und Mailversand mit Dovecot und Postfix
  3. Virenprüfung mit ClamAV
  4. Mailsignatur mit OpenDKIM
  5. Spamprüfung mit SpamAssassin
  6. Mailabruf mit Dovecot
  7. Mailboxen konfigurieren mit mailconf.phs
  8. Mails synchronisieren mit mailsync.phs
  9. Mailqueue überwachen mit mailqueue.phs
  10. SpamAssassin anlernen mit maillearn.phs

Weiter geht es im wilden Abenteuer, eine eigene Mailserver-Infrastruktur aufzusetzen. Nachdem wir gestern den gesamten Mailversand und Mailempfang mit Hilfe von Dovecot und Postfix aufgesetzt haben, gehen wir es heute ein wenig ruhiger an und erweitern unseren Mailserver um eine Virenprüfung. Als Standard hat sich hier der offene Virenscanner ClamAV etabliert.

Leider gibt es jede Menge Tutorials im Internet, die für die Einbindung von Viren- und Spamscannern in den Mailserver das Tool Amavis vorsehen. Ja, das kann man so machen - in einer Konfiguration aus dem Jahre 2006, denn so lange ist dieses Vorgehen bei Postfix inzwischen veraltet. Amavis funktioniert, kurz zusammengefasst, so, dass eine zu prüfende E-Mail per SMTP an Amavis weitergeleitet wird. Amavis bindet dann die Scanner ein und bearbeitet die empfangene E-Mail. Abschließend wird diese wieder per SMTP an Postfix übergeben für die Zustellung.

Heutzutage verwendet man jedoch eher sogenannte Milter (Mail Filter). Dabei handelt es sich um Server, zu denen der Mailserver eine Verbindung aufbaut. Der Milter erhält vom Mailserver (Postfix) die Informationen zur jeweiligen E-Mail und kann die Weiterverarbeitung der E-Mail unterbinden oder anderweitig beeinflussen. Das sorgt für ein stark vereinfachtes Setup im Mailserver. Der von mir eingesetzte Virenscanner, der Spamscanner und die DKIM-Signierung beherrschen jeweils diese Milter-Technologie.

Als ersten Schritt sollten wir das notwendige Paket installieren. Danach werden wir wieder alles stoppen, bis wir mit der Konfiguration fertig sind:

1
2
3
4
5
6
7
8
9
10
sudo apt-get update

sudo apt-get install clamav-milter

sudo /etc/init.d/clamav-daemon stop
sudo /etc/init.d/clamav-freshclam stop
sudo /etc/init.d/clamav-milter stop

sudo /etc/init.d/dovecot stop
sudo /etc/init.d/postfix stop

Als nächstes sollten wir erst einmal die Virendatenbank von ClamAV aktualisieren. Im laufenden Betrieb wird das für uns der Dienst "clamav-freshclam" übernehmen. Initial sollte man dies jedoch durch folgenden Befehl tun:

1
sudo freshclam

Wie schon beim letzten Mal habe ich danach erst einmal die automatisch erzeugten Konfigurationdateien ein wenig aufgeräumt. Genauer gesagt werden drei Ordner angelegt, die ich nicht gebrauchen kann:

1
2
3
sudo rmdir /etc/clamav/onerrorexecute.d/
sudo rmdir /etc/clamav/onupdateexecute.d/
sudo rmdir /etc/clamav/virusevent.d/

Die Datei "/etc/clamav/freshclam.conf" müssen wir gar nicht anpassen. Diese steuert die automatisierte Aktualisierung der Virensignaturen.

Erst die Datei "/etc/clamav/clamd.conf" wird etwas interessanter. In dieser wird der eigentliche Virenscanner konfiguriert. Das Konzept sieht so aus, dass der Virenscanner permanent als Dienst läuft und Virenprüfungsanfragen erhalten kann. Der Milter wiederum erhält die Informationen vom Mailserver, reicht die zu prüfenden E-Mails an den Virenscanner weiter und verarbeitet das Ergebnis der Virenprüfung. Meine Konfiguration dort sieht wie folgt aus:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
TCPSocket 10021
TCPAddr   127.0.0.1

MaxFileSize     50M
StreamMaxLength 50M

#LocalSocket      /var/run/clamav/clamd.ctl
#FixStaleSocket   true
#LocalSocketGroup clamav
#LocalSocketMode  666

# TemporaryDirectory is not set to its default /tmp here to make overriding
# the default with environment variables TMPDIR/TMP/TEMP possible

User clamav

AllowSupplementaryGroups false
ScanMail true
ScanArchive true
ArchiveBlockEncrypted false
MaxDirectoryRecursion 15
FollowDirectorySymlinks false
FollowFileSymlinks false
ReadTimeout 180
MaxThreads 12
MaxConnectionQueueLength 15
LogSyslog false
LogRotate true
LogFacility LOG_LOCAL6
LogClean false
LogVerbose false
PidFile /var/run/clamav/clamd.pid
DatabaseDirectory /var/lib/clamav
OfficialDatabaseOnly false
SelfCheck 3600
Foreground false
Debug false
ScanPE true
MaxEmbeddedPE 10M
ScanOLE2 true
ScanPDF true
ScanHTML true
MaxHTMLNormalize 10M
MaxHTMLNoTags 2M
MaxScriptNormalize 5M
MaxZipTypeRcg 1M
ScanSWF true
DetectBrokenExecutables false
ExitOnOOM false
LeaveTemporaryFiles false
AlgorithmicDetection true
ScanELF true
IdleTimeout 30
CrossFilesystems true
PhishingSignatures true
PhishingScanURLs true
PhishingAlwaysBlockSSLMismatch false
PhishingAlwaysBlockCloak false
PartitionIntersection false
DetectPUA false
ScanPartialMessages false
HeuristicScanPrecedence false
StructuredDataDetection false
CommandReadTimeout 5
SendBufTimeout 200
MaxQueue 100
ExtendedDetectionInfo true
OLE2BlockMacros false
ScanOnAccess false
AllowAllMatchScan true
ForceToDisk false
DisableCertCheck false
DisableCache false
MaxScanSize 100M
MaxRecursion 10
MaxFiles 10000
MaxPartitions 50
MaxIconsPE 100
StatsEnabled false
StatsPEDisabled true
StatsHostID auto
StatsTimeout 10
LogFile /var/log/clamav/clamav.log
LogTime true
LogFileUnlock false
LogFileMaxSize 0
Bytecode true
BytecodeSecurity TrustSigned
BytecodeTimeout 60000

Den Großteil der Konfiguration habe ich gelassen, wie er ist. Lediglich ein paar Anpassungen habe ich vorgenommen. Diese sind hier kurz beschrieben:

  • TCPSocket und TCPAddr: Wir sorgen dafür, dass der ClamAV-Daemon über die Adresse "localhost:10021" erreichbar ist. Üblicherweise wird ein Unix-Socket verwendet, doch TCP/IP macht uns im späteren Verlauf das Leben leichter.
  • MaxFileSize und StreamMaxLength: Da wir Mails bis zu einer Größe von 50MiB annehmen wollen, müssen wir natürlich auch entsprechende große Dateien auf Viren überprüfen können.
  • LocalSocket, FixStaleSocket, LocalSocketGroup und LocalSocketMode: Da wir TCP/IP für die Verbindung zum ClamAV-Daemon verwenden werden, können wir die Konfiguration für den Unix-Socket auskommentieren.

Nun muss noch der ClamAV-Milter in der Datei "/etc/clamav/clamav-milter.conf" konfiguriert werden. Auch hier habe ich einen Teil der Konfiguration unverändert gelassen:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
MilterSocket inet:10020@127.0.0.1
ClamdSocket  tcp:127.0.0.1:10021

OnClean    Accept
OnInfected Accept
OnFail     Accept

MaxFileSize 50M

ReportHostname <send.example.com>

#FixStaleSocket    true
#MilterSocketGroup clamav
#MilterSocketMode  666

User clamav

AllowSupplementaryGroups true
ReadTimeout 120
Foreground false
PidFile /var/run/clamav/clamav-milter.pid
AddHeader Replace
LogSyslog false
LogFacility LOG_LOCAL6
LogVerbose false
LogInfected Off
LogClean Off
LogRotate true
SupportMultipleRecipients false
TemporaryDirectory /tmp
LogFile /var/log/clamav/clamav-milter.log
LogTime true
LogFileUnlock false
LogFileMaxSize 1M

Hier ein paar Erklärungen:

  • MilterSocket: Wir sorgen dafür, dass der ClamAV-Milter via TCP/IP unter der Adresse "localhost:10020" erreichbar ist. Dies müssen wir anschließend in Postfix einkonfigurieren.
  • ClamdSocket: Wir geben dem ClamAV-Milter bekannt, unter welcher Adresse er den ClamAV-Daemon ansprechen kann.
  • OnClean, OnInfected und OnFail: Wir definieren, dass Mails - auch mit Viren - immer akzeptiert werden sollen. Es wird lediglich ein entsprechender Header eingefügt.
  • MaxFileSize: Da wir die Größe von verarbeiteten Mails auf 50MiB erhöht haben, müssen wir das auch hier einstellen.
  • ReportHostname: Im Mail-Header, der vom Virenscanner geschrieben wird, ist der Hostname des Servers enthalten. Diesen sollten wir auf unseren extern bekannten Hostnamen ändern.
  • FixStaleSocket, MilterSocketGroup und MilterSocketMode: Da wir TCP/IP für die Verbindung zum ClamAV-Milter verwenden werden, können wir die Konfiguration für den Unix-Socket auskommentieren.

Nun müssen wir den ClamAV-Milter nur noch in Postfix bekannt machen. Dazu öffnen wir die Datei "/etc/postfix/main.cf" und ändern folgende Konfigurationseinstellungen ab:

1
2
smtpd_milters     = inet:127.0.0.1:10020
non_smtpd_milters = inet:127.0.0.1:10020

Damit ist die vollständige Integration abgeschlossen und ihr könnt die einzelnen Dienste wieder starten. Ich mache es immer so, dass ich erst die Milter und erst danach den eigentlichen Mailserver starte:

1
2
3
4
5
6
sudo /etc/init.d/clamav-daemon start
sudo /etc/init.d/clamav-freshclam start
sudo /etc/init.d/clamav-milter start

sudo /etc/init.d/dovecot start
sudo /etc/init.d/postfix start

Was ihr nun tun könnt, ist, euch einfach mal testhalber selbst eine Mail zuzusenden. Im Quelltext der entsprechenden E-Mail sollten sich folgende Header finden lassen:

1
2
X-Virus-Scanned: clamav-milter 0.98.4 at send.example.com
X-Virus-Status: Clean

Um den Virenscanner noch weiter zu testen, könnt ihr euch einmal eine Textdatei zuschicken, in der der EICAR-Testvirus enthalten ist. In diesem Fall sollten sich stattdessen folgende Header in der empfangenen E-Mail finden lassen:

1
2
X-Virus-Scanned: clamav-milter 0.98.4 at send.example.com
X-Virus-Status: Infected (Eicar-Test-Signature)

Ist das der Fall? Dann herzlichen Glückwunsch! Du hast gerade erfolgreich einen Virenscanner in deinen Mailserver eingebunden und dieses Setup auf seine Funktion hin getestet. 🙂

Im nächsten Artikel werden wir ein bisschen was für unsere Reputation als Mailserver tun und anfangen, verschickte Mails mit DKIM zu signieren. Da wir dann sowieso dabei sind, werden wir uns in diesem Schritt auch um das Thema SPF kümmern.

Update:
Sören hat mich freundlicherweise darauf hingewiesen, dass der Parameter natürlich "ReportHostname" und nicht "ReportedHostname" heißt. 🙂

Update:
@cheatha hat mich darauf hingewiesen, dass der ClamAV-Daemon wohl nicht auf den TCPsocket-Konfigurationswert reagiert, wenn man Debian mit systemd nutzt. Es gibt einen Workaround und zukünftig auch einen Fix. (Das ist kein Problem mit der hier gezeigten Konfiguration, trotzdem fand ich es sinnvoll, die Information hier mit bereitzustellen.)

Virenfreie Grüße, Kenny

P.S.: In der aktuellen Konfiguration werden sowohl empfangene, als auch versandte E-Mails auf Viren überprüft. Solltet ihr ausgehende E-Mails nicht prüfen wollen, könnt ihr in der "/etc/postfix/master.cf" die Dienste "submission" und "smtps" wie folgt abändern und so die Ausführung des Milters verhindern:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
submission inet n       -       -       -       -       smtpd
  -o smtpd_milters=
  -o myhostname=<submit.example.com>
  -o smtpd_tls_cert_file=/etc/postfix/tls/<submit_example_com>.crt
  -o smtpd_tls_key_file=/etc/postfix/tls/<submit_example_com>.key
  -o syslog_name=postfix/submission
  -o smtpd_tls_security_level=encrypt
  -o smtpd_client_restrictions=permit_sasl_authenticated,reject
  -o milter_macro_daemon_name=ORIGINATING
smtps     inet  n       -       -       -       -       smtpd
  -o smtpd_milters=
  -o myhostname=<submit.example.com>
  -o smtpd_tls_cert_file=/etc/postfix/tls/<submit_example_com>.crt
  -o smtpd_tls_key_file=/etc/postfix/tls/<submit_example_com>.key
  -o syslog_name=postfix/smtps
  -o smtpd_tls_wrappermode=yes
  -o smtpd_client_restrictions=permit_sasl_authenticated,reject
  -o milter_macro_daemon_name=ORIGINATING

Ich persönlich lasse auch ausgehende E-Mails scannen. Ich persönlich sehe darin kein Problem und auch Dienste wie GMX tun dies automatisch.

2 Kommentare » Schreibe einen Kommentar

  1. Bei der Einrichtung unter "Debian Wheezy" und "clamav-milter 0.98.5" muss ich in der "/etc/clamav/clamav-milter.conf" nicht die Option "ReportedHostname" sondern "ReportHostname" verwenden. Andernfalls bekomme ich beim start die Fehlermeldung, dass die Option nicht bekannt sei.

    • Gerade nochmal in meine eigene Live-Konfig geguckt und Tatsache. Das war eine der letzten Änderungen, die ich gemacht hatte. Die hatte ich wahrscheinlich händisch in den Artikel nachgetragen. Danke für den Hinweis. Ist angepasst. 🙂

Schreibe einen Kommentar

Um Ihnen beim weiteren Kommentieren auf dieser Webseite die erneute Eingabe Ihrer Daten zu ersparen, wird beim Absenden Ihres Kommentars ein Cookie an Ihren Browser gesendet und von diesem gespeichert. Mit dem Absenden eines Kommentars auf dieser Webseite stimmen Sie der Speicherung und Übertragung dieses Cookies explizit zu.

Pflichtfelder sind mit * markiert.