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.
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 |
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.
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
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
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.
# touch /etc/postfix/transport
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.
# postmap hash:/etc/postfix/transport
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
# 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
# apt-get install amavisd-new
Die Konfiguration ist auf mehrere Dateien verteilt.
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
Nur ausführen, wenn der Pfad für die Logdatei auf /var/log/amavis/amavis.log geändert wurde.
# cd /var/log
# mkdir amavis
# chown amavis:amavis amavis
# chmod 750 amavis
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 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
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"],
<
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);
Eingabe:
# apt-get install clamav-daemon
Ä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
Eingabe:
# apt-get install clamav-freshclam
Das ist eventuell schon bei Clamav mit installiert.
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
Nachrichten an diese Adressen sollen lokal auf diesem Mailrelay immer zugestellt werden.
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).
Eingabe
# postmap hash:/etc/postfix/roleaccount_exceptions
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.
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
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
Eingabe: apt-get install spamassassin
Ändern der Datei /etc/default/spamassassin
Korrektur: ENABLED = 1
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 ###
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.
# 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 [...].
...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.
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.