Home.

Technik-Blog

Willkommen auf meinem
Notiz - Blog
Blog

Kmoser's Tech-Blog

Samstag
07
Juni 2014
Klaus Moser
Klaus Moser

Ubuntu - Mailserver - Postfix

Postfix ist ein MTA (Mail Transfer Agent) und nimmt E-Mails entgegen und stellt diese entweder an ein lokales Postfach zu oder sendet diese an ein anderes System weiter. Für die Kommunikation untereinander verwenden MTAs häufig SMTP.

Installation

Wer die Pakete aus der Einleitung schon installiert hat, kann diesen Schritt überspringen. Die Installation von Postfix erfolgt über:

apt-get install postfix postfix-mysql

Nach der Installation sollte man den Konfigurationsassistenten nochmal aufrufen da er bei manuellem Aufruf mehr Fragen stellt:

dpkg-reconfigure postfix

Grundkonfiguration

Für die Konfiguration legen wir als erstes den Namensteil der Adresse fest, die hinter dem Benutzername und dem @ kommt:

sudo nano /etc/mailname

hier steht z.B. meinedomain.de. Siehe auch Debian Wiki.

Die Konfiguration von Postfix ist in zwei Dateien aufgesplittet. Zu einen ist das die main.cf, in der man, wenn ich das richtig verstanden habe, die globalen Einstellungen. In der master.cf werden die Dienste definiert und man kann hier für einzelne Dienste mit dem -o Parameter Einstellungen aus den globalen Einstellungen überschreiben, bzw. zusätzlich setzen.

Beginnen wir mit den globalen Einstellungen

sudo nano /etc/postfix/main.cf

Zunächst definieren wir den Hostnamen des Servers

# Name of the server
myhostname = homeserver.meinedomain.de

Dann legen wir den Domainnamen fest, der E-Mails von diesem Server angefügt werden soll:

# Domain to append to email
myorigin = /etc/mailname

Standardmäßig leitet Postfix alle Mails weiter, die von einem authorisierten Netzwerk Segmet kommen. Authorisierte Netzwerke legt man mit dem mynetworks Parameter fest. Vorsicht mit diesem Parameter, ist dieser falsch gesetzt, bekommt man möglichweise ein offenes Relay.

# Authorized networks
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128

Benutzt man kein IPv6 kann man den IPv6 Anteil auch weglassen. Hab ihn nur als Notiz für mich mal drinnen gelassen. Vielleicht finde ich ja mal die Zeit und stelle mein lokales Netz mal auf IPv6 um.

Würden wir eine lokale Zustellung ohne virtuelle Domains verwenden, würden wir hier die Domains festlegen die lokal zugestellt werden sollen:

# Lokale Zustelldomains
mydestination = meinedomain.de, meinedomain.local, srv, localhost.localdomain, localhost

Da wir unsere Domains aber über die MySQL Datenbank pflegen wollen, bleibt dieser Eintrag leer. 

mydestination =

Folgendes definiert den Begrüßungstext wenn sich ein Benutzer mit dem Postfix Server verbindet:

# Welcome message
smtpd_banner = $myhostname ESMTP $mail_name

Wir akzeptieren Mails auf allen Netzwerk Devices

# Accept mail from all devices
inet_interfaces = all

Ich plane aktuell nur ipv4 einzusetzen, daher werde ich die Verwendung auf dieses Protokoll beschränken.

# Allowed protocols
inet_protocols = ipv4

Als nächstes tragen wir ein Maquerading für Domains ein. Lautet der Servername z.B. homeserver.meinedomain.de will man als Absender Adresse lieber benutzer@meinedomain.de anstatt benutzer@homeserver.meinedomain.de. Man kann auch Domains festlegen die nicht masktiert werden sollen, wie z.B. die Adresse von seinem Dyndns Anbieter. Hier muss der Domainname die Subdomain sein.

# Masquerade Domains
masquerade_domains = homeserver.mydomain.de !mydynname.dyndomain.com
masquerade_exceptions = root

Jetzt kommen noch ein paar weitere Konfigurationen, die man in der Postfix Anleitung nachschlagen kann/soll. 

# Send new mail notification with "biff"
biff = no

# appending .domain is the MUA's job.
append_dot_mydomain = no

# How long to wait before sending "delayed mail" warnings
delay_warning_time = 4h

# How many addresses cat be used in one message.
# Effective stopper to mass spammers
default_recipient_limit = 16

# Mailbox size (0=no limit)
mailbox_size_limit = 0

# Maximale Nachrichtengröße (1GB)
message_size_limit = 1024000000

# Location of the Postfix Readme files
readme_directory = no

recipient_delimiter =

Man kann sich die Standardparameter die Postfix verwendet übrigens anzeigen lassen mit

