Dovecot Exim Howto Ubuntu 20.04 TLS

Version: 1.0 vom 7. März 2021
Ubuntu: 20.04 TLS

1) Einleitung

Vor vielen 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. Es gab verschiedene Versionen für die unterschiedlichen Ubuntu Versionen.

Nachfolgend eine aktuelle Version, die auf Ubuntu 20.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

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

3) Mysql

Wenn man den MySQL Server gerade erst installiert hat, so empfiehlt sich zunächst MySQL abzusichern. Hierzu startet man das Script „mysql_secure_installation“ und folgt den Schritten. Mehr Infos gibt es DigitalOcean.

sudo mysql_secure_installation

Wie in der Anleitung von DigitalOcean zu lesen ist, hat sich in neueren Version auch die Authentifizierung von MySQL zumindest unter Ubuntu verändert. Ich bevorzuge ja die normale MySQL Authentifizierung, weil damit auch PHPMyAdmin klar kommt:

mysql -u root 
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'SUPER GEHEIMES PASSWORT';

Nun zurück zu dem Mailserver: 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!

Die passende mySQL Struktur wird später durch die Weboberfläche Postfixadmin installiert. Wir brauchen nur zusätzliche die Greylist Tabelle:

mysql -u root -p (mit MySQL verbinden)
create database exim4;
create user 'exim_user'@'localhost' IDENTIFIED by 'Super Geheimes Passwort';
grant all privileges on exim4.* to exim_user@localhost ;

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. Die Eventsteuerung war zumindest bei mir unter bereits serienmäßig aktiv.


mysql> SHOW VARIABLES WHERE VARIABLE_NAME = 'event_scheduler';
+-----------------+-------+
| Variable_name   | Value |
+-----------------+-------+
| event_scheduler | ON    |
+-----------------+-------+
1 row in set (0.00 sec)

Wenn der Schedule aktiv ist noch das passende Event in mysql eintragen. Hinweis: Das „Drop event“ sollte immer einen Fehler bringen und dient mir nur zur Kontrolle, ob da noch was war.

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

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

Zeile 19: hier werden die mySQL Zugangsdaten eingetragen:

hide mysql_servers = MYSQL_HOST/EXIM_DB/EXIM_USER/EXIM_PASS

Zeile 46: hier die lokalen Adressen, auf die Exim lauschen soll, eintragen. Das sind üblicherweise localhost sowie die Adressen vom Server. Zudem trage ich da den FQDN des Servers ein.

primary_hostname = fqdn.deines.servers
local_interfaces = 127.0.0.1 : 188.188.188.188
daemon_smtp_ports = smtp : smtps : 587

Zeile 67: 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 88 und 89: hier werden die SSL Zertfikate eingetragen. Diese werden später erstellt.

tls_certificate = /etc/exim4/fullchain.pem
tls_privatekey = /etc/exim4/privkey.pem

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) Deny Sender 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/exim4/deny_sender

Die Datei sieht z.B. so aus:

cat /etc/exim4/deny_sender
*@erfolg-durch-profis.com
*@from-me-to-yours.com

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. Die Config von Ubuntu ist 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: (Zeilen 101 und 122/123)

auth_mechanisms = plain login (Zeile 101)

Zeilen 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
}

Außerdem muss an der 10-master.conf noch folgende Zeilen am Ende angefügt werden:

## ADD 
service stats {
                unix_listener stats-writer {
                user = emails
                }
                unix_listener stats-reader {
                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/fullchain.pem
ssl_key = </etc/exim4/privkey.pem

5.5) /etc/dovecot/conf.d/15-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. Last tested 6.03.2021  
#

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

CRON=1         // Zeile 31

dann aktivieren.
update-rc.d spamassassin enable


8) SSL Zertifikate erstellen

Das übernimmt man heute am besten mit Let’s Encrypt. Wenn man auf dem Server einen Webserver laufen lässt, dann kann man sich die ganz normal installieren und kopiert dann via Cronjob (cron.weekly) die beiden Dateien entsprechend um und startet Exim und Dovecot neu. Man kann sich auch die Lösung via DNS Server einrichten, dann braucht es keinen Webserver. Für die meisten Hoster (in meinem Beispiel die Firma Hetzner) gibt es dazu Anleitungen: https://community.hetzner.com/tutorials/letsencrypt-dns

