Home.

Technik-Blog

Willkommen auf meinem
Notiz - Blog
Blog

Kmoser's Tech-Blog

Montag
01
Januar 2018

Ubuntu 16.04 - Mailserver - Dovecot

Dovecot ist ein Open Source IMAP und POP3 Server, der Dieste bereitstellt um Mails mit einem Client wie Outlook oder Thunderbird abzuholen. Der Server legt die E-Mails im mbox oder Maildir-Format ab.

Die Installation wird analog zu meinem alten Setup ablaufen. Werde die Schritte aber dennoch notieren um sie mir wieder ins Gedächtnis zu rufen und einen vollständigen Notizzettel zu haben :-)

Installation

Für die Installation des Grundsystems benötigt man das Core-Paket (dovecot-core) und mindestens eines der beiden folgenden Pakete:

  • dovecot-imapd
  • dovecot-pop3d

Möchte man nur einen IMAP Server muss man das Paket dovecot-pop3d nicht installieren und umgekehrt.

Damit Dovecot Werte aus einer MySQL Datenbank lesen kann wird noch das Paket dovecot-mysql installiert.

Bash
apt install dovecot-core dovecot-imapd dovecot-mysql

Konfiguration

Die Konfiguration findet zwar grundsätzlich in der Datei /etc/dovecot/dovecot.conf statt, in Ubuntu sind die meißten Optionen allerdings in Dateien in /etc/dovecot/conf.d ausgelagert. Daher ist es eigentlich nicht nötig die Hauptkonfigurationsdatei zu verändern.

Alle Einstellungen die von den Standardeinstellungen abweichen, kann man sich mit

Bash
dovecot -n

anzeigen lassen. Nach Änderungen an der Konfiguration muss natürlich Dovecot neu gestartet werden.

Protokolle

