Dovecot Exim Howto Ubuntu 14.04TLS

1) Einleitung

Vor einigen Jahren stellte ich für Ubuntu 9.10 ein auf dem sehr gutem Exim/Dovecot Howto von struction.de eine komplette Konfiguration basierend auf Exim, Dovecot, mysql für Ubuntu zur Verfügung. Leider haben sich in den Jahren die Pakete, Konfiguration der Anwendungen usw. sehr verändert, so daß eine Installation mit dem alten Howto unter Ubuntu 12.04 und späteren Versionen nicht mehr möglich war. 


Nachfolgend eine aktuelle Version, die auf Ubuntu 14.04 LTS aufbaut

1.1) Was wird geliefert

  • SMTP (Exim4)
  • IMAP, POP3 (Dovevot)
  • Sieve Unterstützung
  • Userverwaltung mit Weboberfläche
  • mysql Backend
  • wahlweise mit/ohne Smarthost Funktionalität für lokale Mailserver
  • Virus Check durch ClamAV (all Credits to Struction.de)
  • Spam Check durch Spamassassin (all Credits to Struction.de)
  • SQL Userverwaltung per PHP Frontend oder per Shell Script (Todo)

2) Pakete installieren

Fangen wir zunächst mit den Paketen an:

  • exim4-daemon-heavy
  • dovecot-common, dovecot-imapd, dovecot-pop3d, dovecot-mysql
  • clamav-daemon, clamav, clamav-freshclam
  • spamassassin
  • mysql-server, mysql-client
  • Optionale Pakete (zur Verwaltung via Webinterface): apache2, phpmyadmin
apt-get install exim4-daemon-heavy dovecot-common dovecot-imapd dovecot-pop3d clamav-daemon clamav clamav-freshclam spamassassin mysql-server mysql-client phpmyadmin apache2 dovecot-mysql  

Sollte man hier gefragt werden, ob man ein Zertifikat erstellen möchte, kann das an diesem Punkt übersprungen werden! 
Zudem werden Passwörter für mysql, phpmyadmin usw. abgefragt. 

2.1) User anlegen

Außerdem richten wir noch zwei User ein: Einmal für Spamassassin und einmal für die Mails. Letztendlich kann jedes Verzeichnis bzw. Usernamen genommen werden, ich wähle /var/mails und den User „mails“ für die Emails und den User „spamd“ für Spamassassin.

groupadd spamd
useradd -g spamd -s /bin/false -d /home/spamd spamd
mkdir /home/spamd
chown spamd:spamd /home/spamd
groupadd emails
useradd -g emails -s /bin/false -d /var/mails emails
mkdir /var/mails
chown emails:emails /var/mails

Nun merken wir uns noch, welche User- und Gruppen ID der User hat. In unserem Fall also die User-ID 1002 und die Gruppen ID 1002. Merken!

# grep emails /etc/passwd
emails:x:1002:1002:,,,:/var/mails/:/bin/false
In unserem Fall also die User-ID 1002 und die Gruppen ID 1002. Merken!

3) Mysql

Zunächst legen wir einen MySQL- User an für die Email Userverwaltung in mySQL. Hier muss man natürlich beim verbinden mit dem mysql Server das gewählte Passwort setzen, bei „identified by ‚exim_pass'“ muss natürlich „exim_pass“ durch ein neu gewähltes Passwort ersetzt werden. Auf Wunsch kann natürlich auch der Username (hier: „exim_user) frei gewählt werden, dann aber später konsequent auch in der config ändern!


mysql -u root -p (mit mySQL verbinden)
create database exim4;
grant usage on *.* to exim_user@localhost identified by 'exim_pass';
grant all privileges on exim4.* to exim_user@localhost ;

Die passende mySQL Struktur kann man hier herunterladen: www.stonki.de/fileadmin/files/exim4/exim4.sql

Anschließend wie folgt importieren:

mysql -u exim_user  -p exim4 < exim4.sql

3.1) greylist Tabelle löschen

Die Greylist Tabelle füllt sich nach und nach. Daher ist ein regelmäßiges löschen angebracht. Das kann man entweder per cronjob durchführen oder ab mySQL 5.1.x per mySQL Eventsteuerung. Dazu muß man zunächst die mySQL Events in der my.cnf von mySQL aktivieren. Dieses kann man durch eine das Erstellen der Datei /etc/mysql/conf.d/mysqld_event.cnf geschehen, die folgenden Inhalt an:

