Mailserver 2 von 10: Mailempfang und Mailversand mit Dovecot und Postfix

Jahrelang habe ich mich davor gedrückt, doch endlich ist es geschafft - die Einrichtung eines eigenen Mailservers. In einer kleinen Artikelserie möchte ich einmal meine Erfahrungen und Konfigurationsschritte festhalten. Diese Serie basiert auf zahllosen Tutorials, Best Practices, Gesprächen mit Mailserver-Betreibern, aus endlosem Dokumentationen lesen und dem Wissen der Bücher "Postfix" von Kyle D. Dent und "Postfix - Einrichtung, Betrieb und Wartung" von Ralf Hildebrandt und Patrick Ben Koetter. Vielleicht werden sie ja nützlich für andere Leute sein, die das gleiche erreichen wollen.

Doch eines vorab: Die Einrichtung und der Betrieb eines Mailservers ist eine komplexe Sache. Klar, die Software lässt sich schnell installieren, doch fertig ist man danach noch lange nicht, wenn man ernsthaft damit arbeiten möchte.

Der Fahrplan der Artikelserie:

  1. Einleitung
  2. Mailempfang und Mailversand mit Dovecot und Postfix
  3. Virenprüfung mit ClamAV
  4. Mailsignatur mit OpenDKIM
  5. Spamprüfung mit SpamAssassin
  6. Mailabruf mit Dovecot
  7. Mailboxen konfigurieren mit mailconf.phs
  8. Mails synchronisieren mit mailsync.phs
  9. Mailqueue überwachen mit mailqueue.phs
  10. SpamAssassin anlernen mit maillearn.phs

Nachdem ich im letzten Artikel einleitende Worte verloren habe, will ich im heutigen Artikel erklären, wie die grundsätzliche Installation des Mailempfangs und des Mailversands aussieht. Wir werden Postfix installieren und dafür sorgen, dass unsere Mailnutzer E-Mails versenden können. Zudem werden wir TLS einrichten.

Beginnen wir mit der einfachen Übung - nämlich mit der Installation von Postfix und Dovecot. Diese werden wir im Anschluss direkt stoppen, damit nichts läuft, solange wir nicht mit der Einrichtung fertig sind:

1
2
3
4
5
6
sudo apt-get update

sudo apt-get install postfix dovecot-common

sudo /etc/init.d/dovecot stop
sudo /etc/init.d/postfix stop

Während der Installation von Postfix werdet ihr gefragt, welche Konfiguration ihr verwenden wollt. Wir werden den Großteil der Konfiguration neu erstellen. Zur Sicherheit könnt ihr hier "Internet Site" auswählen, damit der noch unkonfigurierte Postfix keinen Schaden anrichten kann. Auch werdet ihr gefragt, welche Domain bei unqualifizierten E-Mail-Adressen angenommen werden soll. Wir werden das alles später selbst konfigurieren, deshalb könnt ihr hier vorerst den voreingestellten Wert beibehalten.

Ich persönlich lösche die automatisch erstellen Konfigurationsdateien, die ich nicht benötige - das erhöht die Übersichtlichkeit, ist aber kein Muss:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
sudo rm /etc/dovecot/dovecot-db.conf.ext
sudo rm /etc/dovecot/dovecot-dict-sql.conf.ext
sudo rm /etc/dovecot/dovecot-ldap.conf.ext
sudo rm /etc/dovecot/dovecot.pem
sudo rm /etc/dovecot/dovecot-sql.conf.ext
sudo rm /etc/dovecot/README

sudo rm -R /etc/dovecot/private/

sudo rm /etc/dovecot/conf.d/auth-checkpassword.conf.ext
sudo rm /etc/dovecot/conf.d/auth-deny.conf.ext
sudo rm /etc/dovecot/conf.d/auth-ldap.conf.ext
sudo rm /etc/dovecot/conf.d/auth-master.conf.ext
sudo rm /etc/dovecot/conf.d/auth-sql.conf.ext
sudo rm /etc/dovecot/conf.d/auth-static.conf.ext
sudo rm /etc/dovecot/conf.d/auth-system.conf.ext
sudo rm /etc/dovecot/conf.d/auth-vpopmail.conf.ext