postconf -d

Alle vom Standard abweichenden Einstellungen bekommt man mit:

postconf -n

TLS- (SSL-) Verschlüsselung

Damit Passwörter beim Versand von E-Mails nicht im Klartext-Format übertragen werden, und damit von Dritten ausgespäht werden könnten, sollte man die Verbindung per TLS (Transport Layer Security) ehemals SSL verschlüsseln. Ein selbstsigniertes Zertifikat kann man über das Paket ssl-cert bekommen.

Um die Verschlüsselung per Zertifikat zu aktivieren müssen folgende Zeilen in die /etc/postfix/main.cf

# TLS parameters
smtpd_tls_security_level = may
smtpd_tls_auth_only = yes
smtpd_tls_sasl_security_options = noanonymous

Ausserdem müssen noch die Pfade zu den Zertifikaten gesetzt werden:

smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key

Benutzt man z.B. ein Zertifikat von StartSSL muss man noch das Intermediate Zertifikat im Server Zertifikat unterbringen:

sudo cat my-server-cert.pem sub.class1.server.ca.pem > /etc/ssl/certs/startssl/postfix.pem
sudo cp mykey.pem /etc/ssl/startssl/private/key.pem

Die Konfiguration würde dann so aussehen:

smtpd_tls_CAfile=/etc/ssl/certs/StartCom_Certification_Authority.pem
smtpd_tls_cert_file=/etc/ssl/startssl/postfix.pem
smtpd_tls_key_file=/etc/ssl/startssl/private/key.pem

Unbedingt darauf achten, dass der Key nur für root lesbar ist um diesen vor unbefugtem Zugriff zu schützen.

Mann kann für smtpd_tls_security_level statt may auch encrypt verwenden, dann ist die TLS Verbindung Voraussetzung für die Verbindung und Postfix weist Clients ab die kein TLS unterstützen.

smtpd_tls_security_level = encrypt

Diese Option darf man aber nicht global in der main.cf setzen, sonst bekommt man spätestens mit fetchmail Probleme. Auf einem Internet Server würde diese Option dazu führen, dass keine Mailserver mehr Mails an unseren Server liefern können. Diese Option muss daher in der master.cf für den submission Port (587) gesetzt werden.

Die Option smtpd_tls_auth_only bewirkt dass Clients erst ein STARTSSL senden müssen bevor sie irgendwelche AUTH-Mechanismen von Postfix angeboten bekommen.

Es ist empfehlenswert das TLS Session Caching zu aktivieren, da das Aushandeln einer Session recht ressourcenintensiv ist.

smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache

Zum Testen der Verbindung und des Zertifikates folgendes ausführen:

echo "quit" | openssl s_client -starttls smtp -connect localhost:587

Die Gültigkeitsdauer des Zertifikates bekommt man mit:

echo "quit" | openssl s_client -starttls smtp -connect localhost:587 | openssl x509 -noout -enddate

SASL Authentifikation

Für die SASL Authentifikation benötigen wir noch das folgende Paket:

sudo apt-get install libsasl2-modules

Damit postfix weiß welche Benutzer die Erlaubnis zum Senden von Mails haben, muss Postfix den Socket von Dovecot benutzen den wir bei der Einrichtung von Dovecot angelegt haben. Dazu muss folgende in die main.cf:

# SASL Auth
smtpd_sasl_auth_enable = yes
smtpd_sasl_security_options = noanonymous
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth

Falls man Microsoft Outlook 2000-2003 erlauben will, sollte noch dieser Parameter gesetzt werden:

broken_sasl_auth_clients = yes

Anscheinend ist es wohl eine "Good Practice" für den Versand von Mails von seinen Nutzern einen eigenen Port, den submission Port  (TCP 587), zu verwenden und den Standard Port 25 für die Kommunikation der MTAs untereinander freizuhalten. Mithilfe des Submission Ports öffnet Postfix einen zusätzlichen Port über den nur dann E-Mails versendet werden können, wenn der Nutzer sich authentifiziert hat.

Dazu muss folgendes in die master.cf:

submission inet n - - - - smtpd
 -o syslog_name=postfix/submission
-o smtpd_tls_security_level=encrypt
-o smtpd_sasl_auth_enable=yes
-o smtpd_sasl_type=dovecot
-o smtpd_sasl_path=private/auth
-o smtpd_sasl_security_options=noanonymous
-o smtpd_client_restrictions=permit_sasl_authenticated,reject

In der master.cf gibt es bereits einen Bereich mit einer Definition des submission Ports. Darauf achten dass dieser auskommentiert ist.

Siehe auch Dovecot Wiki.

Dovecot LMTP