cat /etc/mysql/conf.d/mysqld_event.cnf

[mysqld]

# Event event_scheduler = 1

und den mysql server neu starten!

dann noch das passende Event in mysql eintragen:

mysql -u root -p 
use exim4;
DROP EVENT `clear_greylist`;
CREATE EVENT `clear_greylist` ON SCHEDULE EVERY 300 SECOND STARTS '2009-11-07 09:37:16' ON COMPLETION NOT PRESERVE ENABLE DO delete from greylist where(FROM_UNIXTIME(first_seen)+INTERVAL 2 DAY) < NOW();

kontrollieren durch:

mysql -u root -p 
use exim4;
show events;

4) Exim installieren

Unter Ubuntu (basierend auf Debian) ist die Config auf dem ersten Blick verwirrend, da es bei Debian verschiedene Möglichkeiten gibt, wie Exim verwaltet wird. Sofern man Debian seine Config pflegen lassen möchte, so kann man Einstellungen in „/etc/exim4/update-exim4.conf“ vornehmen und dann mit ‚dpkg-reconfigure exim4-config‘ übernehmen. Siehe auch /usr/share/doc/exim4-base/README.Debian.g für mehr Details.

Wenn jedoch unter Ubuntu/Debian eine /etc/exim4/exim4.conf Datei vorhanden ist, dann wird diese als lokale Config genommen und der gesamte Automatismus ignoriert. Dies ist die Möglichkeit die ich bevorzuge und in diesem Howto auch einsetze.

4.1) exim4.conf installieren

Eine fertige Exim Config für dieses Setup kann man hier herunterladen:

/etc/exim4/exim4.conf  (http://www.stonki.de/fileadmin/files/exim4/exim4.conf)

Anschließend muss man die notwendigen Änderungen vornehmen. Die Zeilen die unbedingt geändert werden müssen, sind mit „#CHANGEME“ gekennzeichnet!

Zeile 20: hier werden die mySQL Zugangsdaten eingetragen:

hide mysql_servers = MYSQL_HOST/EXIM_DB/EXIM_USER/EXIM_PASS

Zeile 47: hier die lokalen Adressen, auf die Exim lauschen soll, eintragen. Das sind üblicherweise localhost sowie die Adressen vom Server.

local_interfaces = 127.0.0.1 : 188.188.188.188

Zeile 69: hier werden die Adressen eingetragen, von den Exim ohne jedes Passwort Emails entgegen nehmen soll. In unserem Beispiel ist das identisch der lokalen Adressen:

hostlist relay_from_hosts = 127.0.0.1 : 188.188.188.188

Zeile 90 und 91: hier werden die SSL Zertfikate eingetragen. Diese werden später erstellt.

tls_certificate = /etc/exim4/exim.crt

tls_privatekey= /etc/exim4/exim.key

Zeile 715ff: wenn Exim als Smarthost arbeiten soll, dann müssen hier die Einstellungen vorgenommen werden. Ein Smarthost mag dann notwendig sein, wenn Exim im lokalen Netz arbeitet und die Emails zunächst einen anderen Mailserver zugestellt werden sollen. Die Voreinstellung ist direkte Zustellung der Emails ohne Smarthost

4.2) Alias Datei setzen

Über die Systemeigene Alias Datei, kann man noch unabhängig von der SQL Datenbank Aliase verwalten. Das eignet sich hervoragend um z.B. Servermitteilungen die z.B.an root gesendet werden, zu verwalten.

touch /etc/mail/aliases

Die Datei sieht z.B. so aus:

root    user@hier_kommt_meine_domain.de

Nach Änderungen an der Datei wird dann das Programm „newaliases“ ausgeführt!

4.3) SSL Zertifikate erstellen

Ein „wenig“ versteckt findet man unter Ubuntu ein Programm zum erstellen der Exim SSL Zertifikate. Folgendes Programm starten:

/usr/share/doc/exim4-base/examples/exim-gencert

Einfach den Angaben folgen, die beiden Dateien (exim.crt, exim.key) werden automatisch in das betreffende Verzeichnis kopiert.

