Mailserver Workshop Konfiguration
Zielsetzung
- Einrichtung eines Mailservers mit Postfix, Dovecot und Rspamd
- Unverschlüsselte Grundkonfiguration der Dienste
- Schrittweise Absicherung durch Verschlüsselung
- Integration von Rspamd zur Spam- und Virenerkennung
- Logging und Fehleranalyse für eine stabile Mailserver-Umgebung
Voraussetzungen
- Debian- oder Ubuntu-Server mit Root-Zugriff
- Domain it113.int ist bereits als MX für den Mailserver eingetragen
- Basiskenntnisse in Linux und Mailserver-Administration
- Internetzugang für Paketinstallation und DNS-Abfragen
Postfix: SMTP-Server-Konfiguration
- Installation und Grundkonfiguration von Postfix
- Einrichten von Mailboxen mit /var/mail
- Konfiguration von mydestination und relay_domains
- Überprüfung der Postfix-Queue und Logs
Dovecot: IMAP- und POP3-Server
- Installation von Dovecot mit Unterstützung für Maildir
- Konfiguration der Authentifizierung mit PAM oder LDAP
- Anpassung der Konfiguration für unverschlüsselte Verbindungen
- Überprüfung der Logfiles auf Fehler
Absicherung der Mailkommunikation
- Einrichtung von STARTTLS für Postfix
- Aktivierung von SSL/TLS für Dovecot
- Erstellung eines selbstsignierten oder Let’s Encrypt-Zertifikats
- Test der verschlüsselten Kommunikation mit openssl s_client
Integration von Rspamd
- Installation und Grundkonfiguration von Rspamd
- Konfiguration der Spam-Filter und Bayes-Trainings
- Aktivierung von Greylisting zur Spam-Reduzierung
- Integration mit Postfix für die automatische Filterung
Logging und Fehleranalyse
- Aktivierung detaillierter Logs in Postfix und Dovecot
- Nutzung von journalctl und mail.log zur Fehleranalyse
- Debugging von TLS-Problemen mit openssl
- Analyse von Rspamd-Statistiken zur Spam-Erkennung
Abschluss und Test
- Test der Mailfunktionalität mit Telnet und Mutt
- Überprüfung der Spam-Filter mit Test-E-Mails
- Sicherstellung der korrekten TLS-Verschlüsselung
Ist der MX Record richtig eingetragen?
- Verwende eins diseser Tools
- host -t mx it113.int 127.0.0.1
- nslookup -q=mx it113.int
- dig -t mx it113.int
Installatation
- apt update
- apt install postfix dovecot-core dovecot-imapd dovecot-lmtpd mailutils
Bei der Abfrage Internet Site wählen.
Beschreibung der Pakete für den Mailserver
Postfix
- Postfix ist ein Mail-Transport-Agent (MTA)
- Zuständig für den Versand und Empfang von E-Mails
- Nimmt E-Mails von lokalen oder entfernten Clients an und leitet sie weiter
Dovecot-Core
- Grundlegende Infrastruktur von Dovecot
- Wird für die Bereitstellung von IMAP- und POP3-Diensten genutzt
- Enthält noch keine spezifischen Protokolle
Dovecot-IMAPD
- Aktiviert den IMAP-Dienst in Dovecot
- Ermöglicht den Zugriff auf E-Mails direkt auf dem Server
- Standardprotokoll für moderne E-Mail-Clients
Dovecot-LMTPD
- Aktiviert den LMTP-Dienst (Local Mail Transfer Protocol)
- Zuständig für die interne Mail-Zustellung von Postfix an Dovecot
- Effizientere Alternative zu `mailbox_command` für die Mailzustellung
Mailutils
- Sammlung von Mail-Werkzeugen für Unix/Linux
- Enthält Befehle wie `mail` zum Senden und Lesen von E-Mails
- Unterstützt verschiedene Mail-Speicherformate wie mbox und Maildir
- Nützlich für Tests und Skripte in Mailserver-Umgebungen
/var/spool/mail (mbox)
- Speichert alle E-Mails eines Nutzers in einer einzigen Datei
- Zentrale Speicherung unter /var/spool/mail/<benutzer>
- Schneller bei sehr kleinen Mailboxen, aber langsamer bei vielen Mails
- Probleme mit Dateisperren bei gleichzeitigen Zugriffen möglich
- Schwerer zu sichern, da Änderungen in einer einzigen Datei passieren
Maildir
- Speichert jede E-Mail als eine eigene Datei im Benutzerverzeichnis ~/Maildir/
- Bessere Performance, da parallele Zugriffe möglich sind
- Kein Locking-Problem, da keine zentrale Datei gesperrt werden muss
- Einfaches Backup, da Mails als einzelne Dateien kopiert werden können
- Unterstützt von modernen Mailservern und Clients besser
Empfehlung
- Maildir wird empfohlen, da es stabiler, moderner und einfacher zu verwalten ist
- /var/spool/mail ist nur sinnvoll, wenn eine zentrale Speicherung ohne Benutzer-Home-Verzeichnisse gewünscht ist
Jeder neue Benutzer bekommt diese Dateien im Homeverzeichnis
- mkdir -p /etc/skel/Maildir/{cur,new,tmp}
- echo 'export MAIL=$HOME/Maildir' >> /etc/skel/.bashrc
Postfix: Einführung in main.cf und master.cf
Postfix verwendet zwei zentrale Konfigurationsdateien zur Steuerung des Mail-Transports und der Dienste.
main.cf (Hauptkonfiguration)
- Enthält die grundlegenden Einstellungen für Postfix
- Definiert Parameter wie Domain, Relay-Regeln und Authentifizierung
- Typische Einstellungen:
- myhostname – Hostname des Mailservers
- mydestination – Akzeptierte lokale Domains
- relayhost – Weiterleitungsziel für ausgehende Mails
- smtpd_recipient_restrictions – Regeln für eingehende E-Mails
master.cf (Dienstkonfiguration)
- Steuert, welche Postfix-Dienste aktiv sind
- Legt fest, welche Prozesse auf bestimmten Ports lauschen
- Wird verwendet, um Maildienste wie SMTP, Submission oder LMTP zu aktivieren
- Typische Einstellungen:
- smtp – Standard-SMTP-Dienst für eingehende Mails
- submission – SMTP-Dienst für authentifizierte Clients
- lmtp – Local Mail Transfer Protocol zur Zustellung an Dovecot
Erklärung der main.cf
/etc/postfix/main.cf
# Siehe /usr/share/postfix/main.cf.dist für eine kommentierte, vollständigere Version
# Debian-spezifisch: Wenn ein Dateiname angegeben wird, wird die erste Zeile dieser Datei
# als Name verwendet. Der Debian-Standard ist /etc/mailname.
#myorigin = /etc/mailname
# Begrüßungsbanner für SMTP-Verbindungen
smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU)
# Deaktiviert Biff, das sonst Benachrichtigungen über neue Mails an lokale Benutzer sendet
biff = no
# Das Anhängen der Domain an lokale E-Mail-Adressen ist Aufgabe des Mail-Clients (MUA)
append_dot_mydomain = no
# Zeit, nach der eine verzögerte Zustellwarnung gesendet wird (auskommentiert)
#delay_warning_time = 4h
# Deaktiviert das README-Verzeichnis für Benutzer
readme_directory = no
# Siehe http://www.postfix.org/COMPATIBILITY_README.html -- Standard ist 3.6 bei neuen Installationen
compatibility_level = 3.6
# TLS-Parameter (Zertifikate für verschlüsselte Verbindungen)
smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
smtpd_tls_security_level=may # TLS wird unterstützt, aber nicht erzwungen
# TLS für ausgehende SMTP-Verbindungen
smtp_tls_CApath=/etc/ssl/certs
smtp_tls_security_level=may # TLS wird für ausgehende Verbindungen unterstützt, aber nicht erzwungen
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
# Regeln für das Relaying (Weiterleiten) von E-Mails
smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated defer_unauth_destination
# Hostname dieses Mailservers
myhostname = ns.it113.int
# Pfad zur Aliase-Datei, die E-Mail-Aliasnamen speichert
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
# Ursprungsdomain für ausgehende Mails
myorigin = /etc/mailname
# Lokale Domains, für die dieser Server E-Mails annimmt
mydestination = $myhostname, ns.it113.int, localhost.it113.int, , localhost
# Standard-Relay-Host (leer, d.h. keine Weiterleitung an einen anderen Server)
relayhost =
# Netzwerke, die ohne Authentifizierung E-Mails über diesen Server senden dürfen
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
# Maximale Postfachgröße (0 bedeutet unbegrenzt)
mailbox_size_limit = 0
# Trennzeichen für Adressvarianten (z.B. user+info@example.com)
recipient_delimiter = +
# Auf welchen Netzwerk-Schnittstellen Postfix lauscht (hier: alle)
inet_interfaces = all
# Unterstützte Internetprotokolle (IPv4 und IPv6)
inet_protocols = all
Änderungen
Wir ändern diese Zeile
mydestination = $myhostname, ns.it113.int, localhost.it113.int, it113.int, localhost
Nir so nimmt Postfix auch die Mails für diese Domain an.
Maildirformat
- Wir fügen an
home_mailbox=Maildir/ mailbox_command =
- systemctl start postfix
Postfix Handling
Man kann Postfix über systemctl ganz normal steuern
- systemctl start postfix
- systemctl status postfix
- systemctl stop postfix
- systemctl restart postfix
Man kann Postfix aber auch postfix steuern
- postfix status
- postfix start
- postfix stop
- postfix reload
- postfix check
Logging
- journalctl -f -u postfix@-.service
Mar 14 12:51:38 ns.it113.int systemd[1]: Starting postfix.service - Postfix Mail Transport Agent... Mar 14 12:51:38 ns.it113.int systemd[1]: Finished postfix.service - Postfix Mail Transport Agent. Mar 14 12:56:38 ns.it113.int systemd[1]: postfix.service: Deactivated successfully. Mar 14 12:56:38 ns.it113.int systemd[1]: Stopped postfix.service - Postfix Mail Transport Agent. Mar 14 12:56:38 ns.it113.int systemd[1]: Stopping postfix.service - Postfix Mail Transport Agent... Mar 14 12:56:39 ns.it113.int systemd[1]: Starting postfix.service - Postfix Mail Transport Agent... Mar 14 12:56:39 ns.it113.int systemd[1]: Finished postfix.service - Postfix Mail Transport Agent.
Wir legen 2 User an
- useradd -m -s /bin/bash martha
- useradd -m -s /bin/bash leroy
- passwd martha
- passwd leroy
/etc/postfix/master.cf
# ==========================================================================
# service type private unpriv chroot wakeup maxproc command + args
# (yes) (yes) (no) (never) (100)
# ==========================================================================
smtp inet n - y - - smtpd
pickup unix n - y 60 1 pickup
cleanup unix n - y - 0 cleanup
qmgr unix n - n 300 1 qmgr
tlsmgr unix - - y 1000? 1 tlsmgr
rewrite unix - - y - - trivial-rewrite
bounce unix - - y - 0 bounce
defer unix - - y - 0 bounce
trace unix - - y - 0 bounce
verify unix - - y - 1 verify
flush unix n - y 1000? 0 flush
proxymap unix - - n - - proxymap
proxywrite unix - - n - 1 proxymap
smtp unix - - y - - smtp
relay unix - - y - - smtp
-o syslog_name=postfix/$service_name
showq unix n - y - - showq
error unix - - y - - error
retry unix - - y - - error
discard unix - - y - - discard
local unix - n n - - local
virtual unix - n n - - virtual
lmtp unix - - y - - lmtp
anvil unix - - y - 1 anvil
scache unix - - y - 1 scache
postlog unix-dgram n - n - 1 postlogd
maildrop unix - n n - - pipe
flags=DRXhu user=vmail argv=/usr/bin/maildrop -d ${recipient}
uucp unix - n n - - pipe
flags=Fqhu user=uucp argv=uux -r -n -z -a$sender - $nexthop!rmail ($recipient)
ifmail unix - n n - - pipe
flags=F user=ftn argv=/usr/lib/ifmail/ifmail -r $nexthop ($recipient)
bsmtp unix - n n - - pipe
flags=Fq. user=bsmtp argv=/usr/lib/bsmtp/bsmtp -t$nexthop -f$sender $recipient
scalemail-backend unix - n n - 2 pipe
flags=R user=scalemail argv=/usr/lib/scalemail/bin/scalemail-store ${nexthop} ${user} ${extension}
mailman unix - n n - - pipe
flags=FRX user=list argv=/usr/lib/mailman/bin/postfix-to-mailman.py ${nexthop} ${user}
Postfix: master.cf (Dienststeuerung)
Die Datei /etc/postfix/master.cf steuert die Dienste, die Postfix starten und verwalten soll. Hier werden die Mail-Transporte und internen Prozesse konfiguriert.
Wichtige Dienste in master.cf
- smtp – Standard-SMTP-Dienst für den Empfang von E-Mails
- pickup – Holt Mails aus der lokalen Warteschlange zur Verarbeitung
- qmgr – Mail-Queue-Manager, der Mails zur Zustellung verwaltet
- cleanup – Bereinigt und formatiert eingehende Mails
- local – Zustellung von Mails an lokale Benutzer
- virtual – Zustellung an virtuelle Domains oder Benutzer
- lmtp – Local Mail Transfer Protocol für die Übergabe an Dovecot
- relay – SMTP-Relay-Dienst für den Versand von Mails
Ja, Postfix hat ab Version 3.4 die native SMTPS-Unterstützung (Port 465) standardmäßig entfernt. Stattdessen setzt die Postfix-Community weiterhin auf Submission (Port 587) mit STARTTLS als empfohlene Methode für authentifizierte Clients.
Warum das so gemacht wurde:
Port 587 mit STARTTLS wird als flexibler angesehen, weil er sowohl unverschlüsselte als auch verschlüsselte Verbindungen erlaubt. Port 465 (SMTPS) wurde ursprünglich als veraltet betrachtet, weil er nicht standardisiert war (später wieder in RFC 8314 aufgenommen). Viele Mailclients und Provider haben sich an Port 587 gewöhnt. Allerdings empfiehlt das BSI weiterhin Port 465 (SMTPS) als sicherere Alternative, weil es ausschließlich verschlüsselte Verbindungen erzwingt.
Das Dilema
- Postfix hat ab Version 3.4 die native SMTPS-Unterstützung (Port 465) standardmäßig entfernt.
- Stattdessen setzt die Postfix-Community weiterhin auf Submission (Port 587) mit STARTTLS als empfohlene Methode für authentifizierte Clients.
- Port 587 mit STARTTLS wird als flexibler angesehen, weil er sowohl unverschlüsselte als auch verschlüsselte Verbindungen erlaubt.
- Port 465 (SMTPS) wurde ursprünglich als veraltet betrachtet, weil er nicht standardisiert war (später wieder in RFC 8314 aufgenommen).
- Viele Mailclients und Provider haben sich an Port 587 gewöhnt.
- Allerdings empfiehlt das BSI weiterhin Port 465 (SMTPS) als sicherere Alternative, weil es ausschließlich verschlüsselte Verbindungen erzwingt.
Kein Submission, stattdessen SMTPS (Port 465)
Das BSI empfiehlt SMTPS (Port 465) anstelle von Submission (Port 587), da SMTPS eine direkte TLS-Verschlüsselung erfordert.
Falls SMTPS genutzt werden soll, kann folgender Eintrag in der master.cf ergänzt werden:
smtps inet n - y - - smtpd -o smtpd_tls_wrappermode=yes -o smtpd_sasl_auth_enable=yes
Damit akzeptiert Postfix sichere Verbindungen über SMTPS mit sofortiger Verschlüsselung.
Restart und Check
- Restart
- systemctl restart postfix
- Welche Ports sind auf
- ss -lntp | grep master
LISTEN 0 100 0.0.0.0:25 0.0.0.0:* users:(("master",pid=6565,fd=13))
LISTEN 0 100 0.0.0.0:465 0.0.0.0:* users:(("master",pid=6565,fd=110))
LISTEN 0 100 [::]:25 [::]:* users:(("master",pid=6565,fd=14))
LISTEN 0 100 [::]:465 [::]:* users:(("master",pid=6565,fd=111))
- Zertifikatscheck
Das Zertifikat ist selbstsigniert dies müssen wir später noch austauschen.
- openssl s_client -host mail.it113.int -port 465
CONNECTED(00000003) depth=0 CN = mail.it113.int verify return:1 --- Certificate chain 0 s:CN = mail.it113.int i:CN = mail.it113.int a:PKEY: rsaEncryption, 2048 (bit); sigalg: RSA-SHA256 v:NotBefore: Mar 16 11:36:27 2025 GMT; NotAfter: Mar 14 11:36:27 2035 GMT --- Server certificate -----BEGIN CERTIFICATE----- MIIDBzCCAe+gAwIBAgIUCz+Wk67WtIF1m9KsPKSfJeotN0kwDQYJKoZIhvcNAQEL ...
Wo sind wir jetzt und was geht
- ss -lntp
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 100 0.0.0.0:993 0.0.0.0:* users:(("dovecot",pid=6205,fd=37))
LISTEN 0 100 0.0.0.0:143 0.0.0.0:* users:(("dovecot",pid=6205,fd=35))
LISTEN 0 128 0.0.0.0:22 0.0.0.0:* users:(("sshd",pid=512,fd=3))
LISTEN 0 100 0.0.0.0:25 0.0.0.0:* users:(("master",pid=6565,fd=13))
LISTEN 0 100 0.0.0.0:465 0.0.0.0:* users:(("smtpd",pid=6584,fd=6),("master",pid=6565,fd=110))
LISTEN 0 100 [::]:993 [::]:* users:(("dovecot",pid=6205,fd=38))
LISTEN 0 100 [::]:143 [::]:* users:(("dovecot",pid=6205,fd=36))
LISTEN 0 128 [::]:22 [::]:* users:(("sshd",pid=512,fd=4))
LISTEN 0 100 [::]:25 [::]:* users:(("master",pid=6565,fd=14))
LISTEN 0 100 [::]:465 [::]:* users:(("smtpd",pid=6584,fd=7),("master",pid=6565,fd=111))
Wir haben folgendes Dienst laufen
| Dienst | Zweck | Verschlüsselt | Notwendig für Clients | Standard-Port |
|---|---|---|---|---|
| smtp | Versand von E-Mails zwischen Mailservern | Nein (STARTTLS möglich) | Ja, für ausgehende Mails | 25 |
| smtps | Verschlüsselter Versand von E-Mails | Ja (TLS erzwungen) | Empfohlen vom BSI für ausgehende Mails | 465 |
| imap | Zugriff auf Mails auf dem Server | Nein (STARTTLS möglich) | Ja, für moderne Mailclients | 143 |
| imaps | Verschlüsselter Zugriff auf Mails | Ja (TLS erzwungen) | Empfohlen für sichere Mailverbindungen | 993 |
| pop3 | Herunterladen von Mails vom Server | Nein (STARTTLS möglich) | Selten genutzt, veraltet | 110 |
| pop3s | Verschlüsseltes Herunterladen von Mails | Ja (TLS erzwungen) | Nicht mehr empfohlen, IMAP bevorzugen | 995 |
Übung
- Mach zwei ssh Verbidungen zum Mailserver
- Eine als martha und eine als leroy
- Mahct noch eine dritte als root auf.
- Dort gucken wir was passiert
- journalctl -f -u postfix@-.service
- Wir nutzen zum lokalen verschicken das Programm mail aus den mailutils
Kleines Tutorial
Mails verschicken auf der Konsole
Root sollte Logs checken und beobachten
- Leroy
- echo "1. Mail" | mail -s "1. Mail" martha
- echo "2. Mail" | mail -s "2. Mail" martha@mail.it113.int
- echo "3. Mail" | mail -s "3. Mail" martha@it113.int
- echo "4. Mail" | mail -s "4. Mail" technik@xinux.de
- Martha
- ruft mail auf
"/home/martha/Maildir": 3 messages 3 new >N 1 leroy@mail.it113.i Sun Mar 16 12:01 13/416 1. Mail
N 2 leroy@mail.it113.i Sun Mar 16 12:01 13/433 2. Mail N 3 leroy@mail.it113.i Sun Mar 16 12:01 13/418 3. Mail
- Martha verlässt mail und guckt wo die Mails wirklich liegen
- find Maildir -type f
Maildir/cur/1742126491.V802I1c001cM284805.mail.it113.int,a=O,u=3:2, Maildir/cur/1742126491.V802I1c001bM254082.mail.it113.int,a=O,u=2:2, Maildir/cur/1742126491.V802I1c001aM245928.mail.it113.int,a=O,u=1:2, Maildir/.mu-prop
SASL
- SASL (Simple Authentication and Security Layer) wird verwendet, um die Authentifizierung für den Versand von E-Mails über SMTP zu ermöglichen.
- Ohne SASL könnte jeder über den Mailserver E-Mails verschicken, was ihn zu einem offenen Relay machen würde.
Warum nutzen wir Dovecot für SASL?
- Postfix kennt keine Benutzer und kann sich nicht direkt über PAM oder andere Authentifizierungsmechanismen anmelden
- Die Authentifizierung erfolgt ausschließlich über SASL, das in Postfix eingebunden wird
- Dovecot stellt eine eigene SASL-Implementierung bereit, die mit Postfix kompatibel ist
- Dovecot kann verschiedene Backend-Methoden nutzen, z. B. **PAM, LDAP, SQL oder lokale Benutzer**
- Vermeidet zusätzliche Abhängigkeiten wie Cyrus SASL
Warum nutzen wir den Socket von Dovecot?
- Dovecot stellt einen Unix-Socket bereit, den Postfix nutzen kann
- Postfix nutzt diesen Socket zur Benutzer-Authentifizierung, ohne eigene Benutzerverwaltung
- Die Verbindung erfolgt lokal, was sicherer ist als eine Netzwerkverbindung
SASL Konfiguration mit Dovecot
- Wir nutzen Dovecot für SASL
- vi /etc/dovecot/conf.d/10-master.conf
service auth {
}
# Postfix smtp-auth
unix_listener /var/spool/postfix/private/auth {
mode = 0660
user = postfix
group = postfix
}
...
}
- vi /etc/dovecot/conf.d/10-auth.conf
auth_mechanisms = plain login
Postfix Änderung
- vi /etc/postfix/main.cf
smtpd_sasl_type = dovecot smtpd_sasl_path = private/auth smtpd_sasl_auth_enable = yes
Dienste neustarten
- systemctl restart postfix
- systemctl restart dovecot
Kein Submission, stattdessen SMTPS (Port 465) =
Das BSI empfiehlt SMTPS (Port 465) anstelle von Submission (Port 587), da SMTPS eine direkte TLS-Verschlüsselung erfordert.
Falls SMTPS genutzt werden soll, kann folgender Eintrag in der master.cf ergänzt werden:
smtps inet n - y - - smtpd -o smtpd_tls_wrappermode=yes -o smtpd_sasl_auth_enable=yes
Damit akzeptiert Postfix sichere Verbindungen über SMTPS mit sofortiger Verschlüsselung.
SMTPS aktivieren
Postfix
Zertifikate kopieren
- cp mail.it113.int.crt mail.it113.int.key /etc/postfix/
Vom Nameserver
- Vorher
- openssl s_client -host mail.it113.int -port 465
Zertifikate ersetzen
# TLS parameters smtpd_tls_cert_file=/etc/postfix/mail.it113.int.crt smtpd_tls_key_file=/etc/postfix/mail.it113.int.key
Neustarten
- systemctl restart postfix
Vom Nameserver
- Nachher
- openssl s_client -host mail.it113.int -port 465