Im Dovecot Artikel haben wir einen LMTP Socket für die lokale Zustellung von Mails eingerichtet. Damit dieser verwendet wird müssen wir diesen Postfix über die main.cf noch bekannt geben:

# Use Dovecot LMTP Service to deliver Mails
virtual_transport = lmtp:unix:private/dovecot-lmtp

MySQL Anbindung

Auch Postfix wird wie Dovecot an eine MySQL Datenbank angebunden. Das vereinfacht die Administration, da man Benutzer und Domains bequem über Datenbank Tabellen pflegen kann.

Dazu legt man in der Datenbank vmail ein paar neue Tabellen an:

# Tabelle für Domains
CREATE TABLE domains (
    domain VARCHAR(128) NOT NULL,
    UNIQUE (domain)
);
# Tabelle für Aliase
CREATE TABLE aliases (
    id INT UNSIGNED AUTO_INCREMENT NOT NULL,
    source VARCHAR(128) NOT NULL,
    destination VARCHAR(128) NOT NULL,
    UNIQUE (id),
    PRIMARY KEY (source, destination)
);

In die main.cf kommen folgende Einträge:

# MySQL
virtual_alias_maps = mysql:/etc/postfix/virtual/mysql-aliases.cf
virtual_mailbox_maps = mysql:/etc/postfix/virtual/mysql-maps.cf
virtual_mailbox_domains = mysql:/etc/postfix/virtual/mysql-domains.cf
local_recipient_maps = $virtual_mailbox_maps

Die hier referenzierten Dateien müssen noch angelegt werden:

sudo mkdir /etc/postfix/virtual
cd /etc/postfix/virtual

In den folgenden Dateien werden die Verbindungsparameter für den Zugriff auf die Datenbank sowie der Query für die entsprechende Aktion festgelegt. Der Wert für password entspricht also dem Passwort des Datenbankbenutzers vmail für die Datenbank vmail.

In die Datei mysql-aliases.cf kommt folgender Inhalt:

user = vmail
password = mysecret
hosts = 127.0.0.1
dbname = vmail
query = SELECT destination FROM aliases WHERE source='%s'

In die Datei mysql-maps.cf kommt dieser Inhalt:

user = vmail
password = mysecret
hosts = 127.0.0.1
dbname = vmail
query = SELECT * FROM users WHERE username='%u' AND domain='%d'

Und in die Datei mysql-domains.cf muss folgendes:

user = vmail
password = mysecret
hosts = 127.0.0.1
dbname = vmail
query = SELECT * FROM domains WHERE domain='%s'

Zum Schluss die Dateien nur für root lesbar machen:

sudo chmod 660 -R /etc/postfix/virtual/

Jetzt müssen die Tabellen noch mit gültigen Werten gefüllt werden. Dazu verbinden wir uns zur MySQL Datenbank:

mysql -u root -p
use vmail;

und fügen zunächst einen Domain Datensatz ein:

INSERT INTO domains (domain) VALUES ('meinedomain.de');

Einen Benutzer haben wir ja bereits im letzten Artikel, bei der Installation des Dovecot Servers, angelegt.

Und Aliase sollten mindestens für root und postmaster angelegt werden.

INSERT INTO aliases (source, destination) VALUES ('root@meinedomain.de', 'me@meinedomain.de');
INSERT INTO aliases (source, destination) VALUES ('postmaster@meinedomain.de', 'me@meinedomain.de');

SMTP Access Restrictions

Mit der Einstellung smtpd_relay_restrictions (bzw. smtpd_recipient_restrictions vor Postfix 2.10) kann man Postfix sagen, wann eine Mail die am SMTP Server ankommt angenommen oder direkt abgewiesen werden soll.

Standardmäßig akzeptiert Postfix Mails die eine der folgende Kritieren erfüllt:

  • Mails von Clients deren IP Adresse auf $mynetworks passt
  • Mails die an entfernte Empfänger gerichtet sind, die auf $relay_domains zutreffen, ausser Adressen die ein senderspezifiisches routing (user@elsewhere@domain) enthalten
  • Mails an lokale Empfänger die auf $inet_interfaces oder $proxy_interfaces, $mydestination, $virtual_alias_domains, oder $virtual_mailbox_domains zutreffen

Siehe Postfix.org.

smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated reject_unauth_destination

Diesem Thema werde ich in nächster Zeit einen eigenen Blogbeitrag widmen.

E-Mail Client

Im E-Mail Client, wie z.B. Thunderbird müssen folgende Werte für den Versand von Mails über SMTP eingestellt werden:

Einstellung Wert
Verbindungsart SMTP
Port 587
Verbindungssicherheit STARTSSL
Authentifizierung Passwort, normal

