| This content in english |

Debian Squeeze - Mailrelay mit Amavis und Clamav

Ziel

Es soll ein Mailserver installiert werden, der E-Mails für die eigene Domain annimmt und an einen weiteren Server im Intranet weiterleitet. Weil dieser Server die E-Mails weiterleiten soll, ist es erforderlich, dass der Name der eigenen Domain, wie sie im Internet vorkommt, nicht(!) bei mydomain = meindomainname.de angegeben wird. Deswegen steht hier in den Beispieldateien domainname.local. Postfix wird E-Mails an die Stelle, welche nach mydomain genannt ist, nicht weiterleiten, sondern versuchen, die E-Mails lokal auf diesem Server zuzustellen. Die Domain, für welche die E-Mails weitergeleitet werden, wird hier am Ende in der main.cf bei relay_domains genannt.

Die Benutzerinnen und Benutzer rufen von diesem zweiten Computer ihre E-Mails mit einem Mailclient ab.

Verwendet habe ich Debian Squeeze in der Grundinstallation mit Postfix. Das genügt, um die E-Mails anzunehmen und weiter zu leiten. Zusätzlich sind installiert: Amavis, Clamav, Freshclam, Spamassassin.

Als Quellen dienen außerdem Netzwerkspiegel die Non-free-Software, die Sicherheits-Aktualisierungen und die Volatile-Aktualisierungen.

Die Konfigurationsdateien enthalten jeweils alle Eintragungen des fertigen Systems. Ein Neustart eines betroffenen Dienstes würde eine Fehlermeldung auslösen, wenn nicht alle Punkte abgearbeitet sind. Man kann also konsequent erst alles eintragen, alle Kommandos in bezug auf Dateien, Berechtigungen etc. abarbeiten und am Ende die betreffenden Dienste oder den Computer neu starten.

Schema der Geräte

www --->
<---
Server des Providers
für die
Weiterleitung
ins www
--->
<---
eigene Windows-Domäne
hier im Beispiel
domainname.local
+ Debian-Mailrelay
+ Mail-Scanner
+ Mailserver für Client-Programm
--->
<---
Workstations/
Clientcomputer/
Terminalserver
mit einem
E-Mail-Client-Programm

Durchführung

Postfix installieren

Das Programm Postfix wird installiert und eine Komponente (postfix-pcre [PCRE map support für Postfix]), mit der es möglich wird, eine Datei auszulesen, worin die Merkmale/Endungen zurückzuweisender Dateitypen aufgeführt sind (*.com, *.exe). Mehr dazu weiter unten bei Mime-Header-Checks.

Eingabe:

# apt-get install postfix postfix-pcre
Bei der Auswahl Internet-Site wählen.

Datei /etc/postfix/main.cf

Dies hier ist die Datei mit den hinzugefügten Änderungen, markiert mit Fettdruck. Erläuterungen sind teilweise in der Datei, teilweise im Text dieser Anleitung.

# See /usr/share/postfix/main.cf.dist for a commented, more complete version

# Debian specific: Specifying a file name will cause the first
# line of that file to be used as the name. The Debian default
# is /etc/mailname.
#myorigin = /etc/mailname
content_filter = smtp-amavis:[127.0.0.1]:10024
smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU)
biff = no

# appending .domain is the MUA's job.
append_dot_mydomain = no

# Uncomment the next line to generate "delayed mail" warnings
#delay_warning_time = 4h

readme_directory = no

# TLS parameters
smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
smtpd_use_tls=yes
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache

# See /usr/share/doc/postfix/TLS_README.gz in the postfix-doc package for
# information on enabling SSL in the smtp client.

