E-Mail-Smarthost für den Heimeinsatz #2: Ubuntu, Exim, Dovecot

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.

Dovecot

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.

Exim-Anbindung

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.