Skip to content

Mailserver mit Dovecot, Postfix und MySQL

Dovecot installieren und konfigurieren

Für diese Konfiguration wird ein laufender mysql-server und ein Installiertes ViMbAdmin V2 vorrausgesetzt. Wir beginnen mit der Installation/Konfiguration von Dovecot als MDA/IMAP Server.

vMail Verzeichnis und Benutzer einrichten

Die E-Mail Postfächer sollen nicht – wie standardmäßig festgelegt – in /var/mail liegen, sondern in /var/vmail. Innerhalb dieses Verzeichnis wird eine Maildir Verzeichnisstruktur aufgebaut nach dem Muster /var/vmail/domain/benutzername/. Im Benutzerverzeichnis liegen schließlich die Ordner für Inbox, Entwürfe, Gesendete Mails etc.

root:~# mkdir /var/vmail

Die Maildir Verzeichnisstruktur wird später automatisch von Dovecot angelegt. Jetzt muss noch ein neuer Benutzer eingeführt werden, der vollen Zugriff auf dieses Mailverzeichnis hat: Der Nutzer vmail. Unter diesen Benutzer werden die Mailserver im dem Verzeichnis arbeiten.

root:~# groupadd -g 5000 vmail
root:~# useradd -g vmail -u 5000 vmail -d /var/vmail -m
root:~# chmod -R 770 /var/vmail

Dovecot installieren und konfigurieren

Jetzt ist es soweit – Dovecot kann installiert werden.

root:~# apt-get install dovecot-common dovecot-imapd dovecot-mysql dovecot-lmtpd

Die letzten Pakete stellen Funktionen wie IMAP Zugriff für den Client, MySQL Datenbankanbindung und LMTP Protokoll zur Verfügung. Letzteres wird zum Ablegen von E-Mails im Postfach genutzt, sobald der MTA eine Mail empfangen hat. Während der Installation kann gewählt werden, ob ein selbst ausgestelltes SSL Zertifikat generiert werden soll. Wenn ihr noch kein Zertifikat von einer CA habt, wählt hier Ja.

Los geht’s mit der Konfiguration! Einige Stellen in den vorhandenen Konfig-Dateien müssen angepasst werden.

root:~# cd /etc/dovecot/

Konfiguration der Postfächer

