Nachdem ich längere Zeit keine Gelegenheit hatte, an meinem Setup zu schrauben, war es nun endlich an der Zeit, meinen Mail-Server neu aufzusetzen. Dieses Mal sollte als IMAP-Backend Dovecot zum Einsatz kommen, da der Cyrus doch sehr komplex und schwerfällig ist. Als System kommt Ubuntu 9.04 ("Jaunty Jackalope") zum Einsatz, da die betreffende Maschine auch Desktop-Aufgaben übernimmt.
Wir fangen dieses Mal mit dem IMAP-Server an. Nach dessen Installation mittels
apt-get install dovecot-imapd
muß die Konfiguration in /etc/dovecot/dovecot.conf angepaßt werden. Der Ubuntu-Dovecot ist im Prinzip einfach von Debian übernommen worden und funktioniert beinahe ohne Anpassungen. Die mitgelieferte Konfiguration is riesig (beinahe 50 Kilobytes), wovon aber mindestens 90% Kommentare darstellen. Ich zeige hier in stark verkürzter Form nur die Stellen, die angepaßt bzw. kontrolliert werden müssen:
protocols = imap imaps
mail_location = maildir:~/Mail:LAYOUT=fs
mail_privileged_group = mail
protocol imap { # Kann leer bleiben, muß aber definiert sein
}
protocol lda {
postmaster_address = postmaster@fendt.net
hostname = romulus.mail.fendt.net
}
auth_verbose = yes
auth default {
mechanisms = plain login
passdb passwd-file { # Getrennte Datei für Kennwoerter
args = /etc/dovecot/passwd
}
userdb passwd { # Benutzer-Pruefung per /etc/passwd
}
user = root
socket listen { # SASL-Dienst fuer Exim zur Verfuegung stellen
client {
path = /var/run/dovecot/auth-client
mode = 0666 # Schreib-/Leserechte, sonst kann Exim den Socket nicht oeffnen
}
}
}
Das war es eigentlich schon. Wir haben hier Dovecot angewiesen, für die Prüfung eines Benutzers erst das System zu fragen ("userdb"-Eintrag), und dann das Kennwort in einer getrennten Datei zu suchen ("passdb"-Eintrag). Auf diese Weise erhalten Mail-Benutzer eigene Kennwörter, was sicherheitstechnisch natürlich schon sinnvoll ist.
Die "socket"-Zeilen ermöglichen es, daß Exim später bei Dovecot nachfragen kann, ob ein Benutzer existiert, bzw. auch ob das Kennwort stimmt. Die Zeile mit "mail_location" legt fest, daß E-Mails im Homeverzeichnis unter "Mail/" abgelegt werden, und zwar im Maildir-Format mit Unterverzeichnissen. Maildir ist schnell und skaliert auch mit großen Ordnergrößen gut. Dovecot legt als Default "mbox"-Dateien an, was auch funktioniert, aber insbesondere bei größeren Ordnern langsam werden kann.
Bevor wir die Datei /etc/dovecot/passwd anlegen, muß jetzt eine Entscheidung getroffen werden. Nämlich die, ob in dieser Datei Klartext-Passwörter enthalten sein sollen oder nicht. Wenn Dovecot das Kennzeichen im Klartext vorliegen hat, kann es selbst daraus diverse verschlüsselte Formen ("Hashes") erzeugen, was zur Anmeldung an den Server u.U. sinnvoll sein kann. Die meisten Clients unterstützen es jedoch nur andersherum: der Client schickt das Kennwort im Klartext ("plain") an den Server, und dieser vergleicht dort. Für diese Form der Prüfung muß Dovecot das Kennwort aber nicht im Klartext kennen. Im hier gezeigten Konfigurationsbeispiel haben wir Dovecot deshalb auf "plain"-Authentifizierung eingestellt.
Ein Klartext-Passwort wird einfach durch Anhängen einer Zeile in folgendem Format eingetragen:
bob:{PLAIN}foo
Um einen SHA1-Hash eines Kennwortes zu erzeugen und zusammen mit einem Benutzernamen in die passwd-Datei zu schreiben, ist bei Dovecot ein wenig Handarbeit nötig, besonders kompliziert ist es allerdings nicht. Hier sei noch einmal angemerkt, daß diese Variante ausschließlich für Systeme mit wenigen Nutzern gedacht ist. Bei vielen Nutzern, die ihre Kennwörter ohne Hilfe ändern können sollen, rate ich dringend zu anderen Lösungen wie zum Beispiel einem LDAP-Verzeichnis.
echo "alice:"`dovecotpw -s sha1`" >> /etc/dovecot/passwd
hängt eine Zeile mit Passwort-Hash an:
bob:{SHA1}C+7Hteo/D9vJXQ3UfzxbwnXaijM=
Es können auch unterschiedliche Hash-Formate und Klartext-Kennwörter in derselben passwd-Datei gemischt werden, das ist Dovecot ziemlich egal. So, zum Schluß noch den Server mittels "invoke-rc.d dovecot restart" neu starten, und unser IMAP-Dienst sollte laufen.
Die Exim-Konfiguration verläuft ähnlich wie im letzten Text beschrieben. Wir benötigen dieses Mal allerdings zwingend die "heavy"-Version des Exim-Daemons.
apt-get install exim4-daemon-heavy dpkg-reconfigure exim4-config
Nun die Smarthost-Konfiguration auswählen, Lokale Domain-Namen und Netzwerk-Adressen wie gehabt einstellen. In /etc/exim4/passwd.client das Smarthost-Kennwort eingeben, den root-Alias in /etc/aliases eintragen und mittels /usr/share/doc/exim4-base/examples/exim-gencert Zertifikate erzeugen, falls SSL/TLS-Support gewünscht ist. In diesem Fall auf keinen Fall die Makro-Variable "MAIN_TLS_ENABLE = 1" zu setzen vergessen. Zum Schluß noch in conf.d/transport/30_exim4-config_remote_smtp_smarthost die beiden Zeilen
hosts_require_auth = * hosts_require_tls = *
zufügen. Um Exim zu veranlassen, Authentifizierungs-Nachfragen über Dovecot abzuwickeln, benötigen wir die Datei conf.d/auth/40_dovecot_sasl mit folgendem Inhalt:
ovecot_login: driver = dovecot public_name = LOGIN server_socket = /var/run/dovecot/auth-client server_set_id = $auth1 dovecot_plain: driver = dovecot public_name = PLAIN server_socket = /var/run/dovecot/auth-client server_set_id = $auth1
Nun noch die Serverkonfiguration mittels
update-exim4.conf invoke-rc.d exim4 restart
wirksam werden lassen, und Exim müßte (vorerst) korrekt eingerichtet sein. Nun kann man erste Tests machen, ob die Kennwort-Prüfung funktioniert, bzw. man kann auch schon auf den Dovecot-Server zugreifen. Was bisher noch fehlt, ist die Zustellung eingehender Mails in die IMAP-Mailboxen.
Hierzu legen wir eine neue Datei conf.d/transport/20_dovecot_delivery an mit folgendem Inhalt:
dovecot_delivery: driver = pipe command = /usr/lib/dovecot/deliver message_prefix = message_suffix = log_output delivery_date_add envelope_to_add return_path_add #group = mail #mode = 0660
Nun aktivieren wir diesen Transport durch den Eintrag
dc_localdelivery='dovecot_delivery'
in update-exim4.conf.conf. Das war's auch schon. Noch einmal die Konfiguration neu erstellen und Exim neu starten, fertig.