# deaktivere myhostname, verwende mydomain, main.cf ist flexibler einsetzbar
# darf dann auf verschiedene Rechner kopiert werden.
# Postfix holt sich myhostname selbst aus dem System.
#myhostname = hostname.domainname.local
mydomain = domainname.local
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
# aendere myorigin, damit Datei flexibler eingesetzt und
# auf anderen Rechner kopiert werden kann
#myorigin = /etc/mailname
myorigin = $mydomain
# geaendert wurde mydestination - letzte Bestimmung der E-Mails
#mydestination = hostname.domainname.local, localhost.domainname.local, , localhost
mydestination = $mydomain
$myhostname
relayhost = [ip-adresse des weiterleitenden mailservers beim Provider mit Klammern]
mynetworks = ipadresse des internen mailservers für die Clients ohne Klammern/32,
127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
mailbox_command = procmail -a "$EXTENSION"
mailbox_size_limit = 0
recipient_delimiter = +
smtp_recipient_restrictions = permit_mynetworks,
permit_mx_backup,
reject_unauth_destination
check_recipient_access hash:/etc/postfix/roleaccount_exceptions
# naechste Zeile - Dateianhaenge pruefen
mime_header_checks = pcre:/etc/postfix/mime_header_checks
inet_interfaces = all
transport_maps = hash:/etc/postfix/transport
unknown_local_recipient_reject_code = 550
# für diese Domain werden die E-Mails angenommen
relay_domains = domainname.de
# naechstes Kommando ruft eine Liste von Adressen auf, fuer welche
# E-Mails angenommen werden. Alle anderen werden erst gar nicht gescannt,
# sondern gleich zurückgewiesen.
relay_recipients_maps = hash:/etc/postfix/relay_recipients

Datei /etc/postfix/master.cf

E-Mails kommen bei Postfix an, werden an Amavis übergeben (smtp-amavis), gescannt und dann wieder an Postfix (localhost...) übergeben, wo sie nicht noch einmal gescannt werden. Deswegen ist der Eintrag nach content_filter = leer, ebenso sind andere Regelungen deaktiviert. Amavis hat die E-Mail bereits durchsucht.

# Ausschnitt Anfang

# ==========================================================================
# service type private unpriv chroot wakeup maxproc command + args
# (yes) (yes) (yes) (never) (100)
# ==========================================================================
smtp inet n - - - - smtpd
localhost:10025 inet n - n - - smtpd
-o content_filter=
-o local_recipient_maps=
-o relay_recipient_maps=
-o smtpd_restriction_classes=
-o smtpd_delay_reject=no
-o smtpd_client_restrictions=permit_mynetworks,reject
-o smtpd_helo_restrictions=
-o smtpd_sender_restrictions=
-o smtpd_recipient_restrictions=permit_mynetworks,reject
-o smtpd_data_restrictions=reject_unauth_pipelining
-o smtpd_end_of_data_restrictions=
-o mynetworks=127.0.0.0/8
-o smtpd_error_sleep_time=0
-o smtpd_soft_error_limit=1001
-o smtpd_hard_error_limit=1000
-o smtpd_client_connection_count_limit=0
-o smtpd_client_connection_rate_limit=0
-o receive_override_options=no_header_body_checks,no_unknown_recipient_checks
smtp-amavis unix - - n - 2 smtp
-o smtp_data_done_timeout=1800
-o disable_dns_lookups=yes

#submission inet n - - - - smtpd

# Ausschnitt Ende

Transporteintrag erstellen und einbinden

Postfix soll wissen, an welchen internen Mailserver es die E-Mails weiterleiten soll. Hier wird der Domainname (domainname.de) angegeben, wie er im Internet vorkommt.

Eingabe:
# touch /etc/postfix/transport

Inhalt in der ersten Zeile der Datei:

domainname.de smtp:[ip-adresse]

Die Klammern [ ] müssen mit in der Datei stehen.

Wenn das System an andere interne Mailrelays Nachrichten verschicken soll, werden diese in gleicher Weise eingetragen. Für jedes Mailrelay eine Zeile.

domainname.de smtp:[ip-adresse]
noch-eine-domain.de smtp:[noch-eine-ipadresse]

Einbinden der Transportdatei; das System erstellt eine transport.db.

Eingabe:

# postmap hash:/etc/postfix/transport

Mime-Header-Checks vorbereiten

Das System soll Dateianhänge auf untersuchen und gegebenenfalls nicht durchlassen.

Eingabe (wenn nicht schon oben erfolgt):

# apt-get install postfix-pcre

Mime-Header-Checks - Datei mit betreffenden Merkmalen einrichten

Eingabe:

# touch /etc/postfix/mime_header_checks

/etc/postfix/mime_header_checks - Inhalt der Datei

# Datei im E-Mail-Anhang - wegen ihrer Endung blockiert
# Hier wird nur das Schema gezeigt.
# Die Liste der Endungen kann erweitert werden.
# Einzelne Endungen durch pipe trennen.
/name="?(.*)\.(bat|com|exe)"$/ \
REJECT Aus Sicherheitsgruenden abgewiesen $1.$2

Amavis installieren

Eingabe:

# apt-get install amavisd-new

Die Konfiguration ist auf mehrere Dateien verteilt.

