Theorie E-Mail-Protokolle
Note: In diesem Protokoll wurden zwei Server konfiguriert:
mail.prima.nscs.lan+mail.fri3dl.nscs.lan.`
SMTP (Simple Mail Transfer Protocol) Zwischen Mail-Clients und Servern und zwischen zwei Servern, normalerweise auf Port 25.
Postfix Alternativen:
- Sendmail: Der "Klassiker", sehr mächtig und komplex, aber schwer zu konfigurieren und in der Vergangenheit sicherheitsanfällig (monolithische Struktur).
- Exim: Standard bei Debian, sehr flexibel und konfigurierbar, aber Konfiguration kann unübersichtlich werden.
- Qmail: Fokus auf Sicherheit und Modularität, aber wird nicht mehr aktiv weiterentwickelt und Lizenz war lange restriktiv.
- Microsoft Exchange: Proprietärer Server, sehr verbreitet in Firmen (Groupware), aber teuer und nur auf Windows.
ESMTP (Extended SMTP) Erweitert SMTP um Authentifizierung, senden von Binärobjekten und STARTTLS.
SMTPS (SMTP over TLS) Unterstützt sofortige Verschlüsselung über TLS. Bei SMTP mit STARTTLS wird eine existierende Verbindung zu einer TLS-Verbindung geupgraded.
POP3 (Post Office Protocol v3) Greift auf E-Mails zu, indem alle vom Server auf den Client heruntergeladen werden, d.h. die gesamte Verwaltung passiert am Client. Das ist einfacher für den Server, aber erschwert Synchronisierung zwischen mehreren Clients.
IMAP (Internet Message Access Protocol) Funktioniert ähnlich wie POP3, allerdings passiert die ganze Verwaltung der E-Mails am Server, das braucht mehr Serverressourcen.
MX (Mail Exchanger) Ein DNS-Eintrag gibt an welche(r) Mailserver für diese Zone (oder Domain) zuständig ist/sind.
E-Mail-Pfad
- Ein Mail User Agent (MUA) übergibt die Nachricht an einen Mailserver (MTA, Mail Transfer Agent) mit SMTP, hier gibt es oft Verschlüsselung.
- Der MTA fragt den DNS-Server nach MX-Einträgen ab und sucht einen Mailserver, anschließend wird die Adresse mit A/AAAA-Einträgen aufgelöst.
- Die Mail wird über SMTP an den nächsten Server gesendet. Wenn eine Weiterleitung vorliegt, ist dieser wieder ein MTA, bis ein Server die E-Mail behält, weil sie ihr Ziel erreicht hat.
- Das ist der MDA (Mail Delivery Agent), der die E-Mail im Posteingang speichert und jetzt mit POP3 oder IMAP vom MUA angefragt werden können.
PGP (Pretty Good Privacy)
Schützt E-Mails von Man-in-the-Middle-Attacken mit Verschlüsselung und Digitalen Signaturen. Es gewährleistet Integrität und Authentizität. Verwendet wird ein Hybridschlüsselsystem, d.h. ein symmetrischer Session-Key wird mit einer asymmetrischen Verschlüsselung erstellt und dann für die Sitzung verwendet.
PGP vs GPG: PGP ist ein proprietäres Protokoll von Zimmermann, viele Versionen sind closed-source. GPG (GNU Privacy Guard) ist eine OpenSource Implementierung vom OpenPGP Standard.
Alias
Ein Alias ist wie eine Weiterleitung oder Verknüpfung. Sowohl lokale Benutzer
als auch andere E-Mail-Adressen können als Ziel verwendet werden. Bei Postfix
werden Aliase in /etc/aliases gespeichert.
E-Mail-Speicherung
Standardmäßig werden Emails bei UNIX in /var/mail/<user> in einer Datei
gespeichert (Mbox). Zugriff auf die Emails erfolgt mit dem Befehl mail, der
über das Paket mailutils installiert werden kann. Das unterscheidet sich vom
Maildir-Format (in dieser Übung verwendet), wo E-Mails als einzelne Dateien
in ~/Maildir gespeichert werden.
Postfix und Dovecot Confskiguration für fri3dl.nscs.lan
DNS-Konfiguration
Für den E-Mail-Server wurde eine funktionierende DNS-Konfiguration auf
10.139.0.111:10000 erstellt. Zone: fri3dl.nscs.lan.
- Zone Creation:

- Records:
- NS:
ns.fri3dl.nscs.lan - A (ns):
10.139.0.111 - A (mail):
10.139.0.125(Updated from placeholder .138) - MX:
mail.fri3dl.nscs.lan(Priority 10)


- NS:
Installation auf Server 10.139.0.125
Verbindung via SSH: ssh schueler@10.139.0.125.
Installation von Postfix und Dovecot:
sudo apt update
sudo apt install postfix dovecot-imapd mailutils -y

Konfiguration Postfix (Main.cf)
Die Datei /etc/postfix/main.cf wurde angepasst:
smtpd_banner = $myhostname ESMTP $mail_name (Ubuntu)
biff = no
append_dot_mydomain = no
readme_directory = no
compatibility_level = 3.6
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
smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated defer_unauth_destination
myhostname = mail.fri3dl.nscs.lan
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
myorigin = /etc/mailname
mydestination = $myhostname, fri3dl.nscs.lan, localhost.nscs.lan, 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
# Dovecot integration
home_mailbox = Maildir/
smtpd_sasl_auth_enable = yes
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_authenticated_header = yes
smtpd_sasl_security_options = noanonymous
smtpd_sasl_local_domain = $myhostname
broken_sasl_auth_clients = yes
smtpd_recipient_restrictions = reject_unknown_sender_domain, reject_unknown_recipient_domain, reject_unauth_pipelining, permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination
smtpd_sender_restrictions = reject_unknown_sender_domain
mailbox_command = /usr/lib/dovecot/deliver -m "${EXTENSION}"
Dovecot Konfiguration
Konfiguration der Authentifizierung für Postfix in
/etc/dovecot/conf.d/99-postfix-auth.conf:
service auth {
unix_listener /var/spool/postfix/private/auth {
mode = 0666
user = postfix
group = postfix
}
}
Mail Location in /etc/dovecot/conf.d/99-mail-location.conf:
mail_location = maildir:~/Maildir
Dienste neustarten:
sudo systemctl restart postfix dovecot
User Setup
User fri3dl erstellt:
adduser fri3dl
PGP (GPG) Setup
GPG Key für fri3dl@fri3dl.nscs.lan wurde am Server generiert:
su - fri3dl
gpg --full-generate-key

Export der Keys:
gpg --export -a "fri3dl" > public.key
gpg --export-secret-key -a "fri3dl" > private.key

Server-side Verification
Versenden einer Test-E-Mail direkt am Server mit dem mail-Befehl:
su - fri3dl
echo "Hello from terminal" | mail -s "Terminal Test" fri3dl@fri3dl.nscs.lan
ls -R ~/Maildir/new
Troubleshooting (Externe E-Mail)
Falls E-Mails an externe Domains (z.B. schueler@prima.nscs.lan) mit dem Fehler
Sender address rejected: Domain not found abgelehnt werden, liegt das meist am
falschen System-Hostname (wie halt bei mir zB).
Lösung: Hostname korrekt auf den FQDN setzen:
sudo hostnamectl set-hostname mail.fri3dl.ncs.lan
sudo systemctl reload postfix
Client Setup (Thunderbird)
Auf dem Client wird Thunderbird eingerichtet mit:
- E-Mail:
fri3dl@fri3dl.nscs.lan - Server:
mail.fri3dl.nscs.lan(IP:10.139.0.125) - IMAP Port 143 (STARTTLS)
- SMTP Port 25 (STARTTLS)
Troubleshooting (Zertifikat)
Beim Senden von Nachrichten kann folgende Fehlermeldung auftreten:
Sending of the message failed. The certificate is not trusted because it is self-signed. The configuration related to mail.fri3dl.nscs.lan must be corrected.
Lösung: Da wir selbst-signierte Zertifikate verwenden, muss in Thunderbird eine Sicherheits-Ausnahmeregel (Security Exception) hinzugefügt werden. Klicke dazu im Warn-Dialog auf "Sicherheits-Ausnahmeregel bestätigen" (Confirm Security Exception).
PGP-Nutzung im Client
Um PGP im Client nutzen zu können, müssen die Schlüssel vom Server auf den
lokalen Rechner kopiert werden. Da wir das Passwort für den User fri3dl evtl.
nicht haben (oder ich die vergessen habe), kopieren wir die Keys zuerst zum
User schueler.
- Keys am Server vorbereiten:
ssh schueler@10.139.0.125 sudo sh -c 'cp /home/fri3dl/*.key /home/schueler/' sudo chown schueler:schueler /home/schueler/*.key exit - Keys herunterladen (SCP):
scp schueler@10.139.0.125:~/public.key . scp schueler@10.139.0.125:~/private.key . - Import in Thunderbird:
- Konten-Einstellungen -> End-to-End Encryption
- Add Key...
- Import an existing OpenPGP Key
- die Datei
private.key - Hinweis: Der Public Key ist im Private Key enthalten bzw. wird automatisch mit importiert. Es wird vor allem den Private Key benötigt, um Nachrichten als "fri3dl" signieren und entschlüsseln zu können.
Nach dem Import können E-Mails signiert und verschlüsselt gesendet werden.


Damit die Verschlüsselung auch funktioniert, muss der Empfänger (z.B. martin.weixelbaum@weixmail.llan) den Public Key von fri3dl importieren, damit er die Signatur überprüfen und die Nachricht entschlüsseln kann. Außerdem muss der Empfänger ebenfalls einen eigenen Key besitzen, damit fri3dl die Nachricht mit dem Public Key des Empfängers verschlüsseln kann. Diesen Key sendet der Empfänger dann an fri3dl, damit er ihn in Thunderbird importieren kann.


Jetzt verschickte Nachrichten haben ein Vorhängeschloss-Symbol, das anzeigt, dass sie verschlüsselt sind. Beim Öffnen der Nachricht wird die Verschlüsselung automatisch erkannt und die Nachricht entschlüsselt, sofern der Private Key korrekt importiert wurde.

SPAM- und Virenfilter
sudo apt install amavisd-new clamav-daemon spamassassin razor pyzor
das installiert folgende Pakete:
- Spamassassin bietet Spamfilterung
- ClamAV ist ein für Linux und besonders Mailserver sehr beliebter Virenscanner
- Amavis verbindet Mailserver mit Virenscannern und Spamfiltern
- Razor und pyzor bieten Zugriff auf Online-Spamdatenbanken
ClamAV benötigt normalerweise keine weiteren Anpassungen. Damit er mit Amavis
integriert wird, muss der Benutzer clamav zur amavis-Gruppe hinzugefügt
werden:
sudo adduser clamav amavis

Amavis aktivieren
Um Spam- und Virenschutz zu aktivieren, müssen in
/etc/amavis/conf.d/15-content_filter_mode die folgenden vier Zeilen
einkommentiert werden:
@bypass_virus_checks_maps = (
\%bypass_virus_checks, \@bypass_virus_checks_acl, \$bypass_virus_checks_re);
@bypass_spam_checks_maps = (
\%bypass_spam_checks, \@bypass_spam_checks_acl, \$bypass_spam_checks_re);
Danach Amavis neustarten:
sudo systemctl restart amavis
In /etc/postfix/main.cf folgenden Eintrag hinzufügen:
content_filter = smtp-amavis:[127.0.0.1]:10024
Und in /etc/postfix/master.cf nach der Zeile mit pickup folgende Optionen
einfügen:
-o content_filter=
-o receive_override_options=no_header_body_checks
Und am Ende der Datei folgende Blöcke hinzufügen:
smtp-amavis unix - - - - 2 smtp
-o smtp_data_done_timeout=1200
-o smtp_send_xforward_command=yes
-o disable_dns_lookups=yes
-o max_use=20
127.0.0.1:10025 inet n - - - - smtpd
-o content_filter=
-o local_recipient_maps=
-o relay_recipient_maps=
-o smtpd_restriction_classes=
-o smtpd_delay_reject=no
-o smtpd_client_restrictions=permit_mynetworks,reject
-o smtpd_helo_restrictions=
-o smtpd_sender_restrictions=
-o smtpd_recipient_restrictions=permit_mynetworks,reject
-o smtpd_data_restrictions=reject_unauth_pipelining
-o smtpd_end_of_data_restrictions=
-o mynetworks=127.0.0.0/8
-o smtpd_error_sleep_time=0
-o smtpd_soft_error_limit=1001
-o smtpd_hard_error_limit=1000
-o smtpd_client_connection_count_limit=0
-o smtpd_client_connection_rate_limit=0
-o receive_override_options=no_header_body_checks,no_unknown_recipient_checks
Anschließend Postfix neustarten:
sudo systemctl restart postfix
Testen
Zum Testen des Virenschutzes gibt es den EICAR-Teststring. Eine Datei
eicar.com mit folgendem Inhalt erstellen:
X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*
Diese Datei als Anhang an sich selbst senden (auf Windows muss dafür kurzzeitig
der Echtzeitschutz ausgeschaltet werden). Die Mail sollte nicht ankommen, und
in /var/log/mail.log ist folgende Meldung zu sehen, dass die Mail entfernt
wurde:

Für den Spamfilter gibt es ebenfalls einen Teststring (GTUBE):
XJS*C4JDBQADN1.NSBN3*2IDNEN*GTUBE-STANDARD-ANTI-UBE-TEST-EMAIL*C.34X
Wenn man versucht eine E-Mail damit zu senden, erscheint eine ähnliche Meldung im Log.

Spam-Score konfigurieren
Die Einstellungen für den Spamfilter sind in
/etc/amavis/conf.d/50-user gespeichert. Jeder Mail wird ein Spam-Score
zugeordnet, hier kann das Level festgelegt werden, ab dem bestimmte Maßnahmen
getroffen werden:
$sa_tag_level_deflt = -999; # alle Mails mit Headern versehen
$sa_tag2_level_deflt = 6.31; # Betreff markieren
$sa_kill_level_deflt = 6.31; # Mail löschen/quarantäne
$final_spam_destiny = D_DISCARD; # Spam-Mails verwerfen
Nach einem Neustart von Amavis ist der Score in den Mail-Headern sichtbar.


Whitelist / Blacklist / Greylist
Man kann den Absender auf einer Liste nachschlagen und darauf basierend entscheiden:
- Whitelist: Mails werden explizit erlaubt und manche Checks werden umgangen.
- Blacklist: Lehnt Mails automatisch ab.
- Greylist: Lehnt Mails nur beim ersten Mal ab; wenn die Mail ein zweites Mal gesendet wird, wird sie durchgelassen (mit Spam-Checks).
Für manuelle Black-/Whitelists eine Datei /etc/postfix/sender_access mit dem
Format aus https://www.postfix.org/access.5.html erstellen, z.B.:
spammer@prima.nscs.lan REJECT
uok@prima.nscs.lan OK
Dann die Datei in eine Datenbank konvertieren:
sudo postmap /etc/postfix/sender_access
Und den Eintrag check_sender_access in /etc/postfix/main.cf ganz vorne
einfügen:
smtpd_sender_restrictions =
check_sender_access hash:/etc/postfix/sender_access,
reject_unknown_sender_domain
Postfix neustarten – danach kann uok normal senden, spammer wird abgelehnt.


Für Greylisting die Library postgrey installieren:
sudo apt install postgrey
Und /etc/postfix/main.cf erweitern:
smtpd_recipient_restrictions =
...
check_policy_service inet:127.0.0.1:10023
Die erste Mail wird abgelehnt, nach 5 Minuten wird sie durchgelassen.

Außerdem gibt es öffentliche DNS-basierte Blocklists (DNSBL), z.B.:
smtpd_recipient_restrictions =
...
reject_rbl_client zen.spamhaus.org
Weitere Sicherheitsmaßnahmen
SPF (Sender Policy Framework)
SPF ist ein DNS-Eintrag (TXT-Record), der angibt, welche Server berechtigt sind, E-Mails für eine Domain zu senden. Der empfangende Mailserver prüft, ob die sendende IP-Adresse des eingehenden Mails in diesem Eintrag vorkommt. Stimmt die IP nicht überein, kann die Mail als Spam markiert oder abgelehnt werden.
SPF schützt gegen E-Mail-Spoofing: Ein Angreifer, der vorgibt, von
@fri3dl.nscs.lan zu senden, kann damit erkannt und abgewiesen werden, da sein
Server nicht in der SPF-Liste steht.
SPF-Record für fri3dl.nscs.lan – erlaubt alle MX-Server der Domain:
v=spf1 mx ~all
v=spf1– SPF-Versionmx– alle im MX-Record eingetragenen Server sind berechtigt zu senden~all– alle anderen Server werden als SoftFail markiert (empfohlen statt-allfür den Anfang, um legitime Mails nicht zu blockieren)
Dieser TXT-Record wird in der DNS-Zone fri3dl.nscs.lan eingetragen.
DKIM (DomainKeys Identified Mail)
DKIM signiert (nicht verschlüsselt) ausgehende E-Mails mit einem privaten Schlüssel. Der dazugehörige öffentliche Schlüssel wird als TXT-Record im DNS veröffentlicht. Der empfangende Mailserver kann damit prüfen, ob:
- die Mail wirklich vom angegebenen Server stammt (Authentizität), und
- der Inhalt der Mail während der Übertragung nicht verändert wurde (Integrität).
Anders als SPF schützt DKIM auch gegen Manipulation auf dem Übertragungsweg, da die Signatur über den Mail-Header und -Body erstellt wird.
Installation:
sudo apt install opendkim opendkim-tools
In /etc/opendkim.conf konfigurieren:
Domain fri3dl.nscs.lan
KeyFile /etc/opendkim/keys/fri3dl.nscs.lan/default.private
Selector default
Socket inet:8891@localhost
TrustedHosts /etc/opendkim/TrustedHosts
KeyTable /etc/opendkim/KeyTable
SigningTable refile:/etc/opendkim/SigningTable
Benötigte Dateien erstellen:
/etc/opendkim/TrustedHosts – alle vertrauten Hosts:
127.0.0.1
localhost
fri3dl.nscs.lan
/etc/opendkim/KeyTable:
default._domainkey.fri3dl.nscs.lan fri3dl.nscs.lan:default:/etc/opendkim/keys/fri3dl.nscs.lan/default.private
/etc/opendkim/SigningTable:
*@fri3dl.nscs.lan default._domainkey.fri3dl.nscs.lan
Key generieren:
sudo mkdir -p /etc/opendkim/keys/fri3dl.nscs.lan
sudo opendkim-genkey -D /etc/opendkim/keys/fri3dl.nscs.lan -d fri3dl.nscs.lan -s default
sudo chown -R opendkim:opendkim /etc/opendkim/keys/

In /etc/postfix/main.cf eintragen:
milter_default_action = accept
milter_protocol = 2
smtpd_milters = inet:localhost:8891
non_smtpd_milters = inet:localhost:8891
Den öffentlichen Schlüssel für den DNS-Eintrag ausgeben:
sudo cat /etc/opendkim/keys/fri3dl.nscs.lan/default.txt
Diesen Wert als TXT-Record default._domainkey.fri3dl.nscs.lan in der
DNS-Konfiguration eintragen (Anführungszeichen entfernen, jeden String in eine
eigene Zeile).


Beide Services neustarten:
sudo systemctl restart opendkim postfix
DMARC (Domain-based Message Authentication, Reporting & Conformance)
DMARC baut auf SPF und DKIM auf und legt verbindlich fest, was mit Mails passieren soll, bei denen beide Prüfungen fehlschlagen. Außerdem ermöglicht DMARC das Versenden von Berichten (Reports) an den Domaininhaber, sodass dieser sehen kann, wer E-Mails in seinem Namen versendet.
DMARC-Policy-Optionen (p=):
none– nur Monitoring, keine Maßnahmenquarantine– verdächtige Mails in Spam-Ordner verschiebenreject– Mails mit fehlgeschlagener Prüfung ablehnen
Konfiguration per TXT-Record _dmarc.fri3dl.nscs.lan:
v=DMARC1; p=quarantine; rua=mailto:postmaster@fri3dl.nscs.lan
rua=– Adresse, an die aggregierte Reports gesendet werden
Test
DKIM-Key prüfen
Mit opendkim-testkey kann geprüft werden, ob der veröffentlichte DNS-Eintrag
zum lokalen Private Key passt:
sudo opendkim-testkey -d fri3dl.nscs.lan -s default -vvv

DKIM-Signatur in Mail-Headern prüfen
Nach dem Senden einer Test-Mail (z.B. von Thunderbird) können die rohen
Mail-Header inspiziert werden. Eine korrekt signierte Mail enthält einen
DKIM-Signature-Header:
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=fri3dl.nscs.lan;
s=default; t=...; bh=...; h=From:To:Subject:...; b=...
MX-Record im DNS prüfen
Von einem anderen Rechner im Netzwerk (z.B. von prima.nscs.lan) kann geprüft
werden, ob der MX-Record korrekt aufgelöst wird:
dig fri3dl.nscs.lan MX

SPF-Eintrag im DNS prüfen
dig TXT fri3dl.nscs.lan