5)Dovecot

Dovecot ist ein sehr guter Imap und Pop3 Server mit einer sehr guten Dokumentation. Die Installation ist eigentlich relativ einfach, wir müssen nur kleinere Anpassungen vornehmen. Seit spätestens Ubuntu 12.x ist jedoch die Config von Ubuntu in unterschiedliche Bereiche aufgeteilt, daher werde ich hier nun die Dateien Schritt für Schritt durchgehen

5.1) /etc/dovecot/conf.d/10-auth.conf: (Zeile 122/123)

#!include auth-system.conf.ext  <- Deaktiveren
!include auth-sql.conf.ext   <- aktivieren

5.2) /etc/dovecot/conf.d/10-mail.conf: (Zeile 30)

mail_location = maildir:~/Mails  <- Zeile ändern

5.3) /etc/dovecot/conf.d/10-master.conf: (Zeile 21 & 75)

  inet_listener imaps {
    port = 993 
    ssl = yes 
  }
  
  service auth {
....
    unix_listener auth-userdb {
    mode = 0666 
    user = emails 
    group = emails
  }

    unix_listener auth-client {
    group = emails
    user = emails 
    mode = 0666   
 }
  
service auth-worker {
  # Auth worker process is run as root by default, so that it can access
  # /etc/shadow. If this isn't necessary, the user should be changed to
  # $default_internal_user.
  user = emails
}

Anmerkung: nach dieser Regelung wird kein POP3 mehr angeboten. Ich halte den Dienst auch für überflüssig, wer ihn aber haben möchte muss in der Datei 10-master.conf die Zeilen 38ff anpassen.

5.4) /etc/dovecot/conf.d/10-ssl.conf: (Zeile 12)

ssl_cert = </etc/exim4/exim.crt  
ssl_key = </etc/exim4/exim.key  

5.5) /etc/dovecot/conf.d/10-lda.conf: (Zeile 43)

lda_mailbox_autosubscribe = yes   

5.6) /etc/dovecot/dovecot-sql.conf.ext: (komplette Datei)

Die ganze Datei löschen und durch folgendes ersetzen und die Variablen <exim_user> und <exim_pass> anpassen

#
# Dovecot SQL config
# http://www.stonki.de/computer/mailserver/ubuntu-exim-dovecot-howto/
# by support@stonki.de
# Version 3.0 vom 8.08.2015  
#

driver = mysql
connect = host=127.0.0.1 dbname=exim4 user=<exim_user> password=<exim_pass>
default_pass_scheme = MD5-CRYPT
password_query = SELECT password FROM mailbox WHERE username  = '%u'
user_query = SELECT concat('/var/mails/',maildir) as home, 1002 AS uid, 1002 AS gid FROM mailbox WHERE username = '%u' and active="1";

6) ClamAV

Mit Clamav werden eingehende Emails auf Viren überprüft.

Zunächst fügen wir den User „clamav“ der Gruppe „Exim-Debian“ zu, damit Clamav auf die Emails zugreifen kann:

usermod -a -G Debian-exim clamav

Dann müssen wir die Apparmor Sicherheitseinstellungen noch anpassen, damit clamav überhaupt in das Verzeichnis schreiben darf.