Amavis - Ort der Log-Datei ändern

Datei ändern: /etc/amavis/conf.d/20-debian-defaults

Der Ort, an welchem die Logdatei gespeichert werden soll, wird geändert, um eine bessere Übersicht zu gewinnen. Sonst erscheinen alle Meldungen in /var/log/syslog. Von Nachteil ist, dass alles in eine Amavis-Log-Datei geschrieben wird, und dass ich im Moment nicht weiß, wie ich erreiche, dass wöchentlich oder gar täglich eine neue Logdatei angelegt wird. Versuche führten bisher dazu, dass auf die neue Log-Datei nicht zugegriffen werden konnte. Diese Änderung des Speicherortes der Log-Datei kann man auslassen. Syslog wird automatisch rotiert.

# Anfang Ausschnitt
$QUARANTINEDIR = "$MYHOME/virusmails";
$quarantine_subdir_levels = 1; # enable quarantine dir hashing
$log_recip_templ = undef; # disable by-recipient level-0 log entries
$DO_SYSLOG = 0; # log via syslogd (preferred)
# Syslog deaktiviert mit 0 und Pfad für die Log-Datei geaendert
$LOGFILE = "/var/log/amavis/amavis.log"; # Pfad geaendert
# Ausschnitt Ende

Amavis-Log-Verzeichnis und Berechtigungen einrichten

Nur ausführen, wenn der Pfad für die Logdatei auf /var/log/amavis/amavis.log geändert wurde.

Eingabe

# cd /var/log
# mkdir amavis
# chown amavis:amavis amavis
# chmod 750 amavis

Amavis - Umgang mit Spammails festlegen

Datei ändern: /etc/amavis/conf.d/20-debian-defaults

Die Einstellung hier lässt Spammails durch, verzeichnet es in der Log-Datei und kopiert die Spammail in einen der Ordner unter /var/lib/amavis/virusmails.

Ausschnitt Anfang

$final_virus_destiny = D_DISCARD; # (data not lost, see virus quarantine)
$final_banned_destiny = D_BOUNCE; # D_REJECT when front-end MTA
#$final_spam_destiny = D_BOUNCE; # deaktiviert und umgestellt; erst Log-Daten pruefen
$final_spam_destiny = D_PASS; # Spam durchlassen, vgl. Log-Datei
$final_bad_header_destiny = D_PASS # False-positive prone (for spam)

#$virus_admin = "postmaster\@$mydomain"; # due to D_DISCARD default
### naechste Zeilen/Kommandos eingefuegt. Das System soll Benachrichtigungen
### verschicken, wenn eine E-Mail zum Beispiel wegen eines Virus
### nicht zugestellt wird.
### Mit den Standardeinstellungen gibt es im Log den Fehler
### (!)Failed to notify admin
#$banned_admin = "postmaster\@$mydomain";
### Hier also drei geaenderte/neu erstellte Eintraege
$virus_admin = "email\@domain.de";
$banned_admin = "email\@domain.de";
$mailfrom_notify_admin = "email\@domain.de";

Ausschnitt Ende

Anmerkung: Inzwischen sind tatsächlich Benachrichtigungen über geblockte E-Mails an die Adresse email-at-domain.de verschickt worden.

Amavis - Decoder installieren

Amavis soll in die Lage versetzt werden, den Inhalt der Dateien prüfen zu können.

Eingabe:

# apt-get install arc arj bzip2 cabextract freeze lha lzop nomarch pax rpm unrar-free zoo

Amavis - Socket ändern

/etc/amavis/conf.d/15-av_scanner

Für die Zusammanarbeit mit Amavis diese Änderung vornehmen.

von
\&ask_daemon, ["CONTSCAN {}\n", "/var/run/clamav/clamd.ctl "],

in
\&ask_daemon, ["CONTSCAN {}\n", "/tmp/clamav.socket"],
<

Amavis - Contentfilterung einrichten

/etc/amavis/conf.d/15-content-filter-mode

Rauten entfernen bei:

@bypass_virus_checks_maps = (
\%bypass_virus_checks, \@bypass_virus_checks_acl, \$bypass_virus_checks_re);

und

@bypass_spam_checks_maps = (
\%bypass_spam_checks, \@bypass_spam_checks_acl, \$bypass_spam_checks_re);

Clamav installieren

Eingabe:

# apt-get install clamav-daemon

/etc/clamav/clamd.conf

Änderungen:

LocalSocket /tmp/clamav.socket
[...]
User amavis

