Spam- und Virenfilter für den Mailserver mit Spamassassin und ClamAV

Mailboxes

Nachdem wir ja letztes Mal die Grundkonfiguration des Mailservers abgeschlossen haben, gibt es heute zwei Extras, die nicht fehlen sollten. Und zwar Spam- und Virusfilter. Ersteres wird bei uns Spamassassin erledigen, die Viren überlassen wir dem freien Virenscanner ClamAV.

Zur Tat. Erst natürlich die benötigte Software installieren:
sudo apt-get install spamassassin spamc clamav clamav-daemon mutt cpio arj zoo nomarch lzop cabextract pax unrar lha

Wie ihr seht werden auch einige Packer/Entpacker mit installiert, damit ClamAV auch zum Beispiel zip-Archive prüfen kann.

Spamassassin einrichten

Dazu bearbeiten wir die Datei '/etc/spamassassin/local.cf' wiefolgt:

rewrite_header Subject ***SPAM***
Wenn diese Zeile aktiv ist wird in jeder Spam-Mail '***SPAM***' am Ende der Betreffzeile angehängt.
Diese Zeile bestimmt ab welchem Wert Mails als Spam markiert werden:
required_score 6.31
Ebenfalls de-kommentieren und den Wert entsprechend ändern. Falls zu viel Spam durchkommt sollte dieser Wert gegebenenfalls nach unten korrigiert werden, bzw. anders herum wenn zu viele reguläre Mails das Spam-Tag erhalten.
Diese beiden Zeilen sorgen dafür das der Bayessche Filter zum erkennen von Spam benutzt wird und dieser automatisch trainiert wird:
use_bayes 1
bayes_auto_learn 1

Um unseren Bayes-Filter nicht durch Header zu verwirren, die von anderen Mailservern (z.B. dem des Providers) oder unserem getmail angefügt wurden, werden diese durch die folgenden Zeilen ignoriert:
bayes_ignore_header X-Bogosity
bayes_ignore_header X-Spam-Flag
bayes_ignore_header X-Spam-Status
bayes_ignore_header X-getmail-filter-classifier

Danach muss Spamassassin noch aktiviert werden, dazu wird in der Datei '/etc/default/spamassassin', die Zeile "ENABLED=0" in "ENABLED=1" umgeschrieben.

Dann kann Spamassassin gestartet werden:
sudo /etc/init.d/spamassassin start

Jetzt müssen wir nur noch getmail sagen, das es Spamassassin die Mails zur Prüfung geben soll. Dazu fügen wir folgenden Absatz in die 'getmailrc' des jeweiligen Benutzers ein:
[filter-spamassassin]
type = Filter_external
path = /usr/bin/spamc
arguments = ("--max-size=100000", )

Beim nächsten Aufruf von getmail sollte dieses die empfangenen Mails durch Spamassassin checken lassen. Prüfen kann man das wiefolgt:
Mail an die entsprechende Mail-Adresse schicken, dann getmail als Benutzer (nicht als root) aufrufen:
getmail
Dann den Posteingang checken:
mutt -f /home/benutzer/mail
Dort sollte dann eine E-Mail liegen, die mit Enter aufgerufen wird. Im oberen Bereich sollten dann Zeilen ähnlich dieser gefunden werden:
X-Spam-Checker-Version: SpamAssassin 3.2.4 (2008-01-01) on server
Dann wurde alles richtig gemacht, ansonsten noch einmal alle Einstellungen checken, bzw das getmail-Log unter '/home/benutzer/.getmail/log'.

ClamAV einrichten

Da wir ClamAV oben schon mit installiert haben und er von sich aus schon eingerichtet ist, muss nur der folgende Abschnitt in die getmailrc des jeweiligen Benutzers eingefügt werden:
[filter-clamav]
type = Filter_classifier
path = /usr/bin/clamdscan
arguments = ("--stdout", "--no-summary", "-")
exitcodes_drop = (1, )