So, nachdem wir jetzt ein wenig aufgeräumt haben, können wir damit beginnen, unser Dateisystem etwas vorzubereiten. Wir benötigen einen Ablageort für die Authentisierungsdaten und für die Mailboxen. Darüber hinaus können wir schon einmal Platzhalter für weitere, von Postfix benötigte, Dateien anlegen. Wir werden einen Nutzer benötigen, mit dessen Rechten empfangene E-Mails abgelegt werden. Hierfür hat sich der User "vmail" etabliert - diesen richten wir gleich mit ein:

1
2
3
4
5
6
7
8
9
10
11
12
13
sudo mkdir /etc/dovecot/auth/
sudo touch /etc/dovecot/auth/accounts

sudo mkdir /etc/postfix/tls/
sudo touch /etc/postfix/aliases.conf
sudo touch /etc/postfix/domains.conf
sudo touch /etc/postfix/logins.conf
sudo touch /etc/postfix/mailboxes.conf

sudo adduser vmail

sudo mkdir /srv/mailusers/
sudo chown vmail:vmail /srv/mailusers/

Vom User "vmail" solltet ihr euch die User-ID (UID) und die Group-ID (GID) notieren. Diese Werte werdet ihr gleich benötigen. Ihr könnt sie z.B. mit folgenden Befehlen in Erfahrung bringen, wobei ersterer die UID und zweiterer die GID ausgibt:

1
2
id -u vmail
id -g vmail

Nun kommen wir zum ersten größeren Konfigurationsbrocken - der Konfiguration von Postfix. Die Konfiguration von Postfix teilt sich in zwei Teile auf: die "main.cf" und die "master.cf". In der "main.cf" befinden sich generelle Konfigurationseinstellungen. Hier kann alles notwendige hinterlegt werden, was standardmäßig für die Postfix-Dienste gelten soll. Richtig, Postfix-Dienste. Im Gegensatz zu anderer Software besteht Postfix aus verschiedenen, unabhängigen Teilen, die zusammen arbeiten, um die geforderte Aufgabe - das Empfangen und Ausliefern von E-Mails - zu erfüllen. Welche Dienste es gibt und wie sie zusammenarbeiten, kann man sich auf der Postfix-Webseite ansehen.
Während die "main.cf" also die grundlegende Konfiguration darstellt, stehen in der "master.cf" sämtliche Dienste, die für Postfix gestartet werden sollen. Die Datei heißt deshalb so, da der "master"-Daemon standardmäßig gestartet wird und sich um das Starten aller anderen Dienste kümmert. Dieser Daemon wird über die "master.cf" gesteuert.

Sehen wir uns also einmal die "/etc/postfix/main.cf" an. Ich habe dort Platzhalter in der Form "<...>" eingefügt an Stellen, denen ihr mehr Beachtung schenken solltet. Wichtige Stellen in der Konfiguration werde ich zusätzlich im Nachgang erläutern.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
# just here to fix errors and warnings of postfix
# $ postalias /etc/aliases
alias_maps = hash:/etc/aliases

append_dot_mydomain   = no
biff                  = no
home_mailbox          = Maildir/
local_transport       = error:no local mail delivery
mailbox_size_limit    = 104857600
message_size_limit    = 52428800
virtual_mailbox_limit = 104857600
readme_directory      = no
recipient_delimiter   = +

inet_interfaces    = <127.0.0.1>, <[::1]>, 127.0.0.1, [::1]
inet_protocols     = ipv4, ipv6
mydestination      =
myhostname         = <send.example.com>
mynetworks_style   = host
myorigin           = <example.com>
relayhost          =
smtp_bind_address  = <127.0.0.1>
smtp_bind_address6 = <::1>

virtual_mailbox_base    = /srv/mailusers
virtual_mailbox_domains = hash:/etc/postfix/domains.conf
virtual_mailbox_maps    = hash:/etc/postfix/mailboxes.conf
virtual_alias_maps      = hash:/etc/postfix/aliases.conf