...und (um nach einem Upgrade auf clamav 0.96 ein Problem zu vermeiden.)

von: LocalSocketGroup clamav

in: LocalSocketGroup amavis

Clamav - Gruppenzugehörigkeit clamav zu amavis ändern

Eingabe:

# addgroup clamav amavis

Weitere Berechtigungen ändern; amavis erhält Rechte für verschiedene Ordner;
Eingabe:

# chown -R amavis:amavis /var/lib/clamav
# chown -R amavis:amavis /var/log/clamav
# chown -R amavis:amavis /var/run/clamav

Wegen dieser Meldung, die nach einem Neustart der Dienste erschien
Can't open/parse the config file /etc/clamav/freshclam.conf
bzw.
Can't open/parse the config file /etc/clamav/clamd.conf
müssen weitere Berechtigungen eingestellt werden.

Eingabe:

# cd /etc/clamav
# chown amavis:amavis clamd.conf
# chown amavis:amavis freshclam.conf

Freshclam installieren

Eingabe:

# apt-get install clamav-freshclam
Das ist eventuell schon bei Clamav mit installiert.

Freshclam konfigurieren

/etc/clamav/freshclam.conf

Datei ändern /etc/clamav/freshclam.conf; für die Zusammenarbeit mit Amavis muss der Datenbankbesitzer amavis sein; um den Internetzugang zu ermöglichen, müssen gegebenenfalls Zugangsdaten für den Proxy hinterlegt werden.
Ganz oben ändern bzw. am Ende der Datei einfügen:

DatabaseOwner amavis
[...]
#ProxySettings, sofern erforderlich am Ende einfuegen
HTTPProxyServer IP-Adresse_des_Proxy-Servers
HTTPProxyPort die_Portnummer_des_Proxy_Server
HTTPProxyUsername Benutzername_fuer_den_Proxy
HTTPProxyPassword Passwort_fuer_den_Proxy

Damit clamav-freshclam beim Neustart wegen der Berechtigungen keinen Fehler meldet, müssen diese Berechtigungen geändert werden.

Die Meldung lautet:

WARNING: Insecure permissions(for HTTPProxyPassword): /etc/clamav/freshclam.conf must have no more than 0700 permissions.

Eingabe:

# chmod 0700 /etc/clamav/freshclam.conf

Administrative Adressen freigeben

Nachrichten an diese Adressen sollen lokal auf diesem Mailrelay immer zugestellt werden.

Adressenliste erstellen

Eingabe

# touch /etc/postfix/roleaccount_exceptions

Inhalt

####################################################################
### Nachrichten an diese administrativen Adressen immer annehmen ###
####################################################################
abuse@ OK
hostmaster@ OK
postmaster @ OK
webmaster@ OK

Eingehende Nachrichten werden lokal zugestellt (/var/mail/benutzername).

Adressenliste in Datenbank überführen

Eingabe

# postmap hash:/etc/postfix/roleaccount_exceptions

Liste mit Empfänger-Mailboxen einbinden

Im Moment würden E-Mails am Mailrelay ankommen. Mailrelay scannt die Nachrichten, gibt die Nachrichten dann an den Mailserver weiter, von dem die Clients die Nachrichten abrufen. Ist die betreffende E-Mail-Adresse nicht bekannt, wird die E-Mail zurückgewiesen und eine Nachricht über die nicht erfolgte Zustellung verschickt. Sollte es sich um eine Spammail handeln, ist die Rücksendeadresse wahrscheinlich gefälscht. Dadurch würde die falsche Stelle Nachrichten bekommen, dass ihre E-Mail nicht zugestellt werden konnte. Und diese Stelle fragt sich dann um welche E-Mails es wohl gehen mag.

Diese Zeit und die Systemleistung zum Scannen (und gegebenenfalls späteren Abweisen der E-Mail) solenl eingespart werden. Postfix soll schon bei ankommenden E-Mails erkennen können, ob es eine dazu gehörende Mailbox gibt. Bei kleineren Listen lohnt es sich, diese manuell anzulegen. Wie das automatisch geht, weiß ich noch nicht. Diese Liste wird dann in die main.cf eingebunden.

/etc/postfix/relay_recipients erstellen

Eingabe

# touch /etc/postfix/relay_recipients

Inhalt