Weitere Einstellmöglichkeiten

Es folgen noch ein paar weitere Konfigurationsmöglichkeiten für Postfix, die ich gefunden habe aber nicht einsetzen werde aber dennoch so interessant sind, dass ich sie mir hier notieren möchte. Zu beachten ist, dass ich diese nicht getestet habe, also nicht wundern wenn es nach dem Copy-Pasten nicht funktioniert.

Mails mit bestimmten Anhängen verweigern

Um Mails mit bestimmten Dateien im Anhang gleich von vornherein abzufangen, legt man eine Datei /etc/postfix/attachment_check mit einem RegExp an:

/^((Content-(Disposition: attachment;|Type:).*|\ +)| *) (file)?name\ *=\ *"?.*\. (lnk|asd|hlp|ocx|reg|bat|c[ho]m|cmd|exe |dll|vxd|pif|scr|hta|jse?|sh[mbs]|vb[esx]|ws[fh]|wmf)"?\ *$/ REJECT attachment type not allowed

Darauf achten, dass das hier eine einzige Zeile ist, ggf. Zeilenumbrüche entfernen.

Dann trägt man diese Datei als mime_header_checks in die main.cf ein:

mime_header_checks = pcre:/etc/postfix/attachment_check 
Sonntag
01
Juni 2014
Klaus Moser
Klaus Moser

Ubuntu 14.04 - Mailserver - Dovecot

Dovecot ist ein Open Source IMAP und POP3 Server, der Dieste bereitstellt um Mails mit einem Client wie Outlook oder Thunderbird abzuholen. Der Server legt die E-Mails im mbox oder Maildir-Format ab.

Eigentlich würde man mit der Konfiguration von Postfix anfangen, da dieser die Mails in die Postfächer zustellt, da mein Plan aber darin besteht die Zustellung per fetchmail zu machen, fange ich mit dovecot an.

Installation

Für die Installationdes Grundsystems benötigt man das Core-Paket und mindestens eines der beiden anderen Pakete:

  • dovecot-core
  • dovecot-imapd
  • dovecot-pop3d

Möchte man nur einen IMAP Server muss man das Paket dovecot-pop3d nicht installieren und umgekehrt.

sudo apt-get install dovecot-core dovecot-imapd

Hat man das Metapaket für den Mailserver installiert kann man das Paket wieder deinstallieren mit:

sudo apt-get purge dovecot-pop3d

Zusätzlich benötigen wir das Paket dovecot-lmtpd für die lokale Zustellung der E-Mails über LMTP.

sudo apt-get install dovecot-lmtpd

Konfiguration

Die Konfiguration findet zwar grundsätzlich in der Datei /etc/dovecot/dovecot.conf statt, in Ubuntu sind die meißten Optionen allerdings in Dateien in /etc/dovecot/conf.d ausgelagert. Daher ist es eigentlich nicht nötig die Hauptkonfigurationsdatei zu verändern.

Alle Einstellungen die von den Standardeinstellungen abweichen, kann man sich mit

dovecot -n

anzeigen lassen. Nach Änderungen an der Konfiguration muss natürlich Dovecot neu gestartet werden.

Protokolle