Im Verzeichnis conf.d findet ihr die Datei 10-mail.conf. Setzt folgende Einstellungen (Kommentarzeichen # ggf. entfernen!).

root:~# vi conf.d/10-mail.conf
....
mail_location = maildir:/var/vmail/%d/%n:LAYOUT=fs
mail_uid = vmail
mail_gid = vmail
mail_privileged_group = vmail

Dovecot wird damit mitgeteilt, nach welchem Muster die Postfächer angelegt werden sollen und unter welchem Benutzer darauf zugegriffen werden soll. In unserem Fall ist das der Nutzer vmail.

Authentifizierung über MySQL Datenbank

Im nächsten Schritt wird die Benutzerauthentifizierung über die MySQL-Datenbank eingestellt. Öffnet dazu die Datei /etc/dovecot/dovecot-sql.conf.ext

Setzt die Einstellungen in der Datei folgendermaßen (vmail Passwort anpassen!).

root:~# vi /etc/dovecot/dovecot-sql.conf.ext
....
driver = mysql
connect = host=127.0.0.1 dbname=vimbadmin user=vimbadmin password=******
default_pass_scheme = MD5

password_query = \
  SELECT username AS user, password, \
    homedir AS userdb_home, uid AS userdb_uid, gid AS userdb_gid \
  FROM mailbox WHERE username = '%u'

Der erste Teil der Konfiguration enthält die Zugangsdaten zur MySQL Datenbank vmail, der zweite Teil besteht aus der SQL Abfrage, die der Mailserver ausführen muss, um Nutzerinfos zu erhalten.

Die Zeile

iterate_query = SELECT local_part AS username, domain FROM mailbox

am Ende der Datei wird ebenfalls einkommentiert und entsprechend abgeändert. (Kommentarzeichen # entfernen).

Authentifizierungseinstellungen

Für eine sichere Anmeldung am Mailserver werden jetzt noch ein paar Einstellungen in conf.d/10-auth.conf gesetzt.

root:~# vi conf.d/10-auth.conf
....
disable_plaintext_auth = yes
auth_mechanisms = plain login
....
passdb {
    driver = sql
    args = /etc/dovecot/dovecot-sql.conf.ext
}

Die erste Zeile legt fest, dass Klartextkennwörter nur an den Server übertragen werden können, wenn vorher eine verschlüsselte Verbindung hergestellt wurde. Die zweite Einstellung wurde um „login” erweitert. Dies stellt die Kompatibilität zu Windows Mail und Outlook her. Wer diese Software nicht nutzt, kann es auch weglassen. Der passdb Abschnitt legt fest, dass die SQL Abfragen in dovecot-sql.conf.ext genutzt werden sollen, um einen Nutzer zu authentifizieren.

Vor die Einstellung

#!include auth-system.conf.ext

wird ein Kommentarsymbol „#” gesetzt, um diese unwirksam zu machen. Sie bindet eine weitere Datei ein, die Einstellungen für die PAM Authentifizierung enthält. Weil wir aber eine MySQL Datenbank nutzen, wird PAM nicht gebraucht.

Die Hauptkonfigurationsdatei von Dovecot ist /etc/dovecot/dovecot.conf. In dieser Datei setzen wir folgende Einstellungen.

root:~# vi dovecot.conf
....
# Enable installed protocols
!include_try /usr/share/dovecot/protocols.d/*.protocol
protocols = imap lmtp sieve


# Ohne IPv6
listen = *

# Mit IPv6
#listen = *, ::

base_dir = /var/run/dovecot/

# Greeting message for clients.
login_greeting = Dovecot ready.

!include conf.d/*.conf
!include_try local.conf

Darin werden grundlegende Einstellungen von Dovecot festgelegt, z.B. die aktiven Protokolle, die zu benutzenden Netzwerkschnittstellen und die Begrüßungsnachricht für den Mailclient. Außerdem werden via include alle Konfigurationsdateien in conf.d eingebunden.

Sichere SSL Verbindungen aktivieren

E-Mails sollten nur noch verschlüsselt abgerufen werden – alles andere wäre grob fahrlässig. Deshalb werden nun noch ein paar Einstellungen zu SSL/TLS vorgenommen. Öffnet dazu die Datei conf.d/10-ssl.conf.

root:~# vi conf.d/10-ssl.conf
....
ssl = required
ssl_cert = </etc/dovecot/dovecot.pem
ssl_key = </etc/dovecot/private/dovecot.pem

Die oberste Zeile legt fest, dass E-Mails ausschließlich über eine sichere Verbindung abgerufen werden können. Verbindungsversuche ohne Verschlüsselung werden nicht ermöglicht. ssl_cert und ssl_key geben den Pfad zu den SSL Zertifikatsdateien an. Die hier angegebenen Zertifikate funktionieren zwar, erzeugen aber auf den Clients eine Warnmeldung, weil es sich um selbst ausgestellte Zertifikate handelt und nicht um "offizielle", Zertifikate einer anerkannten CA.

Wenn das private Zertifikat mit einem Passwort gesichert ist, kann dieses unter ssl_key_password angegeben werden. Für besonders sichere SSL-Verbindungen wird für ssl_cipher_list der Chipher-String von bettercrypto.org angegeben:

ssl_cipher_list = EDH+CAMELLIA:EDH+aRSA:EECDH+aRSA+AESGCM:EECDH+aRSA+SHA384:EECDH+aRSA+SHA256:EECDH:+CAMELLIA256:+AES256:+CAMELLIA128:+AES128:+SSLv3:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!DSS:!RC4:!SEED:!ECDSA:CAMELLIA256-SHA:AES256-SHA:CAMELLIA128-SHA:AES128-SHA

Clients werden angewiesen, diese Cipher-Reihenfolge zu berücksichtigen:

ssl_prefer_server_ciphers = yes

SASL Authentifizierung

Postfix fragt bei Dovecot nach, ob ein Benutzer berechtigt ist, eine E-Mail zu versenden, deshalb muss Dovecot einen Socket für solche SASL Anfragen bereitstellen. Dieser Auth-Socket wird nun unter conf.d/10-master.conf eingestellt. Die service auth-Sektion muss so aussehen.

root:~# vi conf.d/10-master.conf
....

service auth {
    unix_listener auth-userdb {
        mode = 0600
        user = vmail
        group = vmail
    }

    # Postfix smtp-auth
    unix_listener /var/spool/postfix/private/auth {
        mode = 0660
        user = postfix
        group = postfix
    }
}

service auth-worker {
  user = vmail
}

LMTP Socket für Postfix

Zusätzlich zum SASL Socket soll Dovecot auch noch einen Socket für das LMTP-Protokoll für Postfix bereitstellen. Im Gegensatz zum ähnlichen SMTP Protokoll wird LMTP genutzt, um vom MTP empfangene Mails innerhalb eines Mailsystems an den MDA und damit die Postfächer weiterzugeben (Siehe Grafik oben).

In derselben Datei conf.d/10-master.conf wird die LMTP Service Konfiguration wie folgt geändert.

root:~# vi conf.d/10-master.conf
....
service lmtp {
  unix_listener /var/spool/postfix/private/dovecot-lmtp {
    mode = 0660
    user = postfix
    group = postfix
  }
  user = vmail
}

Da für das LMTP Protokoll auch Einstellungen für den LDA (Local Delivery Agent) genutzt werden, die sich in conf.d/15-lda.conf befinden, wird auch diese Datei für eine kleine Änderung geöffnet. Hier muss unbedingt postmaster_address einkommentiert und auf eine gültige E-Mail Adresse gesetzt werden. An diese Adresse gehen Benachrichtigungen, wenn der E-Mail Transport fehl schlägt.

root:~# vi conf.d/15-lda.conf
....
postmaster_address = root@localhost

Postfix installieren und konfigurieren

Dovecot ist fertig installiert – jetzt ist Postfix, der Mail Transfer Agent, an der Reihe. Installiert die folgenden Postfix-Pakete:

root:~# apt-get install postfix postfix-mysql

main.cf anpassen

In die Datei /etc/postfix/main.cf werden grundlegende Einstellungen zum MTA geschrieben.

vi /etc/postfix/main.cf
....
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

# BASIC config
#
myhostname = mx.example.com
myorigin = $myhostname
mydestination = $myhostname, localhost
message_size_limit = 20480000
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
relayhost =
mynetworks = <SERVER_IPADDR>/32 127.0.0.0/8
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = all

Für myorigin wird der Hostname des Servers oder die Domain eingetragen. mailbox_size_limit legt die maximale Mailgröße in Bytes fest. Trifft eine E-Mail ein, die größer ist, wird die Übertragung abgebrochen.

SSL / TLS Unterstützung aktivieren

Damit E-Mails nicht nur verschlüsselt via Dovecot empfangen, sondern auch verschlüsselt gesendet werden können, muss auch Postfix SSL/TLS unterstützen. Fügt dazu folgende Konfiguration in die Datei main.cf ein.

vi /etc/postfix/main.cf
# SSL/TLS Settings
#
smtpd_tls_cert_file=/etc/postfix/ssl/ssl-mail.pem
smtpd_tls_key_file=/etc/postfix/ssl/ssl-mail.key
smtpd_use_tls=yes
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtpd_tls_loglevel = 1
smtpd_tls_received_header = yes
smtpd_tls_mandatory_protocols = SSLv3, TLSv1
smtpd_tls_mandatory_ciphers = medium
smtpd_tls_auth_only = yes
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
smtp_tls_loglevel = 1
smtp_use_tls = yes
tls_random_source = dev:/dev/urandom

Wer gültige SSL Zertifikate von einer anerkannten CA besitzt, sollte diese nutzen und die Pfade entsprechend anpassen. Außerdem kann mit gültigen Zertifikaten eine erweiterte SSL-Konfiguration durchgeführt werden, die verschlüsselte Server-Server-Verbindungen zulässt. So funktioniert auch E-Mail made in Germany von GMX, Web.de und der Telekom.

SASL Auth und Submission aktivieren

Im nächsten Schritt wird Postfix so eingestellt, dass dieser den zuvor eingerichteten Auth Socket von Dovecot nutzt, um Benutzerberechtigungen zu ermitteln (in die Datei main.cf einfügen).

vi /etc/postfix/main.cf
# SASL Auth Settings
#
# Die Passwoerter stehen in der Datei /etc/postfix/smtp_auth
#smtp_sasl_password_maps = hash:/etc/postfix/smtp_auth

# Handle SMTP authentication using Dovecot
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = yes
smtpd_sasl_authenticated_header = yes
smtpd_sasl_security_options = noanonymous
broken_sasl_auth_clients = yes

In der Datei /etc/postfix/master.cf wird Submission Support + SASL aktiviert. Der komplette submission-Block inkl -o Parameter wird gelöscht (Zeile löschen in nano mit STRG+K) und durch folgenden Block ersetzt.

root:~# vi /etc/postfix/master.cf
submission inet n       -       -       -       -       smtpd -v
  -o syslog_name=postfix/submission
  -o smtpd_tls_security_level=encrypt
  -o smtpd_sasl_type=dovecot
  -o smtpd_sasl_path=private/auth
  -o smtpd_sasl_security_options=noanonymous
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_client_restrictions=permit_sasl_authenticated,reject

LMTP aktivieren

Postfix soll zum Zustellen von empfangenen E-Mails den LMTP Socket von Dovecot nutzen. Bearbeitet dazu wieder die Datei main.cf.

root:~# vi /etc/postfix/main.cf
....
###### Use Dovecot LMTP Service to deliver Mails to Dovecot ######
virtual_transport = lmtp:unix:private/dovecot-lmtp

Relay Einstellungen

Postfix muss mitgeteilt werden, in welchen Fällen E-Mails wohin geleitet werden dürfen. Ist diese Einstellung fehlerhaft, ist es beispielsweise möglich, über einen fremden Mailserver E-Mail zu versenden. Das kann einem Serverbetreiber großen Ärger einbringen, vor allem wenn über den eigenen Server Spam- oder Phishingmails verschickt werden.

smtpd_recipient_restrictions ist ein Parameter der Client-Beschränkungen definiert. Dies wird dazu benutzt um festzulegen, wer Mails durch den Server relaying darf. In unserem Fall erlauben wir das relaying allen Clients, welche über mynetworks definiert sind. Ebenfalls erlauben wir SASL Clients das relaying. Dann verbieten wir unbekannte Clients, Sender und Empfänger das relaying. Auch ungültige bzw. unbekannte Hostnamen oder Sernder/Empfänger ohne FQDN werden abgewiesen. Außerdem weisen wir Clients, welche auf der Blacklist stehen ab. Mit dem Parameter check_client_access haben wir eine Möglichkeit, definierte Clients das relaying zu erlauben/verbieten. Auch der SPF Eintrag wird wie im Artikel SPF postfix check beschrieben geprüft.

# Restrictions Settings
#
smtpd_client_restrictions =
smtpd_helo_restrictions =
smtpd_sender_restrictions =
smtpd_recipient_restrictions =
   permit_mynetworks,
   permit_sasl_authenticated,
   check_client_access    hash:/etc/postfix/access,
   reject_unknown_client,
   reject_unknown_sender_domain,
   reject_unknown_recipient_domain,
   reject_unauth_pipelining,
   reject_unauth_destination,
   reject_invalid_hostname,
   reject_unknown_hostname,
   reject_non_fqdn_recipient,
   reject_non_fqdn_sender,
   reject_rbl_client zombie.dnsbl.sorbs.net,
   reject_rbl_client zen.spamhaus.org,
   reject_rbl_client blackholes.easynet.nl,
   reject_rbl_client bl.spamcop.net,
   reject_rbl_client rhsbl.sorbs.net,
   check_policy_service unix:private/policy-spf

smtpd_etrn_restrictions =  permit_mynetworks, reject

Adressformat prüfen

In diesen Abschitt der main.cf definieren wir checks für das Adressformat.

# Check address format
#
allow_min_user = no
allow_percent_hack = no
allow_untrusted_routing = no
strict_rfc821_envelopes = yes

SMTP error codes

In diesen Abschitt der main.cf überschreiben wir den smpt error code, welcher für die unten aufgeführten Fehler 450 ist.

# Define SMTP Error codes
#
unknown_address_reject_code  = 554 # default: 450
unknown_hostname_reject_code = 554 # default: 450
unknown_client_reject_code   = 554 # default: 450

MailQueue Einstellungen

In diesen Abschitt der main.cf definieren wir Einstellungen der MailQueue.

# MailQueue settings
#
bounce_queue_lifetime = 2d
maximal_queue_lifetime = 2d
queue_run_delay = 120s

Sonstige Einstellungen

In diesen Abschitt der main.cf definieren noch weitere Einstellungen für den Mailserver.

# Disable canonical address mapping, virtual alias map expansion,
# address masquerading, and automatic BCC (blind carbon-copy) recipients.
receive_override_options = no_address_mappings


# Anwer for RBL-based restriction
default_rbl_reply = $rbl_code RBLTRAP: I don't accept mail from you! - check $rbl_domain


# Disable the SMTP VRFY command.
disable_vrfy_command = yes