# user vmail
virtual_uid_maps = static:<UID>
# group vmail
virtual_gid_maps = static:<GID>

# general TLS parameters
tls_high_cipherlist    = HIGH:!aNULL:!eNULL:!3DES:!MD5:!RC4:@STRENGTH
tls_preempt_cipherlist = yes

# incoming TLS parameters
smtpd_tls_auth_only              = yes
smtpd_tls_cert_file              = /etc/postfix/tls/<send_example_com>.crt
smtpd_tls_key_file               = /etc/postfix/tls/<send_example_com>.key
smtpd_tls_mandatory_ciphers      = high
smtpd_tls_mandatory_protocols    = !SSLv2, !SSLv3
smtpd_tls_security_level         = may
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache

# outgoing TLS parameters
smtp_tls_mandatory_ciphers      = high
smtp_tls_mandatory_protocols    = !SSLv2, !SSLv3
smtp_tls_security_level         = may
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache

# rate limiting
anvil_rate_time_unit                    = 60
smtpd_client_connection_count_limit     = 10
smtpd_client_connection_rate_limit      = 10
smtpd_client_event_limit_exceptions     =
smtpd_client_message_rate_limit         = 10
smtpd_client_new_tls_session_rate_limit = 10
smtpd_client_recipient_rate_limit       = 100

# SASL
smtpd_sasl_local_domain = <example.com>
smtpd_sasl_auth_enable  = yes
smtpd_sasl_path         = inet:127.0.0.1:10000
smtpd_sasl_type         = dovecot

# milter configuration
milter_connect_macros = j {daemon_name} v {if_name} _
milter_default_action = accept
milter_protocol       = 6
smtpd_milters         =
non_smtpd_milters     =

# restrictions
#address_verify_map              = btree:{$data_directory}/verified_senders
#address_verifiy_negative_cache  = no
disable_vrfy_command            = yes
smtpd_delay_reject              = yes
smtpd_helo_required             = yes
smtpd_reject_unlisted_recipient = yes
smtpd_reject_unlisted_sender    = yes
smtpd_sender_login_maps         = hash:/etc/postfix/logins.conf
strict_rfc821_envelopes         = yes

smtpd_data_restrictions =
    reject_multi_recipient_bounce
    reject_unauth_pipelining

smtpd_recipient_restrictions =
    reject_non_fqdn_recipient
    reject_non_fqdn_sender
    reject_unknown_recipient_domain
    reject_unknown_sender_domain
    reject_unlisted_recipient
    reject_unlisted_sender
    permit_mynetworks
    reject_sender_login_mismatch
    permit_sasl_authenticated
    reject_unauth_destination
    reject_non_fqdn_helo_hostname
    reject_invalid_helo_hostname
    reject_unknown_helo_hostname
    reject_unknown_reverse_client_hostname
#    reject_unknown_client_hostname
#    reject_unverified_sender
    permit

