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.
Eigentlich würde man mit der Konfiguration von Postfix anfangen, da dieser die Mails in die Postfächer zustellt, da mein Plan aber darin besteht die Zustellung per fetchmail zu machen, fange ich mit dovecot an.
Für die Installationdes Grundsystems benötigt man das Core-Paket und mindestens eines der beiden anderen Pakete:
- dovecot-core
- dovecot-imapd
- dovecot-pop3d
Möchte man nur einen IMAP Server muss man das Paket dovecot-pop3d nicht installieren und umgekehrt.
sudo apt-get install dovecot-core dovecot-imapd
Hat man das Metapaket für den Mailserver installiert kann man das Paket wieder deinstallieren mit:
sudo apt-get purge dovecot-pop3d
Zusätzlich benötigen wir das Paket dovecot-lmtpd für die lokale Zustellung der E-Mails über LMTP.
sudo apt-get install dovecot-lmtpd
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
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.
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:
#!include auth-system.conf.ext
!include auth-sql.conf.ext
Die Datei /etc/dovecot/auth-sql.conf.ext referenziert wiederum die Datei /etc/dovecot/dovecot-sql.conf.ext in der weitere Parameter für die Verbindung mit der Datenbank festgelegt werden.
Wie in der Datei beschrieben muss man eine neue Datenbank mit ein paar Tabellen anlegen. Die Datenkbank nenne ich vmail, da diese nicht nur für dovecot benutzt werden soll, sondern später auch für Postfix herhalten muss. Als Kollation verwende ich utf8_general-ci.
CREATE DATABASE vmail
DEFAULT CHARACTER SET utf8
DEFAULT COLLATE utf8_general_ci;
Als nächstes die Benutzertabelle:
# Tabelle für Benutzer
CREATE TABLE users (
username VARCHAR(128) NOT NULL,
domain VARCHAR(128) NOT NULL,
password VARCHAR(128) NOT NULL,
PRIMARY KEY (username, domain)
);
Zusätzlich brauchen wir noch einen Benutzer, der Zugriff auf diese Tabellen hat.
GRANT ALL PRIVILEGES
ON vmail.*
TO 'vmail'@'localhost'
IDENTIFIED BY 'mysecret';
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.
driver = mysql
Als nächstes legt man die Verbindungsparameter fest. Man kann statt dem Socket auch localhost verwenden.
connect = host=/var/run/mysqld/mysqld.sock dbname=vmail user=vmail password=mysecret
Als Passwort Schema wähle ich den starken SHA512-CRYPT Algorithmus.
default_pass_scheme = SHA512-CRYPT
Den Passwort-Query kann man so einkommentieren wie er im Beispiel steht:
password_query = \
SELECT username, domain, password \
FROM users WHERE username = '%n' AND domain = '%d'
In anderen Anleitungen wird behauptet dass die letzte Zeile in der Konfigurationsdatei ebenfalls einkommentiert werden muss.
iterate_query = SELECT username AS user FROM users
Bei mir hat das allerdings zu Fehler im Log geführt.
dovecot: auth: Warning: sql: Ignoring changed iterate_query in /etc/dovecot/dovecot-sql.conf.ext, because userdb sql not used. (If this is intentional, set userdb_warning_disable=yes)
Ich habe sie daher draußen gelassen.
Den User-Query würde man nur dann benötigen, wenn man für die Mail Benutzer verschiedene Einstellungen bezüglich Benutzer/Gruppe/Speicherort definieren wollten. Da ich das nicht möchte wird noch der userdb Eintrag in der Datei /etc/dovecot/conf.d/auth-sql.conf.ext geändert so dass immer fetgelegte Werte verwendet werden:
#userdb {
# driver = sql
# args = /etc/dovecot/dovecot-sql.conf.ext
#}
# If you don't have any user-specific settings, you can avoid
# the user_query by using userdb static instead of userdb sql,
# for example:
# <doc/wiki/UserDatabase.Static.txt>
userdb {
driver = static
args = uid=vmail gid=vmail home=/var/vmail/%d/%n
}
In phpmyadmin gibt es leider keine Funktion um einen SHA512 Hash direkt zu erzeugen. Das Passwort kann allerdings auf der Kommandozeile mit Dovecot erzeugt werden:
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.
INSERT INTO users
(username, domain, password)
values
('benutzer1', 'meinedomain.de', '$6$A3Z[...]MCQgfsz');
Um zu Testen ob die Verbindung zu Datenbank furnktioniert, kann man sich alle Benutzer anzeigen lassen die in der Datebank angelegt sind.
Dazu muss man allerdings für die Zeit des Testens die userdb Einstellung in der Datei /etc/dovecot/conf.d/auth-sql.conf.ext wieder auf driver = sql stellen.
doveadm user '*'
Hier sollten jetzt alle Benutzer auftauchen die man in der MySQL Datenbank definiert hat.
Nicht vergessen nach Abschluss des Tests die Einstellungen für userdb wieder auf die driver = static Variante zurückzustellen.
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.
Ich würde allerdings lieber die maildir Variante bevorzugen, da ich bereits auf meiner NAS mein Postfach im maildir Format habe und ich auch sonst das Maildir Format besser zu handlen finde.
Zuerst legen wir das Verzeichnis für die Postfächer an
sudo mkdir /var/vmail
Dann brauchen wir einen Benutzer und eine Gruppe unter dem Dovecot auf die Postfächer zugreifen soll
addgroup vmail
adduser --ingroup vmail --no-create-home --shell /bin/false vmail
Diesen Benutzer tragen wir jetzt in die Datei /etc/dovecot/conf.d/10-mail.conf ein.
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.
Außerdem müssen wir in dieser Datei Dovecot mitteilen, in welchem Ordner und in welcher Form die Mails gespeichert werden sollen. Wie ich schon erwähnt habe, möchte ich das Maildir Format benutzen, da es einfacher zu handhaben ist und auch fehlertoleranter ist.
mail_location = maildir:/var/vmail/%d/%n/Maildir
eine weitere Möglichkeit wäre
mail_location = maildir:/var/vmail/%d/%n/Maildir:LAYOUT=fs
wenn man möchte dass die Ordnerstruktur im Mail-Client dr Ordnerstruktur im Dateisystem entspricht. Ich werde erstere Variante benutzen, da mein Maildir bereits in diesem Format vorliegt und ich die Mischung der Dovecot Verzeichnisse cur, new und tmp mit den richtigen Unterordnern auch nicht so wirklich schön finde.
Als nächstes müssen die Rechte für das Verzeichnis /var/vmail gesetzt werden:
sudo chown vmail:vmail -R /var/vmail/
sudo chmod 0770 /var/vmail
Normalerweise benutzt Dovecot den Benutzer und die Gruppe des Systembenutzers des Mailaccounts. Da wird aber virtuelle Benutzer verwenden gibt es diese Benutzer ja nicht und wir verwenden für den Zugriff auf das Dateisystem stattdessen den Benutzer vmail.
Verbindung absichern mit TLS/SSL
Die SSL/TLS Konfiguration kann angepasst werden indem man die Datei /etc/dovecot/conf.d/10-ssl.conf editiert. Man kann z.B. das selbst signierte Zertifikat verwenden, das bei der Ubuntu Installation meisst schon vorhanden ist. Keine Ahnung bei welcher Installation von welchem Paket das erzeugt wird.
# SSL/TLS support: yes, no, required. <doc/wiki/SSL.txt>
ssl = yes
# 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
Man kann die Verschlüsselung erzwingen wenn man die folgende Einstellung setzt:
ssl = required
Eine Verbindung zum Server ist dann nur noch über die SSL/TLS Ports möglich. Bei IMAP ist das Port 993. Laut RFC 2595 (Kapitel 7) ist das allerdings nicht mehr gewollt und man sollte stattdessen lieber den Standardport 143 mit STARTTLS verwenden.
Bei gechainten SSL Zertifikaten kommen alle Zertifikate in die Datei, die in ssl_cert angegeben wurde und zwar in dieser Reihenfolge:
- Zertifikat des Dovecot Servers
- Chained Zertifikat
- CA Zertifikat
Das Zertifikat und den Key könnte man z.B. dann so anlegen:
ssl_cert = </etc/ssl/startssl/dovecot/dovecot.pem
ssl_key = </etc/ssl/startssl/private/key.pem
Nicht vergessen das Zertifikat, bzw. den Key vor ungewolltem Zugriff zu schützen:
chown root:root /etc/ssl/startssl/dovecot/dovecot.pem
chmod 0600 /etc/ssl/startssl/dovecot/dovecot.pem
chown root:root /etc/ssl/startssl/private/key.pem
chmod 0600 /etc/ssl/startssl/private/key.pem
Um die Verbindungssicherheit weiter zu erhöhen kann man die vorgeschlagene Cipherliste von https://bettercrypto.org/ verwenden.
# SSL protocols to use
ssl_protocols = !SSLv2 !SSLv3
# SSL ciphers to use
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
# Prefer the server's order of ciphers over client's.
ssl_prefer_server_ciphers = yes
Um eine Anmeldung mit einem Klartextpasswort ohne die Verwendung einer verschlüsselten Verbindung mit TLS/SSL zu verhindern kann man eine Einstellung in der Datei /etc/dovecot/conf.d/10-auth.conf aktivieren:
disable_plaintext_auth = yes
Um die Änderungen anzuwenden, den Dovecot Server neu starten:
sudo service dovecot restart
Zum Testen der SSL Verbindung kann man sich mit dem dovecot Server verbinden und das Zertifikat auslesen. Für den IMAPS (993) Port geht das mit folgendem Befehl:
echo "quit" | openssl s_client -connect localhost:imaps
Um den Standardport von IMAP (143) mit STARTTLS zu testen benutzt man
echo "quit" | openssl s_client -starttls imap -connect localhost:imap
Es sollte etwas wie das folgende herauskommen
CONNECTED(00000003)
depth=0 CN = test-nas
verify error:num=18:self signed certificate
verify return:1
depth=0 CN = test-nas
verify return:1
---
Certificate chain
0 s:/CN=test-nas
i:/CN=test-nas
---
Server certificate
-----BEGIN CERTIFICATE-----
MIICtjCCAZ6gAwIBAgIJAL4I9/wT0r5+MA0GCSqGSIb3DQEBCwUAMBMxETAPBgNV
BAMTCHRlc3QtbmFzMB4XDTE0MDUxNzA5MzYxNFoXDTI0MDUxNDA5MzYxNFowEzER
MA8GA1UEAxMIdGVzdC1uYXMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB
AQC9Rm9cb9xn2vIuk9n2OgEb1AR5Ka+lR67avte0PNdwq6X91o4+mgEpYEsMx/Zl
ScVJYxs/MGRn0NXl7W74/E+fnR84QntnrM6hT5AewuwfxjlE0byiED3c5fhAvI9o
MXJjZ4icCc+kUuv1CkARhgVd8SWvUM5ezJWQDofRkclx49DCvvvgk9uqBbju2LMf
Ah6tOHdUBrMewHnS3X9gP52gn+JBCwr/iTgzab5yhV7EMetu7y7yQngnpWOYGNJ/
gWAOe60E+2t56e+IXLKFx0EDIf8tP+aw8228IWVIkyVZJ75o7EHz65BXPXek3hKx
R7qQj8FvtReFOfGc8GmQ2WOvAgMBAAGjDTALMAkGA1UdEwQCMAAwDQYJKoZIhvcN
AQELBQADggEBAGfJNs6wP9dxFSiaWJ9E8W2ctfg08xm76E7nTDy6ebBfvXoENoUP
X7ssnJTelcePVTIPvrKGRmtysQUkxPGuKuhGb65DsEJwpPeey0NBY+tw1ZRyg6GC
lawxi3TmMuhvkHHhSveYZh8W984NCSXViLMqAZjn7KsIZO2atnBlUdexQIx+Yfpr
W94jARAF7ltn3bm3gyYejVVLX7D9mTutHj0s+p3oICRYCmsnJaCLskjvuG/BohhB
agFPwVv6XqLHvnkHoipbMNdkDhMaygD/ipOFyti27V91LIxzdxmjDYQhJD/cZC9T
tIPYQLRNKZjiwpKYYiPdpP+O2aHEL7CCCng=
-----END CERTIFICATE-----
[...]
Weitere Infos gibt's z.B. im Dovecot Wiki.
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.
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
}
}
Für die lokale Zustellung in die Postfächer wird LMTP (Local Mail Transport Protocol) verwendet, das ähnlich wie SMTP ist. Dazu richten wir postfix nochmal einen Socket in der Datei /etc/dovecot/conf.d/10-master.conf ein:
service lmtp {
unix_listener /var/spool/postfix/private/dovecot-lmtp {
mode = 0660
user = postfix
group = postfix
}
}
Damit wir mitbekommen, wenn eine Zustellung fehlschlägt, muss in der Datei /etc/dovecot/conf.d/15-lda.conf die Adresse für den Postmaster auf eine gültige Adresse gesetzt werden und der Eintrag dafür einkommentiert werden.
postmaster_address = postmaster@mydomain.de
Siehe auch Dovecot Wiki.
Verwendet man Thunderbird als Mail Client und :LAYOUT=fs sollte man noch folgende Option in /etc/dovecot/conf.d/20-imap.conf setzen:
imap_client_workarounds = tb-extra-mailbox-sep
Siehe auch Dovecot Wiki.
Nach dem Ändern der Konfiguration muss Dovecot neu gestartet werden oder mitgeteilt werden, dass er die Konfiguraiton neu laden soll. Den Serverdienst startet man mit
sudo service dovecot start
und stoppt ihn mit
sudo service dovecot stop
und startet ihn neu mit
sudo service dovecot restart
Mein erster Versuch einfach die Ordner des Maildir Verzeichnisses auf den neuen Server zu kopieren und dann in Thunderbird die Ordner per "Abonnieren..." hinzuzufügen hat direkt mal geklappt.
Alle Mails waren da, allerdings alle als "Ungelesen". Mal sehen ob ich da noch eine bessere Methode finde.
Im E-Mail Client, wie z.B. Thunderbird müssen folgende Werte für den Abruf von Mails vom IMAP Konto eingestellt werden:
Einstellung
|
Wert
|
Verbindungsart
|
IMAP
|
Port
|
143
|
Verbindungssicherheit
|
STARTSSL
|
Authentifizierung
|
Passwort, normal
|
Falls es doch mal nicht so klappt wie man will, sollte man die beiden folgenden Dateien im Auge behalten:
/var/log/mail.err
/var/log/mail.log
Der kleine Helfer multitail bietet sich da an. Damit lassen sich mehrere Logs auf einmal ansehen.
multitail /var/log/mail.err /var/log/mail.log
Sollten die Logs nicht genügend Informationen zur Lösung eines Problems liefern, so sollte man einen Blick in die Datei /etc/dovecot/conf.d/10-logging.conf werfen. Hier kann man auf vielfältige Weise den Informationsgehalt der Log-Dateien anpassen.