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
# 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 alvles in eine Amavis-Log-Datei geschrieben wird, und dass ich im Moment nicht weiß, wie ich erreiche, dass wöchentlich oder gar tägvlich 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 Zusammenarbeit 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) sollen 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.