Standardmäßig werden die Protokolle aktiviert, deren Paket man installiert hat. Diese Pakete legen Dateien an die unter /usr/share/dovecot/protocols.d/*.protocol zu finden sind.

10-auth.conf (Benutzerauthentifikation)

Die Benutzer sollen über eine MySQL Datenbank verwaltet werden können. Dazu haben wir ja schon wie in der Einleitung beschrieben das Paket dovecot-mysql installiert.

Die Konfiguration erfolgt über /etc/dovecot/conf.d/10-auth.conf. Hier muss die Zeile für die Authentifikation über das System auskommentiert werden und die Zeile für die Authentifikation am SQL Server einkommentiert werden:

Dovecot
#!include auth-system.conf.ext
!include auth-sql.conf.ext

Außerdem sollen bei einer unverschlüsselten Verbindung keine Klartext Kennwörter erlaubt sein. Dazu aktiviert man in der Datei den Eintrag:

Dovecot
disable_plaintext_auth = yes

auth-sql.conf.ext

Da ich für Benutzer keine besonderen Einstellungen wie Quotas oder ähnliches verwenden möchte, verwende ich die am Ende der Datei /etc/dovecot/conf.d/auth-sql.conf.ext stehende, statische userdb Einstellung. Diese besagt dass für jeden Benutzer ein Verzeichnis unter /var/vmail/[Domainname]/[Benutzername] angelegt wird in dem bessen Mails gespeichert werden.

Dovecot
userdb {
  driver = static
  args = uid=vmail gid=vmail home=/var/vmail/%d/%n
}

Außerdem wird hier festgelegt dass der Zugriff auf die Verzeichnisse über einen gemeinsamen Benutzer namens vmail mit der Gruppe vmail passieren soll.

Diesen Benutzer und die Gruppe muss man anlegen:

Bash
adduser --system --group --no-create-home vmail

Außerdem muss das Verzeichnis /var/vmail angelegt werden und dem Benutzer vmail und der Gruppe vmail zugewiesen werden.

Bash
mkdir /var/vmail
chown vmail:vmail /var/vmail
chmod 0770 /var/vmail

In der Datei /etc/dovecot/auth-sql.conf.ext wird außerdem auf die Datei /etc/dovecot/dovecot-sql.conf.ext referenziert in der weitere Parameter für die Verbindung mit der Datenbank festgelegt werden.

MySQL Datenbank

Für die Authentifikation der Benutzer wird eine MySQL Datenbank benötigt. Sollte der Server noch nicht installiert sein tut man dies mit:

Bash
apt install mysql-server

Wie in der Datei /etc/dovecot/dovecot-sql.conf.ext beschrieben muss man eine neue Datenbank mit ein paar Tabellen anlegen. Die Datenbank bekommt den Namen vmail. Dieser Name wird in den meißten Anleitungen im Netz gewält. Als Kollation verwende ich utf8_general_ci.

Sql
CREATE DATABASE vmail
  DEFAULT CHARACTER SET utf8
  DEFAULT COLLATE utf8_general_ci;

Für den Zugriff auf die Datenbank wird noch ein Benutzer benötigt.

Sql
GRANT ALL PRIVILEGES
  ON vmail.*
  TO 'vmail'@'localhost'
  IDENTIFIED BY 'mysecret';

Als nächstes die Benutzertabelle:

Sql
CREATE TABLE users (
     username VARCHAR(128) NOT NULL,
     domain VARCHAR(128) NOT NULL,
     password VARCHAR(128) NOT NULL,
     PRIMARY KEY (username, domain)
);

Benutzer anlegen

Um einen Benutzer anzulegen muss man einen Eintrag in der users - Tabelle mit Benutzernamen, Domain und einem Passwort-Hash erzeugen. Den Passwort-Hash kann man z.B. erzeugen mit:

Bash
doveadm pw -s SHA512-CRYPT

Es wird zweimal um die Eingabe des neuen Passworts gefragt und dann der Hash ausgegeben. Das {SHA512-CRYPT} am Anfang muss man weglassen, da es nur den verwendeten Algorithmus zeigt.

Sql
INSERT INTO users
 (username, domain, password)
 values
 ('benutzer1', 'meinedomain.de', '$6$A3Z[...]MCQgfsz');

dovecot-sql.conf.ext

Sind die Tabellen angelegt, können wir uns an die Konfiguration machen. Dazu editiert man die Datei /etc/dovecot/dovecot-sql.conf.ext.

Hier wählt man zunächst die Verbindungsart aus. Nicht vergessen die benötigten Einträge auch einzukommentieren.

Dovecot
driver = mysql

Als nächstes legt man die Verbindungsparameter fest. Man kann statt dem Socket auch localhost verwenden.

Dovecot
connect = host=/var/run/mysqld/mysqld.sock dbname=vmail user=vmail password=mysecret

Der voreingestellte Hashing Algorithmus MD5 gilt nicht als besonders sicher. Daher verwende ich als Passwort Schema den stärkeren SHA512-CRYPT Algorithmus.

Dovecot
default_pass_scheme = SHA512-CRYPT

Den Passwort-Query kann man so einkommentieren wie er im Beispiel steht:

Dovecot
password_query = \
  SELECT username, domain, password \
  FROM users WHERE username = '%n' AND domain = '%d'

10-mail.conf (Mailbox Format und Speicherort)

Dovecot kann Postfächer im mbox sowie im Maildir Format verwalten. Bei der mbox Variante werden alle Mails in einer Datei gespeichert, beim maildir Format ist jede Mail eine eigene Datei.

Standardmäßig ist das mbox Format voreingestellt und das INBOX Verzeichnis des Postfachs liegt unter /var/mail/%u und die restlichen Verzeichnisse im Benutzerordner unter ~/mail.

Da mein bisheriger Mailbestand auf Maildir basiert und Maildir einfacher zu handhaben ist und obendrein auch fehlertoleranter ist, werde ich Dovecot so konfigurieren dass Dovecot wieder das Maildir Format verwendet.

Dazu editiert man die Datei /etc/dovecot/conf.d/10-mail.conf und trägt als mail_location folgendes ein:

Dovecot
mail_location = maildir:/var/vmail/%d/%n/Maildir

Zusätzlich muss noch unser neuer Systembenutzer vmail sowie dessen Gruppe in diese Datei eingetragen werden:

Dovecot
mail_uid = vmail
mail_gid = vmail
mail_privileged_group = vmail 

Damit wird Dovecot mitgeteilt, wie und mit welchem Benutzer/Gruppe auf die Mailbox Verzeichnisse zugegriffen werden soll.

10-master.conf

Als nächste Datei kommt die /etc/dovecot/conf.d/10-master.conf.

Da ich IMAP nur über Port 143 mit TLS erlauben möchte, habe ich iher IMAPS deaktiviert indem ich den Port auf 0 gesetzt habe.

Dovecot
service imap-login {
  inet_listener imap {
    #port = 143
  }
  inet_listener imaps {
    port = 0
    #ssl = yes
  }
}

Außerdem habe ich hier dem Benutzer vmail Zugriff auf den Auth-Socket von Dovecot gegeben:

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

10-ssl.conf (Verbindung absichern mit TLS/SSL)

Die SSL/TLS Konfiguration kann angepasst werden indem man die Datei /etc/dovecot/conf.d/10-ssl.conf editiert. Ich empfehle ein Zertifikat von Let's encrypt zu verwenden. Man kann während der Einrichtung aber auch das selbst signierte Zertifikat von Ubuntu verwenden. Dieses kann man installieren und erzeugen mit:

Bash
apt-get install ssl-cert
make-ssl-cert generate-default-snakeoil

Damit werden diese beiden Dateien erzeugt:

SSL-Zertifikat /etc/ssl/certs/ssl-cert-snakeoil.pem
SSL-Schlüssel /etc/ssl/private/ssl-cert-snakeoil.key

Spätestens wenn der Server mal Live geht sollte das Zertifikat gegen eines von Let's encrypt ersetzt werden. Zum Testen während der Einrichtung wird dieses aber erst mal reichen.

Folgende Anpassungen werden jetzt in der Datei /etc/dovecot/conf.d/10-ssl.conf gemacht:

Dovecot
# SSL/TLS support: yes, no, required. <doc/wiki/SSL.txt>
ssl = required

# PEM encoded X.509 SSL/TLS certificate and private key.
#ssl_cert = </etc/ssl/certs/ssl-cert-snakeoil.pem
#ssl_key = </etc/ssl/private/ssl-cert-snakeoil.key
ssl_cert = </etc/letsencrypt/live/www.mydomain.de/fullchain.pem
ssl_key = </etc/letsencrypt/live/www.mydomain.de/privkey.pem


# DH parameters length to use.
ssl_dh_parameters_length = 2048

# SSL protocols to use
ssl_protocols = !SSLv2 !SSLv3

# SSL ciphers to use
ssl_cipher_list = EDH+CAMELLIA:EDH+aRSA:EECDH+aRSA+AESGCM:EECDH+aRSA+SHA256:EECDH:+CAMELLIA128:+AES128:+SSLv3:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!DSS:!RC4:!SEED:!IDEA:!ECDSA:kEDH:CAMELLIA128-SHA:AES128-SHA

# Prefer the server's order of ciphers over client's.
ssl_prefer_server_ciphers = yes

Um zu testen ob das Zertifikat korrekt eingebunden wurde kann man folgenden Befehl verwenden:

Bash
echo "quit" | openssl s_client -starttls imap -connect www.mydomain.de:imap

Funktioniert natürlich nur dann wenn der Dovecot Server neu gestartet wurde und die zuletzt getätigten Einstellungen auch übernommen wurden.

15-lda.conf

In der Datei /etc/dovecot/conf.d/15-lda.conf habe ich nur die Postmaster-Adresse gesetzt damit ich mitbekomme, wenn eine Zustellung fehlschlägt.

Dovecot
postmaster_address = webmaster@fam-moser.de

15-mailboxes.conf

In der Datei /etc/dovecot/conf.d/15-mailboxes.conf werden Details zu den Mailboxen wie z.B. Unterordner die standardmäßig angelegt werden definiert. Ich habe hier die Standard-Order so eingestellt dass diese automatisch aboniert werden.

Dovecot
namespace inbox {
  # These mailboxes are widely used and could perhaps be created automatically:
  mailbox Drafts {
    auto = subscribe
    special_use = \Drafts
  }
  mailbox Junk {
    auto = subscribe
    special_use = \Junk
  }
  mailbox Trash {
    auto = subscribe
    special_use = \Trash
  }
}

Dovecot neu starten

Zum Abschluss dieses Schrittes muss man jetzt dem Dovecot neu starten:

Bash
systemctl restart dovecot

E-Mail Client

Jetzt sollte man sich mit einem E-Mail Client mit dem IMAP-Server verbinden können. Man wird eine Warnung wegen dem selbst signierten Zertifikat bekommen für welches man eine Ausnahme festlegen muss. Dann sollte die Verbindung aber klappen. Folgende Einstellungen sollten gewählt werden:

Einstellung Wert
Verbindungsart IMAP
Port 143
Verbindungssicherheit STARTSSL
Authentifizierung Passwort, normal

Vorbereitungen für Postfix

Postfix wird später anfragen an Dovecot stellen, ob ein Benutzer berechtigt ist Mails zu versenden. Dazu muss Dovecot einen Socket bereitstellen über den Postfix seine Anfragen stellen kann. Der Socket wird in der Datei /etc/dovecot/conf.d/10-master.conf konfiguriert.

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

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

LMTP Socket

Für die lokale Zustellung in die Postfächer wird LMTP (Local Mail Transport Protocol) verwendet, das ähnlich wie SMTP ist. Dazu wird das Paket dovecot-lmtpd benötigt.

Bash
apt install dovecot-lmtpd

Dazu richten wir postfix nochmal einen Socket in der Datei /etc/dovecot/conf.d/10-master.conf ein:

Dovecot
service lmtp {
  unix_listener /var/spool/postfix/private/dovecot-lmtp {
    mode = 0660
    user = postfix
    group = postfix
  }
}