Einige der gezeigten Einstellungen entsprechen ihren Default-Werten, helfen im Gesamtüberblick jedoch, die Funktionsweise und den Zustand des Systems besser zu verstehen. Hier nun ein paar Erklärungen zu den einzelnen Werten:

  • local_transport: Wir deaktivieren die lokale Zustellung von E-Mails an Systemnutzer. Wir werden ausschließlich virtuelle Mailkonten einsetzen, die mit keinem Systemnutzer verbunden sind.
  • message_size_limit: Wir setzen die maximale Größe von verarbeiteten E-Mails auf 50MiB (Default: 10MiB). Das ist heutzutage ein üblicher Standard für Mailgrößen.
  • mailbox_size_limit und virtual_mailbox_limit: Diese Werte müssen größer sein als message_size_limit, ansonsten startet Postfix nicht. Da wir virtuelle Mailboxen im Maildir-Format verwenden werden, sind sie für uns eigentlich nicht relevant.
  • inet_interfaces: Hier wird angegeben, über welche IP-Adressen Postfix von außen erreichbar sein soll. Angegeben werden können IPv4- und IPv6-Adressen.
  • inet_protocols: Hier wird angegeben, welche IP-Protokolle unterstützt werden. Normal sind heutzutage IPv4 und IPv6. Solltet ihr kein IPv6 unterstützen, müsst ihr es hier entfernen - dürft im späteren Verlauf aber auch keine IPv6-Adressen irgendwo angeben.
  • myhostname: Dies ist der Hostname des vorliegenden Systems. Dieser Name wird z.B. im SMTP-HELO verwendet. Dieser Name wird später im MX-DNS-Record stehen und sollte eindeutig einem Server zuzuordnen sein.
  • myorigin: Sollte eine E-Mail ohne angehängten Hostnamen verschickt werden, so wird der hier angegebene Hostname verwendet (z.B. wird aus "Kenny" die Adresse "Kenny@example.com").
  • smtp_bind_address: Dies ist die IPv4-Adresse, die Postfix verwendet, wenn es E-Mails an andere Mailserver zustellt. Diese Konfiguration sollte gesetzt werden, wenn einem Server mehrere IPv4-Adressen zugewiesen sind. Wichtig: Der rDNS-Lookup zu dieser IP-Adresse muss den Wert von myhostname zurückliefern.
  • smtp_bind_address6: Dies ist die IPv6-Adresse, die Postfix verwendet, wenn es E-Mails an andere Mailserver zustellt. Diese Konfiguration sollte gesetzt werden, wenn einem Server mehrere IPv6-Adressen zugewiesen sind. Wichtig: Der rDNS-Lookup zu dieser IP-Adresse muss den Wert von myhostname zurückliefern.
  • virtual_mailbox_domains: In der hier angegebenen Datei wird festgehalten, für welche Hostnamen der lokale Mailserver sich zuständig fühlt.
  • virtual_mailbox_maps: In der hier angegebenen Datei wird festgehalten, in welche Mailbox E-Mails eines bestimmten Accounts eingeliefert werden sollen.
  • virtual_alias_maps: In der hier angegebenen Datei wird festgehalten, welche E-Mail-Adressen einfache Weiterleitungen zu anderen E-Mail-Adressen darstellen.
  • virtual_uid_maps: Für "<UID>" muss die oben ermittelte User-ID des Nutzers "vmail" eingesetzt werden. Dieser Nutzer wird Besitzer der virtuellen Mailboxen sein.
  • virtual_gid_maps: Für "<GID>" muss die oben ermittelte Group-ID des Nutzers "vmail" eingesetzt werden. Diese Gruppe wird Besitzer der virtuellen Mailboxen sein.
  • smtpd_tls_cert_file: Dieser Wert gibt den Pfad zum Zertifikat an, das für TLS verwendet werden soll. Viele private Mailserver verwenden selbstsignierte Zertifikate. Ich persönlich verwende ein Webserver-Zertifikat von StartSSL.com - das funktioniert ebenfalls.
  • smtpd_tls_key_file: Dieser Wert gibt den Pfad zum privaten Schlüssel an, der zum Zertifikat im smtpd_tls_cert_file gehört.
  • smtpd_sasl_local_domain: Zur Authentisierung von Mailnutzern werden wir SASL mit Dovecot einsetzen. Sollte sich jemand einloggen wollen und dabei keinen Hostnamen angeben, so wird der hier gesetzte Hostname verwendet (z.B. wird aus "Kenny" die Adresse "Kenny@example.com").
  • smtpd_milters und non_smtpd_milters: Die verschiedenen Milter werden in den folgenden Artikeln eingeführt. smtpd_milters werden aktiv, wenn E-Mails über den SMTP-Daemon empfangen werden, non_smtpd_milters werden aktiv, wenn E-Mails lokal via Maildrop empfangen werden.
  • smtpd_sender_login_maps: In dieser Datei wird festgehalten, welche authentisierten Nutzer E-Mails mit welchen Absenderadressen verschicken dürfen. Dies verhindert, dass Nutzer auf dem Mailserver sich als andere Nutzer ausgeben können.
  • smtpd_data_restrictions und smtpd_recipient_restrictions: Über Restrictions wird bereits ein Großteil des Spamaufkommens abgewehrt. Das allerwichtigste ist, dass die Restriction reject_unauth_destination zum Einsatz kommt. Dies verhindert, dass E-Mails von fremden Absendern für den Versand angenommen werden, die nicht an den lokalen Mailserver gerichtet sind. Dieses Fehlverhalten bezeichnet man hinlänglich als "Open Relay" und es wäre der sicherste Weg, auf sämtlichen Spamblocker-Listen zu landen.

