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';