Damit werden Mails die Viren enthalten automatisch verworfen. Falls das nicht gewünscht ist und die Mails trotzdem zugestellt werden sollen (was ich nicht unbedingt empfehlen würde), muss die letzte Zeile so lauten:
exitcodes_keep = (0,1)

Damit wäre auch diese Einrichtung geschehen und es kann Spam- und Virenfrei ge-E-mailt werden.

Um die Mails in eurem Mail-Programm automatisch in den Spam-Ordner werfen zu lassen, müsst ihr dort einstellen das die Header von Spamassassin benutzt werden sollen. Wie das geht findet ihr in der Dokumentation eures jeweiligen Mailprogrammes.

Natürlich gilt auch hier wieder: Für etwaige Schäden, oder ähnliches was durch Benutzung dieses Tutorials geschehen sollte, übernehme ich keine Haftung. Das Setup habe ich selbst in Betrieb und es funktioniert. Schreibfehler sind aber natürlich nicht ausgeschlossen. Falls euch etwas auffällt bitte ich um eine kurze Nachricht, damit ich gegebenenfalls Korrekturen machen kann.

18 Gedanken zu „Spam- und Virenfilter für den Mailserver mit Spamassassin und ClamAV

  1. Torsten

    SpamAssassin finde ich von der Quote der gefundenen und false-positive Mails wirklich sehr gut. Aber ClamAV? Auch wenn er frei ist, aber die Qualität lässt wirklich zu wünschen übrig. Da haste ja nachher fast mehr Viren drin als vorher. 😉

  2. zero

    Ja, die Erkennungsrate von Clam ist nicht die beste, aber es fehlen definitiv freie Alternativen in diesem Bereich.
    Clam kommt hier aus drei Gründen zum Einsatz, erstens ist er offen, zweitens kostenlos und drittens und wichtigstens sehr einfach einzurichten (zumindest in diesem Setup)
    Und besser als kein Scanner ist es allemal… 🙂

  3. Chris

    ClamAV ist vollkommen OK. Man muss nur vorher mit Amavis alle E-Mails mit ausführbaren Dateianhänge direkt löschen lassen. Da hat man 99% erwischt und dann braucht ClamAV sich nur noch um verseuchte Office-Dokumente kümmern:

    $banned_filename_re = new_RE(
    qr’\.[a-zA-Z][a-zA-Z0-9]{0,3}\.(vbs|pif|scr|bat|com|exe|dll)$’i, # double extension
    qr’^\.(exe|lha|vbs|pif|scr|bat|com|dll|asd|asf|hlp|hta|ocx|cmd|do|reg|rm|js|jse|wsf|wsh|shb|shs|shm|vb|vbe|vxd|wmv|mpg|mp3|mpeg)$’i, # banned file(1) types
    qr’^message/partial$’i, qr’^message/external-body$’i, # rfc2046
    );

  4. Torsten

    Naja, wenn kaum noch etwas zum Scannen vorhanden ist, ist jeder Virenscanner super… Aber einfach alle ausführbaren Anhänge zu löschen ist ja auch nicht der Weisheit letzter Schluss.

  5. zero

    @Chris: Problem ist, das dieses Setup hier nicht über AMaViS läuft, sollte aber bestimmt auch über getmail direkt gehn (bzw über nen procmail oder sieve-filter)

    @Thorsten: Vielleicht nicht der Weisheit letzter Schluss, aber gängige Praxis bei so ziemlich allen Webmail-Anbietern

  6. Torsten

    Ok, vielleicht bei Webmail-Anbietern. Aber dort liegt vermutlich auch eine Angst vor Haftungsklagen o.ä. vor.
    Noch sicherer wäre es natürlich, wenn man _sämtliche_ Dateianhänge löscht und sich die Dateiinhalte am Telefon vorlesen lässt. xD

  7. zero

    Besser wär dann noch wenn der Mailserver, direkt nach dem löschen der Datei eine VoIP-Verbindung zwischen Sender und Empfänger aufbaut, damit man das direkt klären kann (0101100011010001001111011010010000111)…bin mal kurz Richtung Patentamt 😉

  8. kip

    Netter Beitrag. Der beste Spamkiller ist aber nicht SA, das ist Postfix selbst – mit ein wenig Hilfe von DNSBL (am Besten über policyd-weight). Damit muss man den Spam- und Virenmist nichtmal scannen, sondern verwirft das Zeugs schon vorher. Sparrt Ressourcen und ist meiner Erfahrung nach effektiver.

  9. zero

    @kip: Guter Einwurf, aber da die Mails hier per getmail und nicht über Postfix direkt reinkommen leider nicht praktikabel…

    Und bevor jetzt einer mit Greylisting kommt…tut es nicht!!!

  10. Chris

    @Thorsten: Wir nutzen diese strikte Amavis Regel im Unternehmen. Das hat uns schon vor so einigen Virenangriffen bewart. Der teure Kaspersky auf unserem Server hat nämlich so einige neue Viren erst viel zu spät erkannt.

    Die Antivirenhersteller kommen doch nicht mehr hinter den Virenschreibern hinterher, weil es täglich ein unglaubliche Vielzahl von neuen Variationen gibt.

  11. Der_Paul

    Servus,
    kann es sein, dass in der HowTo zum Clamav ein
    sudo /etc/init.d/clamav-daemon start
    Befehl fehlt? Ohne den Dienst zu starten mekert er über den ClamAV Filter.

  12. Peter

    Hallo.
    Du scheinst eine echte Gabe zu haben, etwas sehr gut und vor allem einfach zuerklären 🙂
    Auch ich habe ein Problem *meld*:
    Habe meinen Server auch mit Postfix und fetchmail aufgesetzt. Nun bekomme ich Emails, die zu meinen Postfächern versendet werden, dem User ‚peter‘ zugeteilt (/var/mail/peter). Wenn ich mir diese Datei anschaue, sind die Mails auch dort enthalten. Nun möchte ich mit Squirrelmail den Email-Verkehr über meine Webseite steuern, habe aber bislang nicht richtig herausgefunden, warum es nicht funktioniert. Der Imap-Server scheint nicht zu laufen, obwohl ich mich mit telnet auf dem Port (993 wars glaub ich) verbinden kann. Versenden und Empfangen geht einwandfrei (es sei denn, ich hab was „tot-konfiguriert“). Wenn ich mich via http://meineSeite/squirrelmail einloggen will, sagt er „Error connecting to IMAP server: tls://localhost.“ . Hast Du evtl eine Ahnung, was da falsch läuft? Das Beste wäre natürlich, wenn Du auch hierfür ein Tutorial schreiben würdest, was auch so schön beschrieben ist wie die vorigen 🙂 Wichtig: habe dynamische IP.
    Vielen Dank schon einmal für die Antwort.
    Viele Grüße
    Peter

  13. zero

    @Peter: kannst du dich mit einem Desktop E-Mail Client (Thunderbird etc) per IMAP auf dem Server einloggen?

  14. boni

    Hi,

    vielen Dank für die sehr gute Anletiung.
    Leider können die Mails nur noch mit dem jeweiligen Benutzer abgeholt werden und nicht mit dem in der vorherrigen Anleitung erstellten Script. Es kommt die Fehlermeldung Configuration error: refuse to invoke external commands as root by default.

    Kann man dies irgendwie umgehen?

    Danke !!

    Gruß boni

  15. boni

    Hallo,

    ich habe mein Problem lösen können. Mit dem Befehl allow_root_commands = yes in den jeweiligen Benutzer getmailrc.

    Jedoch steht in der Getmail Doku folgendes:

    Note that setting this option has serious security implications. Don’t use it if you don’t know what you’re doing. I strongly recommend against running external processes as root

    Was für gefahren bestehen nun? Gibt es eine Alternative?

Kommentare sind geschlossen.