Nachdem wir nun also die grundlegende Konfiguration eingerichtet haben, wird es Zeit, die Postfix-Dienste zu konfigurieren. Dies geschieht in der Datei "/etc/postfix/master.cf". Auch hier habe ich wieder Platzhalter gesetzt, wo das nötig erschien:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#
# Postfix master process configuration file.  For details on the format
# of the file, see the master(5) manual page (command: "man 5 master").
#
# Do not forget to execute "postfix reload" after editing this file.
#
# ==========================================================================
# service type  private unpriv  chroot  wakeup  maxproc command + args
#               (yes)   (yes)   (yes)   (never) (100)
# ==========================================================================
smtp      inet  n       -       -       -       -       smtpd
#smtp      inet  n       -       -       -       1       postscreen
#smtpd     pass  -       -       -       -       -       smtpd
#dnsblog   unix  -       -       -       -       0       dnsblog
#tlsproxy  unix  -       -       -       -       0       tlsproxy
submission inet n       -       -       -       -       smtpd
  -o myhostname=<submit.example.com>
  -o smtpd_tls_cert_file=/etc/postfix/tls/<submit_example_com>.crt
  -o smtpd_tls_key_file=/etc/postfix/tls/<submit_example_com>.key
  -o syslog_name=postfix/submission
  -o smtpd_tls_security_level=encrypt
  -o smtpd_client_restrictions=permit_sasl_authenticated,reject
  -o milter_macro_daemon_name=ORIGINATING
smtps     inet  n       -       -       -       -       smtpd
  -o myhostname=<submit.example.com>
  -o smtpd_tls_cert_file=/etc/postfix/tls/<submit_example_com>.crt
  -o smtpd_tls_key_file=/etc/postfix/tls/<submit_example_com>.key
  -o syslog_name=postfix/smtps
  -o smtpd_tls_wrappermode=yes
  -o smtpd_client_restrictions=permit_sasl_authenticated,reject
  -o milter_macro_daemon_name=ORIGINATING
#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       -       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
proxywrite unix -       -       n       -       1       proxymap
smtp      unix  -       -       -       -       -       smtp
relay     unix  -       -       -       -       -       smtp
#       -o smtp_helo_timeout=5 -o smtp_connect_timeout=5
showq     unix  n       -       -       -       -       showq
error     unix  -       -       -       -       -       error
retry     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
maildrop  unix  -       n       n       -       -       pipe
  flags=DRhu user=vmail argv=/usr/bin/maildrop -d ${recipient}

Im Grunde gibt es in der "master.cf" nicht viel zu tun. Viele der Dienste, die hier gestartet werden, sind bereits vorkonfiguriert. Diese werden Postfix-intern benötigt und sollten nicht angefasst werden. Ich habe von den internen Diesten lediglich "local" und "lmtp" auskommentiert. "local" ist für die Mailzustellung an lokale Nutzer zuständig, während "lmtp" (Local Mail Transfer Protocol) für die lokale Mailzustellung durch andere Dienste genutzt werden kann. Da bei uns Postfix die Mailzustellung an virtuelle Mailboxen übernehmen wird, benötigen wir auch diesen Dienst nicht.
Als weiteres habe ich die Services "smtps" und "submission" eingerichtet - beide Services sollen ausschließlich von den Mailnutzern verwendet werden, um E-Mails verschicken zu können. "smtps" horcht auf Port 465 und bietet das SMTPS-Protokol an. "submission" hingegen horcht auf Port 587 und bietet SMTP samt StartTLS an. Die Portnummern stammen aus der Datei "/etc/services". Im Grunde wird für beide Services der Dienst "smtpd" gestartet, mit den "-o" Parametern werden zudem ein paar Konfigurationen überschrieben:

  • myhostname: Wir ändern den Namen, der bei diesem Dienst im SMTP-HELO verwendet wird. Dies nutzen wir später, um einen einfachen Failover per DNS-Roundrobin zu ermöglichen.
  • smtpd_tls_cert_file: Da wir einen anderen Hostnamen in myhostname verwenden, müssen wir auch ein anderes TLS-Zertifikat einsetzen.
  • smtpd_tls_key_file: Für das geänderte TLS-Zertifikat benötigen wir auch den entsprechenden privaten Schlüssel.
  • smtpd_tls_security_level: Für den "submission"-Service sehen wir vor, dass StartTLS verwendet werden muss, bevor E-Mails versendet werden können.
  • smtpd_tls_wrappermode: Für den "smtps"-Service hingegen fordern wir, dass die Verbindung direkt via TLS aufgebaut wird.
  • smtpd_client_restrictions: Da es sich bei "submission" und "smtps" um Dienste für die Mailnutzer handelt, werden alle anderen Versender ohne Authentisierung vollständig abgelehnt.