/etc/apparmor.d/usr.sbin.clamd
 # For use with exim
 /var/tmp/** krw,
 /var/spool/exim4/** krw,

Anschließend apparmor neu starten (/etc/initd.d/apparmor restart)

7) Spamassassin

Mit Spamassassin wird bereits beim SMTP Prozess auf Spam überprüft und die Email wird je nach Spam-Score abgelehnt (hoher Spam-Score), per Greylisting auf später verschoben (mittlerer Spam-Score, größer 10) oder direkt zugestellt (niedriger Spam-Score). Um dieses flexibel zu halten, ist in der SQL Datenbank eine individuelle Spam-Score Einstellung möglich.

/etc/default/spamassassin

ENABLED=1      // Zeile 8
CRON=1         // Zeile 31

8) Webuserverwaltung installieren

Für die Userverwaltung nehme ich eine geänderte Version von Postfix Admin, einem exzellenten Tool für Postfix mit mysql. Einfach das Tar-File runterladen und entpacken.

Email Admin Software (http://www.stonki.de/fileadmin/files/exim4/emailadmin.tar.gz)

Außerdem müssen ggf. noch die PHP Imap Funktionen nachgerüstet werden:

apt-get install php5-imap

8.1) Webuserinterface anpassen

Die Datei „functions.inc.php“ muss an „neue“ PHP Versionen angepasst werden. Dazu in Zeile 1307, die „if“ Anfragen sowie die schließende Klammer hinzufügen

if (!function_exists('hex2bin')) {
function hex2bin ($str)
{
    $len = strlen ($str);
    $nstr = "";
    for ($i=0;$i<$len;$i+=2)
    {
        $num = sscanf (substr ($str,$i,2), "%x");
        $nstr.=chr ($num[0]);
    }
    return $nstr;
}
}

8.2) Config.php anpassen

Dazu die Datei config.inc.php im Root Verzeichnis des Webuserinterfaces anpassen:

  • Zeile 49: mysql Parameter anpassen 

  • Zeile 76: Postmaster Adresse hinterlegen

  • Zeile 124ff: default Aliase für die Domains hinterlegen

  • Zeile 147: Eckdaten einer Domain. Die Begrenzen gelten für Domain Administratoren, nicht für den Super User

  • Zeile 310: Wenn das Homeverzeichnis eines User nicht existiert, werden keine Email zugestellt. Daher erstellen wir unmittelbar nach dem erzeugen der Email die richtige Verzeichnisstruktur.

8.3) Verzeichnisstruktur für die Mailuser automatisch erzeugen

Diese Datei muss nun erstellt werden und mit den richtigen Rechten versehen werden:

/usr/local/bin/maildirmake.sh

#!/bin/bash
set -e
mail_home="/var/mails/"
mkdir -p "$mail_home/$3"
chown -R emails:emails "$mail_home/$3"
chmod -R 700 "$mail_home/$3"

Die Datei bekommt dann die Rechte „4755“, also 

chmod 4755 /usr/local/bin/maildirmake.sh

im zweiten Schritt muss erlaubt werden, daß das Script aufgerufen werden darf. Dazu muss de Datei /etc/sudoers angepasst werden und folgende Zeile angefügt werden:

www-data ALL = NOPASSWD: /usr/local/bin/maildirmake.sh

8.4) Weboberfläche

Nun wird die Weboberfläche aufrufen: DOMAIN/emailadmin/setup.php

Nun trägt man unten ein Superuser Password ein und erhält dafür einen MD5 Hash Key. Diesen trägt man nun in die Config Datei, Zeile 31 ein.

Anschließend ruft man wieder die Weboberfläche auf, trägt bei „Setup password“ das eben genannte Passwort ein und erstellt anschließend einen Admin user. Nun kann man über DOMAIN/emailadmin die Verwaltungsoberfläche aufrufen.

9) Roundcube

Wer eine Weboberfläche für die Emails haben möchte, der kann sich Roundcube installieren. Dieses ist ein sehr moderner webbasierter Browser mit Ajax Oberfläche und sehr flexibel zu konfigurieren. Webseite: roundcube.net

aptitude install roundcube roundcube-core roundcube-plugins roundcube-mysql

9.1) PHP anpassen

mcrypt installieren und anschließen Apache neustarten

php5enmod mcrypt

9.2) Anmerkungen

Wer die Serverabfrage überspringen möchte (in diesem Beispiel eh immer „localhost“) kann diesen gleich in Zeile 78 von /etc/roundcube/main.inc.php eintragen:

$rcmail_config['default_host'] = 'localhost';

10) Anmerkungen

Problem: Thunderbird zeigt Emails, die auf anderen Geräten gelöscht worden sind

Lösungsuperuser.com/questions/375155/emails-deleted-from-iphone-are-still-visible-in-thunderbird

Anpassungen:

/etc/dovecot/conf.d:

imap_capability = CAPABILITY IMAP4rev1 LITERAL+ SASL-IR LOGIN-REFERRALS ID ENABLE IDLE SORT SORT=DISPLAY THREAD=REFERENCES THREAD=REFS MULTIAPPEND UNSELECT CHILDREN NAMESPACE UIDPLUS LIST-EXTENDED I18NLEVEL=1 ESEARCH ESORT SEARCHRES WITHIN CONTEXT=SEARCH LIST-STATUS