Tutorial: ISP- ähnlicher Mailserver
In diesem Tutorial (oder HowTo) wird beschrieben, wie Sie einen Linux- Mailserver einrichten. Die geliebten Spammails werden anhand von RBL- Listen und policyd-weight- Prüfungen gefiltert.
Hinweis: Der Autor übernimmt keinerlei Verantwortung für eventuelle Schäden, welche durch das Anwenden dieses Tutorials auftreten könnten. Das Anwenden Jener geschiet auf eigene Gefahr und der Autor kann nicht zur Verantwortung gezogen werden.
Betriebssystem: | Linux |
Distribution(en): | Debian 4.0 (Etch) & 5.0 (Lenny) |
Paketinstallation
Die folgenden Pakete werden mit Hilfe von aptitude in der Standardkonfiguration installiert, falls diese nicht schon vorhanden sind:
dovecot-pop3d | MDA: E- Mails mittels POP3(s) abrufen |
dovecot-imapd | MDA: E- Mails mittels IMAP(s) abrufen |
openssl | Zur Generierung von Zertifikaten und Zertifikatsanforderungen |
policyd-weight | Spamerkennungsdienst |
postgrey | Eine weiterer Spamschutzdienst |
postfix | MTA: Stabiler und sicherer Mailserver |
Es empfieht sich, die Pakete einzelnd zu installieren, um Konflikte mit bereits installierten Paketen zu behandeln/ verhindern.
Interaktive Installation mit aptitude:
?#> aptitude |
Erfahrene Anwender können natürlich auch direkt installieren:
Installation:
?#> aptitude install dovecot-pop3d dovecot-imapd openssl policyd-weight postgrey postfix |
Zum Editieren von Konfigurationsdateien nutze ich gerne den Editor mcedit vom Midnight Commander (mc).
Installation:
?#> aptitude install mc |
Aufruf:
?#> mcedit DATEI |
Konfiguration
Folgende Verzeichnisse werden benötigt:
(Die Pfade können frei gewählt werden.)
/srv/mailsystem für die E-Mail- Postfächer
/etc/postfix/virtual wird virtuelle Domains, E-Mail- Adressen und -Mapping enthalten
?#> mkdir -p /srv/mailsystem ?#> mkdir -p /etc/postfix/virtual |
Danach muss der Benutzer mailsystem mit dem zuvor erstellten Heimatverzeichnis angelegt werden:
(Hier kann auch ein anderer Benutzername und eine andere Benutzernummer genutzt werden.)
?#> useradd -u 5000 -d /srv/mailsystem mailsystem |
Das Verzeichnis /srv/mailsystem muss nun dem neuen Besitzer mailsystem zugeordnet werden:
?#> chown mailsystem:mailsystem /srv/mailsystem ?#> chmod 0770 /srv/mailsystem |
Nun muss noch eine Datenbank für die E-Mailbenutzer angelegt werden. Die Datenbank gehört dem Benutzer dovecot und der Gruppe mailsystem. Alle anderen Benutzer im System haben keinen Zugriff auf diese Datei:
?#> touch /srv/mailsystem/mailusers.db ?#> chown dovecot:mailsystem /srv/mailsystem/mailusers.db ?#> chmod 0660 /srv/mailsystem/mailusers.db |
dovecot - Konfiguration
Die Datei /etc/dovecot/dovecot.conf muss der Gruppe mailsystem zugewiesen und die Rechte müssen entsprechend gesetzt werden. Andernfalls hat postfix über den Benutzer mailsystem keine Zugriffsrechte auf die Konfiguration (E-Mail- Benutzer/ und -Passwörter):
?#> chgrp mailsystem dovecot.conf ?#> chmod 0640 /etc/dovecot/dovecot.conf |
Ansicht der Konfiguration /etc/dovecot/dovecot.conf:
#Nicht benötigte Protokolle entfernen
protocols = imap imaps pop pops disable_plaintext_auth = yes log_timestamp = "%Y-%m-%d %H:%M:%S " ssl_disable = no ssl_cert_file = /etc/ssl/certs/dovecot.pem ssl_key_file = /etc/ssl/private/dovecot.pem ssl_verify_client_cert = no mail_location = maildir:/srv/mailsystem/%d/%n mail_access_groups = mailsystem mail_privileged_group = mailsystem protocol imap { imap_client_workarounds = outlook-idle mail_plugins = quota imap_quota } protocol pop3 { pop3_uidl_format = %v-%u } protocol lda { postmaster_address = Ihre@Mailadresse.TLD mail_plugins = quota auth_socket_path = /var/run/dovecot/auth-master } auth default { mechanisms = plain login passdb passwd-file { args = /srv/mailsystem/mailusers.db } userdb static { args = uid=5000 gid=5000 home=/srv/mailsystem/%d/%n } # user = Ein Benutzer, der Zugriff auf die SSL- Zertifikate hat: user = root ssl_require_client_cert = no socket listen { master { path = /var/run/dovecot/auth-master mode = 0660 user = mailsystem group = mailsystem } client { path = /var/spool/postfix/private/auth mode = 0660 user = postfix group = postfix } } } plugin { # Quota plugin. Multiple backends are supported: # dirsize: Find and sum all the files found from mail directory # dict: Keep quota stored in dictionary (eg. SQL) # maildir: Maildir++ quota # fs: Read-only support for filesystem quota quota = maildir } #Bei Problemen kann die Fehlerprotokollierung genutzt werden: #auth_debug = yes #auth_debug_passwords = yes |
Für jede E-Mail- Adresse, die ein Postfach besitzen soll, muss ein Benutzer in /srv/mailsystem/mailusers.db angelegt werden:
(Hierzu verwende ich das Programm mkpasswd, welches Passwörter im /etc/passwd- Format liefert. Es ist in unterschiedlichen Debian- Paketen enthalten.)
?#> cd /srv/mailsystem ?#> echo -n "user1@domain1.tld" >> mailuser.db ?#> echo "MEIN_PASSWORT" | mkpasswd -s >> mailuser.db ?#> echo -n "user4@domain1.tld" >> mailuser.db ?#> echo "MEIN_PASSWORT" | mkpasswd -s >> mailuser.db ?#> echo -n "user5@domain1.tld" >> mailuser.db ?#> echo "MEIN_PASSWORT" | mkpasswd -s >> mailuser.db |
Ansicht der gerade befüllten mailuser.db:
user1@domain1.tld:9J7AjfuLs89Ek user4@domain1.tld:9J7AjfuLs89Ek user5@domain1.tld:9J7AjfuLs89Ek |
Nun muss dovecot neu gestartet werden:
?#> /etc/init.d/dovecot restart |
postfix - Konfiguration
Die RBL- Überprüfungen werden von policyd-weight vorgenommen.
Weiter wurde postgrey mit eingebunden. Hierbei handelt es sich um einen Greylister. (Informationen zu postgrey: http://linuxwiki.de/PostGrey)
Je nach eigener Umgebung, müssen hier noch Anpassungen vorgenommen werden. Die entsprechene MANPAGE (man postfix) gibt hierfür weitere Auskünfte.
Ansicht der Konfiguration /etc/postfix/main.cf:
smtpd_banner = $myhostname ESMTP FREI_WÄHLBARER_TEXT
biff = no append_dot_mydomain = no delay_warning_time = 4h #< TLS #smtpd_tls_auth_only = yes: POP3s bzw. IMAPs erzwingen. smtpd_tls_auth_only = no smtpd_tls_key_file = /etc/ssl/private/ssl-cert-snakeoil.key smtpd_tls_cert_file = /etc/ssl/certs/ssl-cert-snakeoil.pem smtpd_tls_CA_file = /etc/ssl/certs/ssl-cert-snakeoil.pem smtpd_tls_received_header = yes smtpd_tls_session_cache_database = btree:${queue_directory}/smtpd_scache smtpd_tls_session_cache_timeout = 9600s smtpd_tls_security_level = may smtpd_tls_ask_ccert = yes smtpd_tls_req_ccert = no smtpd_tls_mandatory_protocols = TLSv1 smtpd_tls_dh1024_param_file = /etc/postfix/dh_1024.pem smtpd_tls_dh512_param_file = /etc/postfix/dh_512.pem tls_random_source = dev:/dev/urandom tls_random_prng_update_period = 3600s smtp_use_tls = yes smtp_tls_note_starttls_offer = yes smtp_tls_key_file = /etc/ssl/private/ssl-cert-snakeoil.key smtp_tls_cert_file = /etc/ssl/certs/ssl-cert-snakeoil.pem smtp_tls_session_cache_database = btree:${queue_directory}/smtp_scache #TLS > #< Restriktionen disable_vrfy_command = yes smtpd_helo_required = yes smtpd_helo_restrictions = reject_invalid_hostname smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_non_fqdn_sender, reject_non_fqdn_recipient, reject_unauth_destination, reject_unauth_pipelining, reject_invalid_hostname, reject_unknown_recipient_domain, #Falls eine WHITELIST genutzt werden soll, dann folgendes auskommentieren: # check_client_access hash:/etc/postfix/virtual/rbl_whitelist, check_policy_service inet:127.0.0.1:12525, check_policy_service inet:127.0.0.1:60000 default_rbl_reply = $rbl_code Service unavailable; $rbl_class [$rbl_what] blocked using $rbl_domain${rbl_reason?; $rbl_reason} smtpd_sender_restrictions = reject_unknown_address smtpd_delay_reject = yes strict_rfc821_envelopes = no < SPAM smtpd_client_restrictions = reject_invalid_hostname # reject_rbl_client proxies.blackholes.wirehub.net, # reject_rbl_client dsn.rfc-ignorant.org, # reject_rbl_client postmaster.rfc-ignorant.org, # reject_rbl_client abuse.rfc-ignorant.org, # reject_rbl_client unconfirmed.dsbl.org, # reject_rbl_client list.dsbl.org, # reject_rbl_client dynablock.wirehub.net #SPAM > #Restriktionen > #< SASL smtpd_sasl_auth_enable = yes smtpd_sasl_type = dovecot smtpd_sasl_path = private/auth smtpd_sasl_security_options = noanonymous smtpd_sasl_local_domain = #broken_sasl_auth_clients = yes: Für Client- Fehlerbehebung Outlook/ Outlook Express broken_sasl_auth_clients = no #SASL > home_mailbox = /var/mail/ myhostname = EIGENER_SERVER alias_maps = hash:/etc/aliases alias_database = hash:/etc/aliases myorigin = /etc/mailname mydestination = localdomain, localhost.localdomain, , localhost relayhost = mynetworks = /etc/postfix/mynetworks.cf mynetworks_style = subnet mailbox_size_limit = 209715200 #200MB Quota message_size_limit = 10485760 #10MB recipient_delimiter = + inet_interfaces = all #< Virtual virtual_mailbox_size_limit = 209715200 #200MB Quota virtual_message_size_limit = 10485760 #10MB virtual_mailbox_base = /srv/mailsystem virtual_mailbox_domains = /etc/postfix/virtual/domains virtual_mailbox_maps = hash:/etc/postfix/virtual/mailboxes virtual_mailbox_limit = 0 virtual_alias_maps = hash:/etc/postfix/virtual/aliases virtual_uid_maps = static:5000 virtual_gid_maps = static:5000 virtual_transport = dovecot #Virtual > |
Für die Dovecot- Authentifizierung müssen 2 Zeilen am Ende der Konfigurationsdatei /etc/postfix/master.cf hinzugefügt werden:
dovecot unix - n n - - pipe
flags=DRhu user=mailsystem:mailsystem argv=/usr/lib/dovecot/deliver -d ${recipient} |
Weiter sollte smtps im Wrappermodus aktiviert werden. Das Versenden von E-Mails funktioniert dann über Port 25 und/ oder Port 465:
smtps inet n - n - - smtpd
-o smtpd_tls_wrappermode=yes -o smtpd_sasl_auth_enable=yes -o smtpd_client_restrictions=permit_sasl_authenticated,reject |
Ansicht der Konfiguration /etc/postfix/master.cf:
#
# Postfix master process configuration file. For details on the format # of the file, see the master(5) manual page (command: "man 5 master"). # # ========================================================================== # service type private unpriv chroot wakeup maxproc command + args # (yes) (yes) (yes) (never) (100) # ========================================================================== smtp inet n - - - - smtpd #submission inet n - - - - smtpd # -o smtpd_enforce_tls=yes # -o smtpd_sasl_auth_enable=yes # -o smtpd_client_restrictions=permit_sasl_authenticated,reject smtps inet n - n - - smtpd -o smtpd_tls_wrappermode=yes -o smtpd_sasl_auth_enable=yes -o smtpd_client_restrictions=permit_sasl_authenticated,reject #628 inet n - - - - qmqpd pickup fifo n - - 60 1 pickup cleanup unix n - - - 0 cleanup qmgr fifo n - n 300 1 qmgr #qmgr fifo n - - 300 1 oqmgr tlsmgr unix - - - 1000? 1 tlsmgr rewrite unix - - - - - trivial-rewrite bounce unix - - - - 0 bounce defer unix - - - - 0 bounce trace unix - - - - 0 bounce verify unix - - - - 1 verify flush unix n - - 1000? 0 flush proxymap unix - - n - - proxymap smtp unix - - - - - smtp # When relaying mail as backup MX, disable fallback_relay to avoid MX loops relay unix - - - - - smtp -o fallback_relay= # -o smtp_helo_timeout=5 -o smtp_connect_timeout=5 showq unix n - - - - showq error unix - - - - - error discard unix - - - - - discard local unix - n n - - local virtual unix - n n - - virtual lmtp unix - - - - - lmtp anvil unix - - - - 1 anvil scache unix - - - - 1 scache # # ==================================================================== # Interfaces to non-Postfix software. Be sure to examine the manual # pages of the non-Postfix software to find out what options it wants. # # Many of the following services use the Postfix pipe(8) delivery # agent. See the pipe(8) man page for information about ${recipient} # and other message envelope options. # ==================================================================== # # maildrop. See the Postfix MAILDROP_README file for details. # Also specify in main.cf: maildrop_destination_recipient_limit=1 # maildrop unix - n n - - pipe flags=DRhu user=vmail argv=/usr/bin/maildrop -d ${recipient} # # See the Postfix UUCP_README file for configuration details. # uucp unix - n n - - pipe flags=Fqhu user=uucp argv=uux -r -n -z -a$sender - $nexthop!rmail ($recipient) # # Other external delivery methods. # ifmail unix - n n - - pipe flags=F user=ftn argv=/usr/lib/ifmail/ifmail -r $nexthop ($recipient) bsmtp unix - n n - - pipe flags=Fq. user=bsmtp argv=/usr/lib/bsmtp/bsmtp -t$nexthop -f$sender $recipient scalemail-backend unix - n n - 2 pipe flags=R user=scalemail argv=/usr/lib/scalemail/bin/scalemail-store ${nexthop} ${user} ${extension} mailman unix - n n - - pipe flags=FR user=list argv=/usr/lib/mailman/bin/postfix-to-mailman.py ${nexthop} ${user} dovecot unix - n n - - pipe flags=DRhu user=mailsystem:mailsystem argv=/usr/lib/dovecot/deliver -d ${recipient} |
Eigene Diffie-Hellman- Parameter generieren:
Siehe http://www.postfix.org/TLS_README.html
?#> openssl gendh -out /etc/postfix/dh_512.pem -2 512 ?#> openssl gendh -out /etc/postfix/dh_1024.pem -2 1024 |
In dem Verzeichnis /etc/postfix/virtual müssen 3 Dateien angelegt werden:
aliases - Enthält E-Mail- Catchall-, Weiterleitungen und Adressen
mailboxes - Enthält nur die Aufzählung gültiger E-Mail- Adressen (Postfächer)
domains - Enthält alle gültigen Domains (Postannahme und -versandt)
?#> cd /etc/postfix/virtual ?#> touch aliases ?#> touch mailboxes ?#> touch domains |
Ansicht von 3 Alias- Beispielen für Selbstverweis, Weiterleitung und Catchall:
user1@domain1.tld user1@domain1.tld user2@domain1.tld user1@domain1.tld @domain1.tld user2@domain1.tld |
Ansicht eines Beispieleintrages in mailboxes:
(Der Texteintrag in der 2. Spalte valid kann frei gewählt werden.)
user1@domain1.tld valid user4@domain1.tld valid user5@domain1.tld valid |
Ansicht eines Beispieleintrages in domains:
(Es muss mindesten 1 Eintrag in der Datei vorhanden sein, deshalb ist der 1. Eintrag ein frei gewählter Dummy.)
NULLDOMAIN , domain1.tld , domain2.tld |
Nachdem die Dateien aliases und mailboxes angelegt/ aktualisiert worden sind, muss jedes mal ein postmap auf die jeweilige Datei abgesetzt und postfix neu geladen werden.
?#> postmap /etc/postfix/virtual/aliases ?#> postmap /etc/postfix/virtual/mailboxes ?#> /etc/init.d/postfix reload |
Wenn eine Whitelist genutzt werden soll, dann kann hierfür auch eine gemapte Datei genutzt werden. Im Verzeichnis /etc/postfix/virtual muss hierfür eine Datei angelegt werden:
?#> cd /etc/postfix/virtual ?#> touch rbl_whitelist |
Ansicht zweier Beispieleinträge in rbl_whitelist:
domain.tld OK 1.2.3.4 OK |
?#> postmap /etc/postfix/virtual/rbl_whitelist ?#> /etc/init.d/postfix reload |
openSSL - Konfiguration
Damit der E-Mail- Endbenutzer keine Zertifikats- Sicherheitswarnung erhält, sollte ein Zertifikat von einer vertrauenswürdigen Organisation erstellt werden. (Zum Beispiel von CAcert.org.)
Erstellen eines privaten Schlüssels:
Den Ordner /etc/ssl/private anlegen, falls nicht vorhanden. Die Verschlüsselungsstärke wurde hier auf 1024 Bit gesetzt. Als Bitrate kann ein selbst bestimmter Wert eingesetzt werden. Als Schlüsselname empfiehlt sich der jeweilige Domainname.
?#> mkdir -p /etc/ssl/private ?#> openssl genrsa -des3 -out /etc/ssl/private/name_schluessel.key 1024 |
Das Passwort sollte wieder vom Schlüssel entfernet werden:
?#> openssl rsa -in /etc/ssl/private/name_schluessel.key > /etc/ssl/private/name_schluessel_pwlos.key
?#> mv /etc/ssl/private/name_schluessel_pwlos.key /etc/ssl/private/name_schluessel.key |
Erstellen eines privaten Schlüssels und der Zertifikatsanforderung (CSR):
Den Ordner /etc/ssl/csr anlegen, falls nicht vorhanden. Als CSR- Name empfiehlt sich hier auch der jeweilige Domainname.
?#> mkdir -p /etc/ssl/csr
?#> openssl req -new -key /etc/ssl/private/name_schluessel.key -out /etc/ssl/CSR/name_schluessel.csr |
Die CSR müssen Sie nun an die jeweilige Organisation/ Zertifizierungsstelle schicken und verarbeiten lassen.
Wenn Sie das Zertifikat erhalten haben, kann mit der Prozedur fortgefahren werden.
Das erhaltene Zertifikat sollte unter /etc/ssl/certs abgelegt werden. Auch diesen Ordner anlegen, falls er noch nicht vorhanden sein sollte.
?#> mkdir -p /etc/ssl/certs |
Manche Programme benötigen, oder unterstützen das PEM- Format. Eine PEM- Datei lässt sich leicht aus dem Zertifikat und dem dazugehörigem Schlüssel erstellen.
Den Ordner /etc/ssl/pem anlegen, falls er nicht vorhanden ist.
?#> mkdir -p /etc/ssl/pem
?#> cat /etc/ssl/private/name_schluessel.key /etc/ssl/certs/name_schluessel.crt > /etc/ssl/pem/name_schluessel.pem |
Die nun angelegten Zertifikate können in die Konfiguration von postfix und dovecot eingetragen werden. Dovecot bzw. postfix muss nach der Konfigurationsänderung natürlich neu geladen werden:
?#> /etc/init.d/dovecot reload ?#> /etc/init.d/postfix reload |
Ansicht der Konfigurationseinträge /etc/dovecot/dovecot.conf:
ssl_cert_file = /etc/ssl/pem/name_schluessel.pem ssl_key_file = /etc/ssl/pem/name_schluessel.pem ODER ssl_cert_file = /etc/ssl/certs/name_schluessel.crt ssl_key_file = /etc/ssl/private/name_schluessel.key |
Ansicht der Konfigurationseinträge /etc/postfix/main.conf:
smtpd_tls_cert_file = /etc/ssl/pem/name_schluessel.pem smtpd_tls_key_file = /etc/ssl/pem/name_schluessel.pem ODER smtpd_tls_cert_file = /etc/ssl/certs/name_schluessel.crt smtpd_tls_key_file = /etc/ssl/private/name_schluessel.key |
Testen
Der E-Mail- Empfang und -Versand kann am einfachsten mittels eines E-Mail- Clients getestet werden.
Mailserver: EIGENER_SERVER POP3-Port: 110 POP3s-Port: 995 IMAP4-Port: 143 IMAP4s-Port: 993 SMPT-Port: 25 sSMPT-Port: 25 SMPTs-Port: 465 Benutzer: Komplette E-Mailadresse Passwort: Wie mit mkpasswd festgelegt |
Auf dem Mailserver gibt /var/log/mail.log und /var/log/auth.log Auskunft bei auftretenden Fehlern. Der dovecot- Dienst kann auch weitere Logdateien generieren. Hierzu einfach die Konfiguration auf debug umstellen.
TLSv1 wird von manchen Virenscannern blockiert, da sie keine verschlüsselten Datenströme lesen können. Im nächsten Abschnitt wird eine Lösungsmöglichkeit aufgezeigt. Es sollte ja nicht auf eine Verschlüsselung verzichtet werden.
Stunnel & Virenscanner
Dem Virenscanner kann indirekt das Scannen von SSL- E-Mails ermöglicht werden.
Hierzu installieren Sie die Programme Stunnel http://www.stunnel.org/download/binaries.html und openSSL http://www.slproweb.com/products/Win32OpenSSL.html.
'Die Light'- Edition von openSSL sollte für diesen Zweck ausreichend sein.
Fügen Sie folgende Zeilen zur stunnel.conf hinzu:
[imaps] client = yes accept = localhost:10993 connect = IHR-MAILSERVER.TLD:993 [smtps] client = yes accept = localhost:10465 connect = IHR-MAILSERVER.TLD:465 |
Danach starten Sie das Programm STunnel direkt oder als Service.
In Ihrem E-Mail- Client müssen der Mailsserver und die Ports auf die lokale Maschine geändert werden. In diesem Beispiel würde STunnel über Port 10993 und 10465 mit Ihrem E-Mail- Client kommunizieren.
Geben Sie also in Ihrem E-Mail- Client als Server localhost, für den IMAP- Mailempfang Port 10993 und für den Mailversand Port 10465 an. SSL bzw. TLSv1 muss in Ihrem E-Mail- Client ausgeschaltet werden, da STunnel das Verschlüsseln übernimmt.
Die hier angegebenen lokalen Ports können nach belieben verändert werden. POP3s läßt sich nach dem gleichen Verfahren einbinden.
EOT