Abschließend müssen die Postfix-Konfigurationslisten erstellt werden. Beginnen wir mit der Datei "/etc/postfix/domains.conf", die angibt, für welche Domains, der lokale Mailserver zuständig ist:

1
2
3
# domain -> dummy

example.com ok

Als nächstes kümmern wir uns um die Datei "/etc/postfix/mailboxes.conf". Diese gibt an, in welche virtuelle Mailbox E-Mails eines bestimmten Accounts eingeliefert werden sollen. In diesem Beispiel nehme ich an, dass Mails für den Nutzer "kenny@example.com" in eine Mailbox im Maildir-Format eingeliefert werden sollen. Der Pfad ist relativ zur Konfigurationseinstellung virtual_mailbox_base. Damit in ein Maildir eingeliefert wird, muss der Pfad mit einem Slash ("/") enden, ansonsten wird das veraltete MBOX-Format verwendet.

1
2
3
# address -> storage-path/

kenny@example.com kenny/Maildir/

Nun kümmern wir uns um Alias-Adressen in der Datei "/etc/postfix/aliases.conf". Diese sind nützlich, um nicht für jede Empfängeradresse eine eigene Mailbox einrichten zu müssen. Z.B. müssen wir - entsprechend RFC 2142 - einige E-Mail-Adressen anbieten. Die Adressen, an die E-Mails weitergeleitet werden, dürfen übrigens auch extern sein:

1
2
3
4
5
6
7
8
9
10
# recipient address -> forwarding address

abuse@example.com      kenny@example.com
dns@example.com        kenny@example.com
hostmaster@example.com kenny@example.com
noc@example.com        kenny@example.com
postmaster@example.com kenny@example.com
security@example.com   kenny@example.com
www@example.com        kenny@example.com
webmaster@example.com  kenny@example.com

Nun fehlt nur noch eins - die Datei "/etc/postfix/logins.conf". In dieser wird festgelegt, welcher eingeloggte Mailnutzer über welche E-Mail-Adresse Nachrichten verschicken darf:

1
2
3
4
5
# envelope address -> SASL account

kenny@example.com   kenny@example.com
support@example.com kenny@example.com
ich@example.com     kenny@example.com

Jetzt, wo wir die Listen angelegt haben, müssen wir sie in ein Format überführen, das von Postfix eingelesen werden kann. Dafür gibt es den Befehl "postmap", den wir auf die Dateien anwenden. Dieser erzeugt jeweils eine ".db"-Datei:

1
2
3
4
sudo postmap /etc/postfix/aliases.conf
sudo postmap /etc/postfix/domains.conf
sudo postmap /etc/postfix/logins.conf
sudo postmap /etc/postfix/mailboxes.conf

Um uns nicht unnötige Fehlermeldungen von Postfix wegen einer fehlenden Alias-Datei für den lokalen Versand einzuhandeln, führen wir zudem noch einen weiteren Schritt aus - nämlich das Erstellen der lokalen Alias-Datenbank:

1
sudo postalias /etc/aliases