Ich habe einen Webserver für die Weboberfläche laufen, daher mache ich es einfach und erstelle eine Domain identisch zum FQDN des E-Mail Server (z.B. mail.domain.test).

sudo apt install certbot python3-certbot-apache

sudo certbot --apache 

Die Files liegen unter /etc/letsencrypt/live/…. Domain. Hier nehmen wir nun ein kleines Script, welche diese einmal die Woche in das Exim Verzeichnis legen:

# cat /etc/cron.weekly/exim_keys_kopieren 
 
#!/bin/sh
cp /etc/letsencrypt/live/<DOMAIN>/fullchain.pem   /etc/exim4/fullchain.pem
cp /etc/letsencrypt/live/<DOMAIN>/privkey.pem     
chmod 644 /etc/exim4/fullchain.pem /etc/exim4/privkey.pem
/etc/init.d/exim4 restart
/etc/init.d/dovecot restart 


und dann ausführbar machen:
chmod +x  /etc/cron.weekly/exim_key_kopieren 

9) Webuserverwaltung installieren

Für die Userverwaltung nehme ich Postfix Admin, einem exzellenten Tool für Postfix mit mysql. Von der Webseite laden und in /var/www (oder wo man sein Apache Verzeichnis hat) entpacken. Hierfür gibt es unter eine separate Anleitung. Ich musste übrigens die Version 3.2.4 per GIT ziehen, die zum download angebotenen Varianten warfen Fehler..

cd /srv 
git clone https://github.com/postfixadmin/postfixadmin.git  
cd postfixadmin 
git checkout postfixadmin-3.2.4

 
mkdir -p /srv/postfixadmin/templates_c
chown -R www-data:www-data  /srv/postfixadmin/templates_c 

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

 apt-get install php-imap 

Nun müssen wir auch die Struktur noch ein wenig anpassen. Im Verzeichnis „model“ passen wir MailboxHandler.php an und fügen zwei Zeilen ein:

diff MailboxHandler.php MailboxHandler.php~  
 52,53d51
 <             'spam_threshold'   => pacol(1,          1,      1,      'int',   'spam_threshold'               , ''                                 ),
 <             'spam_text'        => pacol(1,          1,      1,      'text',  'spam_text'                    , ''                                 ), 

und dann diese Texte noch in den Sprachendateien anpassen:

 
$ diff languages/de.lang languages/de.lang~  
 9,11d8
 < $PALANG['spam_threshold'] = 'Spam  Threshold';
 < $PALANG['spam_text'] = 'Spam  Text'; 

9.1) Config.php anpassen

Dazu erstellen wir eine neue Datei „config.local.php“ im Root Verzeichnis vom PostfixAdmin (gleiches Verzeichnis, wo auch config.inc.php liegt):

  <?php
 $CONF['database_type'] = 'mysqli';
 $CONF['database_user'] = '<exim user name bei MySQL>';
 $CONF['database_password'] = '<Super geheimes Passwort';
 $CONF['database_name'] = 'exim4';
 

 $CONF['configured'] = true;
 ?>
 

Nun wird im Webbrowser Postfix Admin aufgerufen. Es sollte die Frage nach einem Passwort folgen, aus dem ein Hashwert erzeugt wird. Die angezeigte Zeile dann in die config.local.php eintragen:

...
 
 $CONF['setup_password'] = '2c0ae9xxxxxxxxxxxxx'; 
 $CONF['configured'] = true;
 ?>


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) Alias anpassen

Man kann nun entscheiden, ob man das als Webseite einrichtet oder über Alias löst. Ich habe durch einfaches auskommentieren als Alias umgesetzt

# head -n5 /etc/apache2/conf-available/roundcube.conf 
# Those aliases do not work properly with several hosts on your apache server
# Uncomment them to use it or adapt them to your configuration
    Alias /roundcube /var/lib/roundcube

<Directory /var/lib/roundcube/>

9.2) Anmerkungen

Wer die Serverabfrage überspringen möchte (in diesem Beispiel eh immer „localhost“) kann die Config von /var/lib/roundcube/config/config.inc.php (Zeile 36)

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