################################################################
### Nachrichten an diese Adressen der Benutze/innen annehmen ###
################################################################
abuse-at-domainname.de OK
hostmaster-at-domainname.de OK
postmaster-at-domainname.de OK
webmaster-at-domainname.de OK
################################################################
# Liste der Mailboxen der Benutzer/innen
name.vorname-at-domain.de OK
und-so-weiter-at-domain.de OK
#####################################
### am Ende alles andere ablehnen ###
#####################################
domainname.de REJECT

Datenbank erzeugen

Eingabe

# postmap hash:/etc/postfix/relay_recipents

Dies erzeugt die Datei /etc/postfix/relay_recipients.db. Die Datei wird am Ende von /etc/postfix/main.cf eingebunden. E-Mails an andere Adressen werden abgewiesen und verworfen. Wird die Liste geändert, muss das Kommando postmap hash:/etc/postfix/relay_recipents wieder ausgeführt werden.

Änderungen wirksam werden lassen.

# /etc/init.d/postfix reload

Spamassassin installieren und konfigurieren

Eingabe: apt-get install spamassassin
Ändern der Datei /etc/default/spamassassin
Korrektur: ENABLED = 1

Header- und Body-Checks aktivieren

Unter http://www.postfixbuch.de/web/service/checks/ die entsprechenden Dateien herunter laden und nach /etc/postfix als header_checks und body_checks kopieren.

In /etc/postfix/main.cf dies ergänzen.

[...]
inet_interfaces = all
transport_maps = hash:/etc/postfix/transport
unknown_local_recipient_reject_code = 550
# für diese Domain werden die E-Mails angenommen
relay_domains = domainname.de
# naechstes Kommando ruft eine Liste von Adressen auf, fuer welche
# E-Mails angenommen werden. Alle anderen werden erst gar nicht gescannt,
# sondern gleich zurückgewiesen.
relay_recipients_maps = hash:/etc/postfix/relay_recipients
### Spamschutz von http://www.postfixbuch.de/web/service/checks/ Anfang ###
header_checks = regexp:/etc/postfix/header_checks
body_checks = regexp:/etc/postfix/body_checks
### Spamschutz von http://www.postfixbuch.de/web/service/checks/ Ende ###

Dienste neu starten

Alle Dienste lassen sich jeweils mit

# /etc/init.d namedesdienstes restart

[postfix/ amavis/ clamav-daemon/ clamav-freshclam/ spamassasin] restart

neu starten.

Nach meiner Erfahrung wirken sind im laufenden Betrieb die Änderungen an den Dateien nicht aus, bis der betreffende Dienst neu gestartet oder dessen Konfiguration neu eingelesen wurde. Wenn das System gerade eingerichtet wird, kann man es auch neu starten. Dann sollte man mit einer Telnet-Verbindung den Dialog von Client und Mailserver mal durch spielen und die Protokolldateien beobachten.

Mailgraph installieren

Eingabe:

# apt-get install mailgraph

Ergebnisse über den E-Mail-Verkehr im Browser ansehen

http://ip-adresse-des-mailservers/cgi-bin/mailgraph.cgi

Die betreffenden, geänderten Dateien habe ich kopiert und auf einem anderen Server gespeichert. Im Notfall kopiere ich diese Dateien auf einen eventuell neu installierten Server.

Als Test habe ich diese Prozedur mit Debian Etch ausprobiert. Über eine Telnet-Verbindung (ip-adresse 25) habe ich den Dialog beim Mailversand durchgespielt. Es wurden E-Mails verschickt :-).

In den ein- und ausgehenden E-Mails findet sich im Header:
X-Virus-Scanned: Debian amavisd-new at mailservername.domainname.local
und in de Log-Dateien von amavis steht zum Beispiel [...] passed CLEAN [...].

Unter VMWare...

...mit Windows Server 2003 läuft das System soweit gut. Allein bei einem Neustart des Hauptsystems scheint Debian die Berechtigungen nicht zu behalten, wenn der Pfad zu /var/log/amavis/amavis.log geändert wurde. Mit etwas Probieren hatte ich zwar erreicht, das eine neue Datei erstellt wurde. Auf die hatte das System dann aber keinen Zugriff. Also habe ich mich entschlossen, es bei /var/log/syslog zu lassen. Das klappt gut.

Konfiguration sichern und wieder herstellen

Alle geänderten Dateien (zum Beispiel aus /etc/postfix/) an einen sicheren Ort kopieren.

Für die Wiederherstellung alle entsprechenden Dienste installieren, die Konfigurationsdateien auf den Mailserver kopieren und die Dienste oder den Computer neu starten.