Standardmäßig werden die Protokolle aktiviert, deren Paket man installiert hat. Diese Pakete legen Dateien an die unter /usr/share/dovecot/protocols.d/*.protocol zu finden sind.

Benutzerauthentifikation

Die Benutzer sollen über eine MySQL Datenbank verwaltet werden können. Dazu haben wir ja schon wie in der Einleitung beschrieben das Paket dovecot-mysql installiert.

Die Konfiguration erfolgt über /etc/dovecot/conf.d/10-auth.conf. Hier muss die Zeile für die Authentifikation über das System auskommentiert werden und die Zeile für die Authentifikation am SQL Server einkommentiert werden:

#!include auth-system.conf.ext
!include auth-sql.conf.ext

Die Datei /etc/dovecot/auth-sql.conf.ext referenziert wiederum die Datei /etc/dovecot/dovecot-sql.conf.ext in der weitere Parameter für die Verbindung mit der Datenbank festgelegt werden.

Wie in der Datei beschrieben muss man eine neue Datenbank mit ein paar Tabellen anlegen. Die Datenkbank nenne ich vmail, da diese nicht nur für dovecot benutzt werden soll, sondern später auch für Postfix herhalten muss. Als Kollation verwende ich utf8_general-ci.

CREATE DATABASE vmail
  DEFAULT CHARACTER SET utf8
  DEFAULT COLLATE utf8_general_ci;

Als nächstes die Benutzertabelle:

# Tabelle für Benutzer
CREATE TABLE users (
     username VARCHAR(128) NOT NULL,
     domain VARCHAR(128) NOT NULL,
     password VARCHAR(128) NOT NULL,
     PRIMARY KEY (username, domain)
);

Zusätzlich brauchen wir noch einen Benutzer, der Zugriff auf diese Tabellen hat.

GRANT ALL PRIVILEGES
  ON vmail.*
  TO 'vmail'@'localhost'
  IDENTIFIED BY 'mysecret';

Sind die Tabellen angelegt, können wir uns an die Konfiguration machen. Dazu editiert man die Datei /etc/dovecot/dovecot-sql.conf.ext.

Hier wählt man zunächst die Verbindungsart aus. Nicht vergessen die benötigten Einträge auch einzukommentieren.

driver = mysql

Als nächstes legt man die Verbindungsparameter fest. Man kann statt dem Socket auch localhost verwenden.

connect = host=/var/run/mysqld/mysqld.sock dbname=vmail user=vmail password=mysecret

Als Passwort Schema wähle ich den starken SHA512-CRYPT Algorithmus.

default_pass_scheme = SHA512-CRYPT

Den Passwort-Query kann man so einkommentieren wie er im Beispiel steht:

password_query = \
  SELECT username, domain, password \
  FROM users WHERE username = '%n' AND domain = '%d'

In anderen Anleitungen wird behauptet dass die letzte Zeile in der Konfigurationsdatei ebenfalls einkommentiert werden muss.

iterate_query = SELECT username AS user FROM users

Bei mir hat das allerdings zu Fehler im Log geführt.

dovecot: auth: Warning: sql: Ignoring changed iterate_query in /etc/dovecot/dovecot-sql.conf.ext, because userdb sql not used. (If this is intentional, set userdb_warning_disable=yes)

Ich habe sie daher draußen gelassen.

Den User-Query würde man nur dann benötigen, wenn man für die Mail Benutzer verschiedene Einstellungen bezüglich Benutzer/Gruppe/Speicherort definieren wollten. Da ich das nicht möchte wird noch der userdb Eintrag in der Datei /etc/dovecot/conf.d/auth-sql.conf.ext geändert so dass immer fetgelegte Werte verwendet werden:

#userdb {
#  driver = sql
#  args = /etc/dovecot/dovecot-sql.conf.ext
#}

# If you don't have any user-specific settings, you can avoid
# the user_query by using userdb static instead of userdb sql,
# for example:
# <doc/wiki/UserDatabase.Static.txt>
userdb {
  driver = static
  args = uid=vmail gid=vmail home=/var/vmail/%d/%n
}

Benutzer anlegen

In phpmyadmin gibt es leider keine Funktion um einen SHA512 Hash direkt zu erzeugen. Das Passwort kann allerdings auf der Kommandozeile mit Dovecot erzeugt werden:

doveadm pw -s SHA512-CRYPT

Es wird zweimal um die Eingabe des neuen Passworts gefragt und dann der Hash ausgegeben. Das {SHA512-CRYPT} am Anfang muss man weglassen, da es nur den verwendeten Algorithmus zeigt.

INSERT INTO users
 (username, domain, password)
 values
 ('benutzer1', 'meinedomain.de', '$6$A3Z[...]MCQgfsz');

Benutzer Testen

Um zu Testen ob die Verbindung zu Datenbank furnktioniert, kann man sich alle Benutzer anzeigen lassen die in der Datebank angelegt sind.

Dazu muss man allerdings für die Zeit des Testens die userdb Einstellung in der Datei /etc/dovecot/conf.d/auth-sql.conf.ext wieder auf driver = sql stellen.

doveadm user '*'

Hier sollten jetzt alle Benutzer auftauchen die man in der MySQL Datenbank definiert hat.

Nicht vergessen nach Abschluss des Tests die Einstellungen für userdb wieder auf die driver = static Variante zurückzustellen.

Mailbox Format und Speicherort

Dovecot kann Postfächer im mbox sowie im Maildir Format verwalten. Bei der mbox Variante werden alle Mails in einer Datei gespeichert, beim maildir Format ist jede Mail eine eigene Datei.

Standardmäßig ist das mbox Format voreingestellt und das INBOX Verzeichnis des Postfachs liegt unter /var/mail/%u  und die restlichen Verzeichnisse im Benutzerordner unter ~/mail.

Ich würde allerdings lieber die maildir Variante bevorzugen, da ich bereits auf meiner NAS mein Postfach im maildir Format habe und ich auch sonst das Maildir Format besser zu handlen finde.

Zuerst legen wir das Verzeichnis für die Postfächer an

sudo mkdir /var/vmail

Dann brauchen wir einen Benutzer und eine Gruppe unter dem Dovecot auf die Postfächer zugreifen soll

addgroup vmail
adduser --ingroup vmail --no-create-home --shell /bin/false vmail

Diesen Benutzer tragen wir jetzt in die Datei /etc/dovecot/conf.d/10-mail.conf ein.

mail_uid = vmail
mail_gid = vmail
mail_privileged_group = vmail

Damit wird Dovecot mitgeteilt, wie und mit welchem Benutzer/Gruppe auf die Mailbox Verzeichnisse zugegriffen werden soll.

Außerdem müssen wir in dieser Datei Dovecot mitteilen, in welchem Ordner und in welcher Form die Mails gespeichert werden sollen. Wie ich schon erwähnt habe, möchte ich das Maildir Format benutzen, da es einfacher zu handhaben ist und auch fehlertoleranter ist.

mail_location = maildir:/var/vmail/%d/%n/Maildir

eine weitere Möglichkeit wäre

mail_location = maildir:/var/vmail/%d/%n/Maildir:LAYOUT=fs

wenn man möchte dass die Ordnerstruktur im Mail-Client dr Ordnerstruktur im Dateisystem entspricht. Ich werde erstere Variante benutzen, da mein Maildir bereits in diesem Format vorliegt und ich die Mischung der Dovecot Verzeichnisse cur, new und tmp mit den richtigen Unterordnern auch nicht so wirklich schön finde.

Als nächstes müssen die Rechte für das Verzeichnis /var/vmail gesetzt werden:

sudo chown vmail:vmail -R /var/vmail/
sudo chmod 0770 /var/vmail

Normalerweise benutzt Dovecot den Benutzer und die Gruppe des Systembenutzers des Mailaccounts. Da wird aber virtuelle Benutzer verwenden gibt es diese Benutzer ja nicht und wir verwenden für den Zugriff auf das Dateisystem stattdessen den Benutzer vmail.

Verbindung absichern mit TLS/SSL

Die SSL/TLS Konfiguration kann angepasst werden indem man die Datei /etc/dovecot/conf.d/10-ssl.conf editiert. Man kann z.B. das selbst signierte Zertifikat verwenden, das bei der Ubuntu Installation meisst schon vorhanden ist. Keine Ahnung bei welcher Installation von welchem Paket das erzeugt wird.

# SSL/TLS support: yes, no, required. <doc/wiki/SSL.txt>
ssl = yes

# PEM encoded X.509 SSL/TLS certificate and private key.
ssl_cert = </etc/ssl/certs/ssl-cert-snakeoil.pem
ssl_key = </etc/ssl/private/ssl-cert-snakeoil.key

Man kann die Verschlüsselung erzwingen wenn man die folgende Einstellung setzt:

ssl = required

Eine Verbindung zum Server ist dann nur noch über die SSL/TLS Ports möglich. Bei IMAP ist das Port 993. Laut RFC 2595 (Kapitel 7) ist das allerdings nicht mehr gewollt und man sollte stattdessen lieber den Standardport 143 mit STARTTLS verwenden.

Bei gechainten SSL Zertifikaten kommen alle Zertifikate in die Datei, die in ssl_cert angegeben wurde und zwar in dieser Reihenfolge: 

  1. Zertifikat des Dovecot Servers
  2. Chained Zertifikat
  3. CA Zertifikat

Das Zertifikat und den Key könnte man z.B. dann so anlegen:

ssl_cert = </etc/ssl/startssl/dovecot/dovecot.pem
ssl_key = </etc/ssl/startssl/private/key.pem

Nicht vergessen das Zertifikat, bzw. den Key vor ungewolltem Zugriff zu schützen:

chown root:root /etc/ssl/startssl/dovecot/dovecot.pem
chmod 0600 /etc/ssl/startssl/dovecot/dovecot.pem
chown root:root /etc/ssl/startssl/private/key.pem
chmod 0600 /etc/ssl/startssl/private/key.pem

Um die Verbindungssicherheit weiter zu erhöhen kann man die vorgeschlagene Cipherliste von https://bettercrypto.org/ verwenden.

# SSL protocols to use
ssl_protocols = !SSLv2 !SSLv3

# SSL ciphers to use
ssl_cipher_list = EDH+CAMELLIA:EDH+aRSA:EECDH+aRSA+AESGCM:EECDH+aRSA+SHA384:EECDH+aRSA+SHA256:EECDH:+CAMELLIA256:+AES256:+CAMELLIA128:+AES128:+SSLv3:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!DSS:!RC4:!SEED:!ECDSA:CAMELLIA256-SHA:AES256-SHA:CAMELLIA128-SHA:AES128-SHA

# Prefer the server's order of ciphers over client's.
ssl_prefer_server_ciphers = yes

Um eine Anmeldung mit einem Klartextpasswort ohne die Verwendung einer verschlüsselten Verbindung mit TLS/SSL zu verhindern kann man eine Einstellung in der Datei /etc/dovecot/conf.d/10-auth.conf aktivieren:

disable_plaintext_auth = yes

Um die Änderungen anzuwenden, den Dovecot Server neu starten:

sudo service dovecot restart

Zum Testen der SSL Verbindung kann man sich mit dem dovecot Server verbinden und das Zertifikat auslesen. Für den IMAPS (993) Port geht das mit folgendem Befehl:

echo "quit" | openssl s_client -connect localhost:imaps

Um den Standardport von IMAP (143) mit STARTTLS zu testen benutzt man

echo "quit" | openssl s_client -starttls imap -connect localhost:imap

Es sollte etwas wie das folgende herauskommen

CONNECTED(00000003)
depth=0 CN = test-nas
verify error:num=18:self signed certificate
verify return:1
depth=0 CN = test-nas
verify return:1
---
Certificate chain
 0 s:/CN=test-nas
   i:/CN=test-nas
---
Server certificate
-----BEGIN CERTIFICATE-----
MIICtjCCAZ6gAwIBAgIJAL4I9/wT0r5+MA0GCSqGSIb3DQEBCwUAMBMxETAPBgNV
BAMTCHRlc3QtbmFzMB4XDTE0MDUxNzA5MzYxNFoXDTI0MDUxNDA5MzYxNFowEzER
MA8GA1UEAxMIdGVzdC1uYXMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB
AQC9Rm9cb9xn2vIuk9n2OgEb1AR5Ka+lR67avte0PNdwq6X91o4+mgEpYEsMx/Zl
ScVJYxs/MGRn0NXl7W74/E+fnR84QntnrM6hT5AewuwfxjlE0byiED3c5fhAvI9o
MXJjZ4icCc+kUuv1CkARhgVd8SWvUM5ezJWQDofRkclx49DCvvvgk9uqBbju2LMf
Ah6tOHdUBrMewHnS3X9gP52gn+JBCwr/iTgzab5yhV7EMetu7y7yQngnpWOYGNJ/
gWAOe60E+2t56e+IXLKFx0EDIf8tP+aw8228IWVIkyVZJ75o7EHz65BXPXek3hKx
R7qQj8FvtReFOfGc8GmQ2WOvAgMBAAGjDTALMAkGA1UdEwQCMAAwDQYJKoZIhvcN
AQELBQADggEBAGfJNs6wP9dxFSiaWJ9E8W2ctfg08xm76E7nTDy6ebBfvXoENoUP
X7ssnJTelcePVTIPvrKGRmtysQUkxPGuKuhGb65DsEJwpPeey0NBY+tw1ZRyg6GC
lawxi3TmMuhvkHHhSveYZh8W984NCSXViLMqAZjn7KsIZO2atnBlUdexQIx+Yfpr
W94jARAF7ltn3bm3gyYejVVLX7D9mTutHj0s+p3oICRYCmsnJaCLskjvuG/BohhB
agFPwVv6XqLHvnkHoipbMNdkDhMaygD/ipOFyti27V91LIxzdxmjDYQhJD/cZC9T
tIPYQLRNKZjiwpKYYiPdpP+O2aHEL7CCCng=
-----END CERTIFICATE-----
[...]

Weitere Infos gibt's z.B. im Dovecot Wiki.

SASL Authentifizierung

Postfix wird später anfragen an Dovecot stellen, ob ein Benutzer berechtigt ist Mails zu versenden. Dazu muss Dovecot einen Socket bereitstellen über den Postfix seine Anfragen stellen kann. Der Socket wird in der Datei /etc/dovecot/conf.d/10-master.conf konfiguriert.

service auth {
  unix_listener auth-userdb {
    mode = 0666
    user = vmail
    group = vmail
  }

  # Postfix smtp-auth
  unix_listener /var/spool/postfix/private/auth {
    mode = 0666
    user = postfix
    group = postfix
  }
}

LMTP Socket

Für die lokale Zustellung in die Postfächer wird LMTP (Local Mail Transport Protocol) verwendet, das ähnlich wie SMTP ist. Dazu richten wir postfix nochmal einen Socket in der Datei /etc/dovecot/conf.d/10-master.conf ein:

service lmtp {
  unix_listener /var/spool/postfix/private/dovecot-lmtp {
    mode = 0660
    user = postfix
    group = postfix
  }
}

Damit wir mitbekommen, wenn eine Zustellung fehlschlägt, muss in der Datei /etc/dovecot/conf.d/15-lda.conf die Adresse für den Postmaster auf eine gültige Adresse gesetzt werden und der Eintrag dafür einkommentiert werden.

postmaster_address = postmaster@mydomain.de

Siehe auch Dovecot Wiki.

Weitere Einstellungen

Verwendet man Thunderbird als Mail Client und :LAYOUT=fs sollte man noch folgende Option in /etc/dovecot/conf.d/20-imap.conf setzen:

imap_client_workarounds = tb-extra-mailbox-sep

Siehe auch Dovecot Wiki.

Dovecot neu starten

Nach dem Ändern der Konfiguration muss Dovecot neu gestartet werden oder mitgeteilt werden, dass er die Konfiguraiton neu laden soll. Den Serverdienst startet man mit

sudo service dovecot start

und stoppt ihn mit

sudo service dovecot stop

und startet ihn neu mit

sudo service dovecot restart

Backup einspielen

Mein erster Versuch einfach die Ordner des Maildir Verzeichnisses auf den neuen Server zu kopieren und dann in Thunderbird die Ordner per "Abonnieren..." hinzuzufügen hat direkt mal geklappt.

Alle Mails waren da, allerdings alle als "Ungelesen". Mal sehen ob ich da noch eine bessere Methode finde.

E-Mail Client

Im E-Mail Client, wie z.B. Thunderbird müssen folgende Werte für den Abruf von Mails vom IMAP Konto eingestellt werden:

Einstellung Wert
Verbindungsart IMAP
Port 143
Verbindungssicherheit STARTSSL
Authentifizierung Passwort, normal

Fehleranalyse

Falls es doch mal nicht so klappt wie man will, sollte man die beiden folgenden Dateien im Auge behalten:

/var/log/mail.err
/var/log/mail.log

Der kleine Helfer multitail bietet sich da an. Damit lassen sich mehrere Logs auf einmal ansehen.

multitail /var/log/mail.err /var/log/mail.log

Sollten die Logs nicht genügend Informationen zur Lösung eines Problems liefern, so sollte man einen Blick in die Datei /etc/dovecot/conf.d/10-logging.conf werfen. Hier kann man auf vielfältige Weise den Informationsgehalt der Log-Dateien anpassen.

Dienstag
27
Mai 2014
Klaus Moser
Klaus Moser

Ubuntu 14.04 - Mailserver - Einleitung

Auf meiner alten NAS hatte ich bislang bereits einen Mailserver, der mit von diversen Konten Mails abgeholt hat und lokal gespeichert hat. Mails über die NAS zu versenden hatte ich damals nicht geplant da ich nur einen Datenspeicher für meine Mails benötigt hatte. Auf der neuen NAS werde ich mal versuchen einen richtigen Mailserver aufzusetzen, der die Mails auch über einen Smarthost versenden kann und auch gleich nach Viren und Spam sucht.

Vorbereitung

Um einen Mailserver zu installieren werden ein paar Pakete benötigt. Unter Ubuntu 14.04 waren die Basispakete unter dem Meta-Paket mail-server zusammengefasst. Inzwischen heißt das Paket mail-stack-delivery. Um dieses zu installieren folgenden Befehl ausführen.

sudo apt install mail-stack-delivery

Unter Ubuntu 14.04 ist das ^ am Ende des Paketnamens wichtig.

sudo apt-get install mail-server^

Das installiert zusätzlich die Pakete 

  • postfix (MTA)
  • dovecot-core (Email Server)
  • dovecot-imapd
  • dovecot-pop3d
  • (procmail (MDA))

und noch ein paar weitere Pakete wie libassuan0, libgpgme11, libtokyocabinet9, mutt, bsd-mailx.

Da ich keinen POP3 Dienst benutzen werde, werde ich das entsprechende Paket wieder entfernen:

sudo apt-get purge dovecot-pop3d

Ein Postfach ist in der Standardinstallation je mit einem Benutzer auf dem Server gekoppelt. Wenn man möchte kann man auch virtuelle Benutzer einrichten. Dazu muss man weitere Pakete installieren die dovecot und postfix die Fähigkeit verleihen Benutzer z.B. anhand einer MySQL Datenbank zu authentifizieren. Diese Pakete müssen noch nachinstalliert werden:

  • postfix-mysql
  • dovecot-mysql

Um die Pakete zu installieren führen wir folgendes aus:

sudo apt-get install postfix-mysql dovecot-mysql

Die Konfiguration der einzelnen Serverdienste werde ich in separaten Blogbeiträgen behandeln, da diese doch recht umfangreich werden dürften.

Im nächsten Beitrag werde ich mich mit der Einrichtung eines IMAP Servers mit Dovecot beschäftigen. Dieser soll per SSL/TLS abgesichert sein und virtuelle Benutzer verwalten können.

Blog

Kmoser's Tech-Blog