Damit haben wir die Konfiguration von Postfix erfolgreich abgeschlossen. Puuuh!

Einmal tief durchatmen. Einatmen. Ausatmen.

Weiter geht es mit der Konfiguration von Dovecot. Wir werden Dovecot in diesem Teil ausschließlich dafür verwenden, Nutzer zu authentisieren. Postfix wird bei Logins dann einfach Dovecot fragen, ob die vom Nutzer übergebenen Credentials korrekt sind. Der Einfachheit halber haber ich in den Dovecot-Konfigurationsdateien alle Kommentare gelöscht. Diese machen die Beispielkonfigurationen nur unnötig unübersichtlich.

Der erste Teil der Konfiguration befindet sich in der Datei "/etc/dovecot/dovecot.conf", ist relativ schnell erledigt und bedarf wahrscheinlich keiner großen Erklärung. Der einzige Teil, der dort übrig bleibt, ist folgender, da der Großteil der Konfigurationen sich im Unterordner "/etc/dovecot/conf.d/" befindet:

1
2
3
listen = 127.0.0.1

!include conf.d/*.conf

Nun gehen wir die einzelnen Konfigurationsdateien im Ordner "/etc/dovecot/conf.d" durch. Dateien, die wir nicht ändern, bleiben in ihrem Ausgangszustand. Beginnen wir mit der Datei "/etc/dovecot/conf.d/10-auth.conf". Diese sieht am Ende wie folgt aus:

1
2
3
4
5
6
7
auth_default_realm = <example.com>

auth_username_chars = abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890.-_@

auth_mechanisms = plain login

!include auth-passwdfile.conf.ext

Kurze Erklärung zu den Punkten:

  • auth_default_realm: Sollte sich jemand authentisieren wollen und dabei keinen Hostnamen angeben, so wird der hier angegebene Hostnamen verwendet (z.B. wird aus "Kenny" die Adresse "Kenny@example.com").
  • auth_username_chars: Nutzernamen dürfen nur diese Zeichen enthalten. Das soll gegen die Ausnutzung von Schwachstellen helfen.
  • auth_mechanisms: Wir werden später eine relativ sichere Passwortablage mit Salted Hashes verwenden. Um diese nutzen zu können, muss uns der Nutzer beim Login jedoch sein Passwort im Klartext übermitteln. Da wir TLS verwenden, stellt das kein Problem dar.

Auch bei Dovecot gibt es eine Master-Konfiguration. Diese befindet sich in der Datei "/etc/dovecot/conf.d/10-master.conf" und ist wie folgt eingerichtet, um Dovecot als Authentisierungsdienst zu nutzen und alle anderen Dienste zu deaktivieren:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
service imap-login {
  inet_listener imap {
    port = 0
  }
  inet_listener imaps {
    port = 0
  }
}

service pop3-login {
  inet_listener pop3 {
    port = 0
  }
  inet_listener pop3s {
    port = 0
  }
}

service lmtp {
}

service imap {
}

service pop3 {
}

service auth {
  inet_listener {
    port = 10000
  }

  chroot = /etc/dovecot/auth/
}

service auth-worker {
  user = $default_internal_user

  chroot = /etc/dovecot/auth/
}

service dict {
}

So haben wir eingerichtet, dass der Dovecot-Authentisierungsdienst auf der Adresse "127.0.0.1:10000" lauscht. Das ist genau die Adresse, die wir in der Postfix-Konfiguration als smtpd_sasl_path angegeben haben. Alle anderen Dienste haben wir deaktiviert.

Weiterhin deaktivieren wir in der Datei "/etc/dovecot/conf.d/10-ssl.conf" die TLS-Verschlüsselung, da wir nur lokal arbeiten werden. Sollte es jemandem möglich sein, den lokalen Traffic unseres Servers mitzulesen, müssen wir eh davon ausgehen, dass wir vollständig kompromittiert sind und sollten dann den Server samt aller Mailpassworte neu einrichten:

1
ssl = no

Abschließend konfigurieren wir noch die Datei "/etc/dovecot/conf.d/auth-passwdfile.conf.ext". In dieser legen wir fest, dass die Authentisierungsinformationen der Mailnutzer in einer Passwd-ähnlichen Datei abgelegt werden. Das Format ist relativ einfach zu nutzen und wird uns auch später noch ein paar Mal begegnen:

1
2
3
4
5
6
7
8
9
10
11
valid_chroot_dirs = /srv/mailusers/

passdb {
  driver = passwd-file
  args = scheme=SSHA256 username_format=%u /accounts
}

userdb {
  driver = static
  args = uid=vmail gid=vmail home=/srv/mailusers/%n/./
}

Die Nutzercredentials werden in der Datei "/etc/dovecot/auth/accounts" hinterlegt, wobei die Nutzernamen in der Form "<name>@<domain>" vorliegen müssen. Zudem werden Nutzerpasswörter als Salted SHA256 hinterlegt. Das sieht dann in etwa so aus:

1
2
3
# username:password

kenny@example.com:{SSHA256}lsj7m9rKhS/T7Onyu2hSFZnGFNfG9erhNbNK6XNcftLiv1wk

Die Passwörter könnt ihr mit folgendem Befehl erstellen:

1
doveadm pw -s SSHA256

Wenn ihr nun alles fertig konfiguriert habt, könnt ihr euren Mailserver nun das erste Mal starten:

1
2
sudo /etc/init.d/dovecot start
sudo /etc/init.d/postfix start

Zudem könnt ihr nun bei eurem Domain-Provider einen MX-Record setzen. Wenn ihr sowieso schon dabei seid und es noch nicht getan habt, ist nun ein guter Zeitpunkt, die Domains "send.example.com" und "submit.example.com" auf euren Server verweisen zu lassen:

1
2
3
4
5
6
7
example.com. IN MX 10 send.example.com.

send.example.com. IN A 127.0.0.1
send.example.com IN AAAA ::1

submit.example.com IN A 127.0.0.1
submit.example.com IN AAA ::1

Das tolle an dem gezeigten Setup: Mit Ausnahme der Werte inet_interfaces, myhostname, smtp_bind_address, smtp_bind_address6, virtual_uid_maps, virtual_gid_maps, smtpd_tls_cert_file und smtpd_tls_key_file könnt ihr die gesamte Konfiguration nehmen und erneut aufsetzen, um weitere SMTP-Server einzurichten. So könnt ihr relativ einfach eine Ausfallsicherheit durch redundante Server erhalten.

Damit die Mailnutzer bei einem Ausfall nicht zwischen den Mailservern hin- und her konfigurieren müssen, kann der generelle Hostname "submit.example.com" verwendet werden. Dieser kann so eingerichtet werden, dass er auf alle Mailserver zeigt, während jeder Mailserver für den eigentlichen Versand zusätzlich einen eindeutigen Hostnamen erhält.

Im nächsten Artikel wird es darum gehen, die erhaltenen E-Mails auf Viren zu prüfen. Dafür wird das Tool ClamAV zum Einsatz kommen. 🙂

Update:
Die "milter_connect_macros"-Konfiguration wurde zur "main.cf"-Postfix-Datei hinzugefügt, um im späteren Verlauf den Spamassassin-Milter ordentlich mit Daten füttern zu können, damit dort der Spamcheck ordentlich läuft.

Update:
Der Konfigurationsparameter "alias_maps" wird nun aktiv gesetzt um die Warning "warning: dict_nis_init: NIS domain name not set - NIS lookups disabled" in den Mail-Logs zu verhindern, da die Default-Konfiguration von Postfix dort auch einen NIS-Lookup vorsieht.

Empfangende Grüße, Kenny

Schreibe einen Kommentar

Um Ihnen beim weiteren Kommentieren auf dieser Webseite die erneute Eingabe Ihrer Daten zu ersparen, wird beim Absenden Ihres Kommentars ein Cookie an Ihren Browser gesendet und von diesem gespeichert. Mit dem Absenden eines Kommentars auf dieser Webseite stimmen Sie der Speicherung und Übertragung dieses Cookies explizit zu.

Pflichtfelder sind mit * markiert.