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 it213.int ist bereits als MX für den Mailserver eingetragen
- Basiskenntnisse in Linux und Mailserver-Administration
- Internetzugang für Paketinstallation und DNS-Abfragen
Ist der MX Record richtig eingetragen?
- Verwende eines dieser Tools
- host -t mx it213.int
- nslookup -q=mx it213.int
- dig -t mx it213.int
Installation
- 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
Mailformate
/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 – Domains für die dieser Server Mails annimmt
- 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 Dienste wie SMTP oder SMTPS zu aktivieren
Erklärung der main.cf
/etc/postfix/main.cf
# Siehe /usr/share/postfix/main.cf.dist für eine kommentierte Version
smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU)
biff = no
append_dot_mydomain = no
readme_directory = no
compatibility_level = 3.6
# TLS Einstellungen
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
smtp_tls_CApath=/etc/ssl/certs
smtp_tls_security_level=may
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
# Relay Regeln
smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated defer_unauth_destination
# Hostname des Mailservers
myhostname = mail.it213.int
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
# Ursprungsdomain
myorigin = /etc/mailname
# Domains für die dieser Server Mails annimmt
mydestination = $myhostname, localhost.it213.int, it213.int, localhost
relayhost =
# Vertrauenswürdige Netzwerke
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = all
inet_protocols = all
Änderungen
Wir erweitern Postfix so, dass Mails im Maildir Format gespeichert werden.
Maildir aktivieren
- vi /etc/postfix/main.cf
Am Ende der Datei ergänzen
home_mailbox = Maildir/ mailbox_command =
Damit speichert Postfix neue Mails direkt im Maildir des Benutzers.
Postfix starten
- Start des Mailservers
- systemctl start postfix
Postfix Handling
Man kann Postfix über systemctl steuern
- systemctl start postfix
- systemctl status postfix
- systemctl stop postfix
- systemctl restart postfix
Man kann Postfix auch direkt über das Programm postfix steuern
- postfix status
- postfix start
- postfix stop
- postfix reload
- postfix check
Logging
- journalctl -f -u postfix
Mar 14 12:51:38 mail.it213.int systemd[1]: Starting postfix.service - Postfix Mail Transport Agent... Mar 14 12:51:38 mail.it213.int systemd[1]: Finished postfix.service - Postfix Mail Transport Agent. Mar 14 12:56:38 mail.it213.int systemd[1]: postfix.service: Deactivated successfully. Mar 14 12:56:38 mail.it213.int systemd[1]: Stopped postfix.service - Postfix Mail Transport Agent. Mar 14 12:56:38 mail.it213.int systemd[1]: Stopping postfix.service - Postfix Mail Transport Agent... Mar 14 12:56:39 mail.it213.int systemd[1]: Starting postfix.service - Postfix Mail Transport Agent... Mar 14 12:56:39 mail.it213.int systemd[1]: Finished postfix.service - Postfix Mail Transport Agent.
Wir legen zwei Benutzer an
- useradd -m -s /bin/bash martha
- useradd -m -s /bin/bash leroy
- passwd martha
- passwd leroy
Übung
- Mach drei SSH-Verbindungen zum Mailserver
- Eine als martha
- Eine als leroy
- Eine als root
- Root beobachtet die Logs
- journalctl -f -u postfix@-.service
Mails verschicken auf der Konsole
Wir nutzen das Programm mail aus den mailutils.
Leroy
- echo "1. Mail" | mail -s "1. Mail" martha
- echo "2. Mail" | mail -s "2. Mail" martha@mail.it213.int
- echo "3. Mail" | mail -s "3. Mail" martha@it213.int
- echo "4. Mail" | mail -s "4. Mail" technik@xinux.de
Martha
- Martha startet das Programm mail
"/home/martha/Maildir": 3 messages 3 new >N 1 leroy@mail.it213.int Sun Mar 16 12:01 13/416 1. Mail N 2 leroy@mail.it213.int Sun Mar 16 12:01 13/433 2. Mail N 3 leroy@mail.it213.int Sun Mar 16 12:01 13/418 3. Mail
Martha prüft wo die Mails liegen
- find Maildir -type f
Maildir/cur/1742126491.V802I1c001cM284805.mail.it213.int,a=O,u=3:2, Maildir/cur/1742126491.V802I1c001bM254082.mail.it213.int,a=O,u=2:2, Maildir/cur/1742126491.V802I1c001aM245928.mail.it213.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 über SASL
- Dovecot stellt eine eigene SASL-Implementierung bereit
- Dovecot kann verschiedene Backend-Methoden nutzen, z. B. PAM, LDAP, SQL oder lokale Benutzer
Warum nutzen wir den Socket von Dovecot?
- Dovecot stellt einen Unix-Socket bereit
- Postfix nutzt diesen Socket zur Benutzer-Authentifizierung
- Die Verbindung erfolgt lokal und ist daher sicher
SASL Konfiguration mit Dovecot
- Wir nutzen Dovecot für SASL
- vi /etc/dovecot/conf.d/10-master.conf
service imap-login {
inet_listener imap {
}
inet_listener imaps {
}
}
service pop3-login {
inet_listener pop3 {
}
inet_listener pop3s {
}
}
service lmtp {
unix_listener /var/spool/postfix/private/dovecot-lmtp {
mode = 0600
user = postfix
group = postfix
}
}
service auth {
unix_listener /var/spool/postfix/private/auth {
mode = 0660
user = postfix
group = postfix
}
}
service auth-worker {
}
Postfix Änderung
- vi /etc/postfix/main.cf
smtpd_sasl_type = dovecot smtpd_sasl_path = private/auth smtpd_sasl_auth_enable = yes
Dienste neu starten
- systemctl restart postfix
- systemctl restart dovecot
Kein Submission, stattdessen SMTPS (Port 465)
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.
Viele Administratoren bevorzugen jedoch weiterhin SMTPS auf Port 465.
Der Vorteil von SMTPS ist, dass die Verbindung sofort verschlüsselt aufgebaut wird.
SMTPS aktivieren
- vi /etc/postfix/master.cf
smtps inet n - y - - smtpd -o smtpd_tls_wrappermode=yes -o smtpd_sasl_auth_enable=yes
Postfix neu starten
- systemctl restart postfix
Kontrolle der offenen Ports
- ss -lntp | grep master
LISTEN 0 100 0.0.0.0:25 0.0.0.0:* users:(("master",pid=6565))
LISTEN 0 100 0.0.0.0:465 0.0.0.0:* users:(("master",pid=6565))
Test der TLS Verbindung
- openssl s_client -host mail.it213.int -port 465
Dovecot
Während Postfix für den Transport der E-Mails zuständig ist, stellt Dovecot den Zugriff auf die Mailboxen bereit.
Mailclients greifen über IMAP auf den Server zu.
Die wichtigsten Ports sind:
| Dienst | Zweck | Port |
|---|---|---|
| imap | Zugriff auf Mailbox | 143 |
| imaps | verschlüsselter Zugriff | 993 |
| pop3 | Download von Mails | 110 |
| pop3s | verschlüsselter Download | 995 |
Mailformat konfigurieren
- vi /etc/dovecot/conf.d/10-mail.conf
mail_driver = maildir
mail_home = /home/%{user | username}
mail_path = %{home}/Maildir
namespace inbox {
inbox = yes
}
mail_privileged_group = mail
protocol !indexer-worker {
}
Damit greift Dovecot auf die Maildir-Verzeichnisse der Benutzer zu.
TLS für Dovecot
- vi /etc/dovecot/conf.d/10-ssl.conf
ssl = yes ssl_server_cert_file = /etc/ssl/own.crt ssl_server_key_file = /etc/ssl/own.key ssl_min_protocol = TLSv1.2
Damit stellt Dovecot verschlüsselte Verbindungen über IMAPS bereit.
TLS für Postfix
- Bitte diese Einträge ändern
- cat /etc/postfix/main.cf
smtpd_tls_cert_file=/etc/ssl/own.crt smtpd_tls_key_file=/etc/ssl/own.key
Erstellung von Zertifikaten und Private Key
- Erstellt einen Privkey für mail.it2XX.int
- Erstellt einen Certifikate für mail.it2XX.int
- Erstellt eine Fullchain für mail.it2XX.int
- Plaziert die Fullchain auf mail.it2XX.int
- /etc/ssl/own.crt
- Plaziert dden prickey mail.it2XX.int
- /etc/ssl/own.key
Dovecot und Postfix starten
- systemctl restart dovecot
- systemctl restart postfix
Kontrolle der offenen Ports
- ss -lntp | egrep "465|993"
LISTEN 0 100 0.0.0.0:143 LISTEN 0 100 0.0.0.0:993
Test des IMAP Servers
- openssl s_client -connect mail.it213.int:993
- openssl s_client -connect mail.it213.int:465
Finale Konfiguration
Postfix
main.cf
- cat /etc/postfix/main.cf
smtpd_banner = ESMTP (Debian/GNU) biff = no append_dot_mydomain = no readme_directory = no compatibility_level = 3.6 smtpd_tls_cert_file = /etc/ssl/own.crt smtpd_tls_key_file = /etc/ssl/own.key smtpd_tls_security_level=may smtp_tls_CApath=/etc/ssl/certs smtp_tls_security_level=may smtp_tls_session_cache_database = btree:/smtp_scache smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated defer_unauth_destination myhostname = mail.it213.int alias_maps = hash:/etc/aliases alias_database = hash:/etc/aliases myorigin = /etc/mailname mydestination = mail.it213.int, localhost.it213.int, it213.int, localhost relayhost = mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128 mailbox_size_limit = 0 recipient_delimiter = + inet_interfaces = all inet_protocols = all home_mailbox = Maildir/ mailbox_command = smtpd_sasl_type = dovecot smtpd_sasl_path = private/auth smtpd_sasl_auth_enable = yes
master.cf
- cat /etc/postfix/master.cf
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/
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
uucp unix - n n - - pipe
flags=Fqhu user=uucp argv=uux -r -n -z -a - !rmail ()
ifmail unix - n n - - pipe
flags=F user=ftn argv=/usr/lib/ifmail/ifmail -r ()
bsmtp unix - n n - - pipe
flags=Fq. user=bsmtp argv=/usr/lib/bsmtp/bsmtp -t -f
scalemail-backend unix - n n - 2 pipe
flags=R user=scalemail argv=/usr/lib/scalemail/bin/scalemail-store
mailman unix - n n - - pipe
flags=FRX user=list argv=/usr/lib/mailman/bin/postfix-to-mailman.py
smtps inet n - y - - smtpd
-o smtpd_tls_wrappermode=yes
-o smtpd_sasl_auth_enable=yes
Dovecot
master.conf
- cat /etc/dovecot/conf.d/10-master.conf
service imap-login {
inet_listener imap {
}
inet_listener imaps {
}
}
service pop3-login {
inet_listener pop3 {
}
inet_listener pop3s {
}
}
service lmtp {
unix_listener /var/spool/postfix/private/dovecot-lmtp {
mode = 0600
user = postfix
group = postfix
}
}
service auth {
unix_listener /var/spool/postfix/private/auth {
mode = 0660
user = postfix
group = postfix
}
}
service auth-worker {
}
ssl.conf
- cat /etc/dovecot/conf.d/10-ssl.conf
ssl = yes ssl_server_cert_file = /etc/ssl/own.crt ssl_server_key_file = /etc/ssl/own.key ssl_min_protocol = TLSv1.2
mail.conf
- cat /etc/dovecot/conf.d/10-mail.conf
mail_driver = maildir
mail_home = /home/%{user | username}
mail_path = %{home}/Maildir
namespace inbox {
inbox = yes
}
mail_privileged_group = mail
protocol !indexer-worker {
}