IT security, FreeBSD, Linux, mail server hardening, post-quantum crypto, DNS, retro computing & hands-on hardware hacks. Privater Tech-Blog seit 2003.

Schlagwort: Hardening (Seite 3 von 5)

Postfix: Verschleierung nur für SASL-Benutzer einrichten

Wie man bei allen ausgehenden E-Mails dafür sorgt, dass die Client IP Adresse sowie der eingesetzte Mailclient vom Postfix verschleiert wird… Ja dieses habe ich bereits geschrieben. Postfix soll verschleiern…

Nun kann es dennoch Sinn ergeben dieses nicht für jede E-Mail zu tun, welche den Mailserver verlässt. Wenn man dieses nur auf E-Mails anwenden möchte, welche von angemeldeten Benutzern versendet werden, funktioniert es wie folgt.

Man erstellt in der master.cf vom Postfix einen neuen Service:

anonym unix n       -       -       -       0       cleanup
  -o header_checks=pcre:/usr/local/etc/postfix/header_cleanup

Nun sorgt man in der gleichen Konfigurationsdatei noch dafür, dass am Ende vom Submission und smtps Service in diesen neuen Service gesprungen wird:

submission inet n       -       n       -       -       smtpd
[...]
  -o cleanup_service_name=anonym
[...]
smtps     inet  n       -       n       -       -       smtpd
[...]
  -o cleanup_service_name=anonym

Der Inhalt unserer /usr/local/etc/postfix/header_cleanup ist dabei weiterhin gleich:

/^(Received: from)[^\n]*(.*)/ REPLACE $1 ::88 (YOUR MOM [::88])$2
/^X-Originating-IP/ IGNORE
/^User-Agent*(.*)/ REPLACE User-Agent: YOUR MOMS MAILER
/^X-Mailer*(.*)/ REPLACE X-Mailer: YOUR MOMS MAILER

Nach einem Restart vom Postifx hat man nun den gewünschten Zustand. Natürlich dürfen nun die smtp_header_checks nicht mehr in der main.cf sein:

#smtp_header_checks = pcre:/usr/local/etc/postfix/header_cleanup

Viel Spaß

Fragen? Einfach melden.

FreeBSD OpenSSH: OS-Banner sicher entfernen

Im Standard ist der OpenSSH Server auf einem FreeBSD so konfiguriert, dass er jeweils die aktuelle Betriebssystemversion mit ausliefert.

Dieses sieht dann im Beispiel so aus:

telnet bsd01.testsystem 22
Trying 1.2.3.4...
Connected to bsd01.testsystem.
Escape character is '^]'.
SSH-2.0-OpenSSH_7.8 FreeBSD-20180909

Um hier zumindest die genaue OS Version zu verstecken reicht folgendes in der /etc/sshd_config:

#VersionAddendum FreeBSD-20180909
VersionAddendum DemMeisterSeinRennAuto

Testet man nun noch mal sieht man nur noch die Version:

telnet bsd01.testsystem 22
Trying 1.2.3.4...
Connected to bsd01.testsystem.
Escape character is '^]'.
SSH-2.0-OpenSSH_7.8 DemMeisterSeinRennAuto

Auf einem Debian basierten System wäre es hingegen:

DebianBanner no

Siehe auch: SSH-Server absichern

Fragen? Einfach melden.

FreeBSD: Native ZFS Encryption einrichten und nutzen

Seit FreeBSD 13 steht native ZFS Encryption zur Verfügung. Datasets lassen sich mit AES-256-GCM verschlüsseln, ohne dass der gesamte Pool verschlüsselt sein muss. Die Verschlüsselung greift pro Dataset und vererbt sich auf Kind-Datasets.

Verschlüsseltes Dataset anlegen

Ein neues Dataset mit Passphrase-Abfrage:

zfs create -o encryption=aes-256-gcm -o keyformat=passphrase usbpool/test01
Enter passphrase:
Re-enter passphrase:

Das Dataset wird sofort gemountet und ist einsatzbereit. Alles was hineingeschrieben wird, liegt verschlüsselt auf der Platte:

zfs list usbpool/test01
NAME             USED  AVAIL     REFER  MOUNTPOINT
usbpool/test01    99K   899G       99K  /usbpool/test01

zfs get encryption usbpool/test01
NAME            PROPERTY    VALUE        SOURCE
usbpool/test01  encryption  aes-256-gcm  -

Nach einem Reboot

Bei einem Passphrase-geschützten Dataset hat ZFS nach einem Reboot den Schlüssel nicht mehr. Das Dataset existiert, ist aber nicht gemountet:

zfs get mounted usbpool/test01
NAME            PROPERTY  VALUE    SOURCE
usbpool/test01  mounted   no       -

Mit zfs mount -l wird der Schlüssel geladen und das Dataset eingehängt:

zfs mount -l usbpool/test01
Enter passphrase for 'usbpool/test01':

zfs get mounted usbpool/test01
NAME            PROPERTY  VALUE    SOURCE
usbpool/test01  mounted   yes      -

Keyfile statt Passphrase

Statt einer Passphrase-Abfrage kann der Schlüssel auch in einer Datei liegen. Praktisch für Server die ohne Interaktion booten sollen:

zfs create -o encryption=aes-256-gcm \
  -o keyformat=passphrase \
  -o keylocation=file:///root/keys/pool.key \
  zroot/encrypted-data

Die Key-Datei enthält das Passphrase als Text. Wichtig: Die Datei muss beim Boot erreichbar sein, also auf einem unverschlüsselten Dataset liegen. Berechtigungen auf 0400 setzen.

Bestehende Datasets verschlüsseln

Verschlüsselung lässt sich nicht nachträglich auf ein bestehendes Dataset aktivieren. Man muss die Daten per zfs send | zfs receive in ein neues, verschlüsseltes Dataset migrieren. Die komplette Anleitung dafür steht im Beitrag ZFS-Dataset nachträglich verschlüsseln.

Eine Übersicht über alle ZFS-Funktionen gibt es im ZFS-Überblick. Wer sich für ZFS Encryption unter Solaris/OpenIndiana interessiert, findet die Anleitung unter ZFS Encryption unter Solaris. Fragen? Einfach melden.

Postfix: Client-Initiated Renegotiation sicher deaktivieren

client-initiated renegotiation beim SMTPD Server kann für DDoS Angriffe ausgenutzt werden. Die einzelnen TLS/SSL Optionen lassen sich über die recht gleichnamige Option im Postfix ein und ausschalten. Gibt es noch keinen mappenden Namen kann die jeweilige Option auch ein/ausgeschaltet werden mit dem jeweiligen Hexwert. Genau Infos findet man hier: http://www.postfix.org/postconf.5.html#tls_ssl_options

If the value of the parameter is a hexadecimal long integer starting with "0x", the options corresponding to the bits specified in its value are enabled (see openssl/ssl.h and SSL_CTX_set_options(3))

Für ein Postfix  3.3 und einem OpenSSL ab Version 1.1.1 ist der passende Hexwert 0x40000000.

Die Option setzt man wie so oft in der main.cf:

root@smtp:/ # postconf  tls_ssl_options
tls_ssl_options = 0x40000000

Ab Postfix >=3.4 gibt es: NO_RENEGOTIATION

Fragen? Dann fragen.

Fragen? Einfach melden.

Postfix Header Cleanup: Client-IPs und Mailer-Versionen aus E-Mail-Headern entfernen

Jede E-Mail enthält Header, die Informationen über den Absender preisgeben: Die IP-Adresse des Clients (Received), den verwendeten Mailclient samt Version (User-Agent, X-Mailer) und manchmal die originale IP (X-Originating-IP). Für einen Angreifer ist das nützlich. Er sieht welche Software in welcher Version läuft und kann gezielt nach bekannten Schwachstellen suchen. Die IP-Adresse verrät die interne Netzwerktopologie oder ermöglicht Tracking über verschiedene Netze.

Postfix kann diese Header beim Versand per Regex umschreiben oder entfernen.

Konfiguration

In der main.cf die Header-Checks aktivieren:

smtp_header_checks = pcre:/usr/local/etc/postfix/header_cleanup

Die Datei header_cleanup enthält die Regex-Regeln:

# Client-IP im Received-Header ersetzen
/^(Received: from)[^\n]*(.*)/ REPLACE $1 [127.0.0.1] (localhost [127.0.0.1])$2

# Originating-IP komplett entfernen
/^X-Originating-IP/ IGNORE

# Mailclient-Version verschleiern
/^User-Agent/ IGNORE
/^X-Mailer/ IGNORE

REPLACE ersetzt die Zeile, IGNORE löscht sie komplett. Die erste Regel tauscht die echte Client-IP im Received-Header gegen localhost aus. Die restlichen Regeln entfernen Mailclient-Informationen.

smtp_header_checks vs. header_checks

Postfix kennt zwei Stellen für Header-Manipulation: header_checks greift bei der Annahme (Cleanup-Daemon), smtp_header_checks greift beim Versand (SMTP-Client). Für die Verschleierung eigener Absender-Daten ist smtp_header_checks die richtige Wahl. Die Header werden erst beim Versand umgeschrieben, nicht bei der internen Verarbeitung. So bleiben die originalen Header in den lokalen Logs erhalten.

DKIM-Kompatibilität

Die DKIM-Signatur wird nicht gebrochen. DKIM signiert standardmäßig den Body und ausgewählte Header wie From, To, Subject und Date. Die Received-, User-Agent– und X-Mailer-Header sind nicht Teil der Signatur. Außerdem greift smtp_header_checks nach dem Signing, der Cleanup-Daemon hat die DKIM-Signatur zu diesem Zeitpunkt bereits erstellt.

Fragen? Einfach melden.

Postfix MTA-STS Resolver für FreeBSD mit Logfile einrichten

Ich habe heute auch mal den postfix-mta-sts-resolver auf meinem privaten System zugeschaltet. Einfach um es mal zu „probieren“.

Tut einfach und wie beschrieben, ist so aber sicher nicht für größeren und produktiven Betrieb gedacht. So wie der resolver kommt schreibt er alle Meldungen leider nur in die Konsole, es gibt keinen File-Logger. Ich ähm will/brauch den aber!

Also habe ich einen Fork erstellt und ihn überredet in eine Datei zu loggen und direkt noch ein sehr rudimentäres rc.d init script beigelegt: https://github.com/Kernel-Error/postfix-mta-sts-resolver

Wer es also ebenfalls mal probieren möchte, viel Spaß.

Der mta-sts-daemon loggt nun per default in /var/log/mta-sts.log. Config über yml ist ebenfalls nun drin genau wie die Konfiguration per Startparameter. Das rc.d script für FreeBSD könnte sicher schöner sein und hätte gerne im default den Benutzer mta-sts im System. Wir wollen es ja nicht als Root laufen lassen, hm?

Das einzelne Programm mta-sts-query greift auf den gleichen Logger zu, gibt damit also nichts mehr in der Konsole aus sondern auch im Logfile. Vielleicht passe ich dieses noch an, wenn dann mache ich auch einen pull request. Sonst gehe ich mal davon aus, dass es eh bald im postifx ist *daumen-drück*


Update

Habe ich jetzt gemacht. Pullrequest wurde angenommen und das neue Release ist auch schon gemacht. Jetzt also mit Logfile und rc.d script für FreeBSD.

Fragen? Dann fragen.

Siehe auch: MTA-STS einrichten

Fragen? Einfach melden.

MTA-STS einrichten: Transportverschlüsselung für E-Mail erzwingen

SMTP überträgt E-Mails standardmäßig im Klartext. Mit STARTTLS lässt sich die Verbindung verschlüsseln, aber kein sendender Server ist gezwungen das auch zu tun. Schlimmer noch: Ein Angreifer im Netzwerk kann die STARTTLS-Antwort einfach unterdrücken und die Verbindung bleibt unverschlüsselt. MTA-STS (RFC 8461) löst dieses Problem: Der Empfänger veröffentlicht eine Policy, die sendenden Servern sagt „hier wird nur verschlüsselt zugestellt, mit gültigem Zertifikat, an genau diesen MX“.

MTA-STS vs. DANE

Es gibt zwei Wege, Transportverschlüsselung für E-Mail zu erzwingen: DANE und MTA-STS. DANE nutzt DNSSEC und TLSA-Records im DNS. Das ist technisch sauberer, setzt aber DNSSEC auf der Empfängerseite voraus. Viele große Provider (Google, Microsoft) haben kein DNSSEC. MTA-STS funktioniert ohne DNSSEC: Die Policy liegt als Textdatei auf einem Webserver, abgesichert durch ein normales TLS-Zertifikat. Wer beides kann, sollte beides einsetzen. DANE für die Server die DNSSEC können, MTA-STS für den Rest.

Die drei Komponenten

MTA-STS besteht aus drei Teilen: einem DNS-Record, einer Policy-Datei auf einem Webserver und optional TLS Reporting.

1. DNS TXT-Record

Ein TXT-Record unter _mta-sts.domain.de signalisiert, dass eine Policy existiert:

_mta-sts.kernel-error.de.  IN TXT  "v=STSv1;id=20260115130000Z;"

Die id ist ein beliebiger String. Sendende Server cachen die Policy und prüfen über die ID ob sich etwas geändert hat. Bei jeder Policy-Änderung muss die ID aktualisiert werden. Ich verwende dafür einen Zeitstempel, das macht es nachvollziehbar.

2. Policy-Datei

Die eigentliche Policy liegt unter https://mta-sts.domain.de/.well-known/mta-sts.txt. Wichtig: Der Webserver muss ein gültiges TLS-Zertifikat haben und unter genau diesem Hostnamen erreichbar sein.

version: STSv1
mode: enforce
mx: smtp.kernel-error.de
max_age: 2419200
modeenforce = nur verschlüsselt zustellen. testing = wie enforce, aber bei Fehlern trotzdem zustellen (gut zum Einstieg). none = Policy deaktiviert.
mxAn welche MX-Server zugestellt werden darf. Mehrere Einträge möglich (je eine Zeile). Wildcards gehen: *.kernel-error.de
max_ageWie lange die Policy gecacht wird, in Sekunden. 2419200 = 28 Tage.

Der empfohlene Weg: Mit mode: testing anfangen und die TLS-Reports auswerten. Wenn alles sauber ist, auf enforce umstellen.

3. TLS Reporting

Wie bei DMARC gibt es auch für MTA-STS ein Reporting-System: SMTP TLS Reporting (RFC 8460). Ein weiterer DNS TXT-Record teilt Absendern mit, wohin sie Berichte über TLS-Verbindungsprobleme schicken sollen:

_smtp._tls.kernel-error.de.  IN TXT  "v=TLSRPTv1;rua=mailto:postmaster@kernel-error.de"

Die Reports kommen als JSON per Mail und enthalten Informationen über fehlgeschlagene TLS-Verbindungen, ungültige Zertifikate oder MX-Mismatches. Google und Microsoft schicken diese Reports zuverlässig.

Postfix und MTA-STS

Postfix prüft von Haus aus keine MTA-STS-Policies. Für die ausgehende Seite braucht es postfix-mta-sts-resolver, ein Policy-Daemon der sich als smtp_tls_policy_maps in Postfix einhängt. Der Daemon cached die Policies und liefert Postfix die passende TLS-Konfiguration pro Zieldomain.

# /usr/local/etc/postfix/main.cf
smtp_tls_policy_maps = socketmap:unix:/var/run/mta-sts-daemon/mta-sts-daemon.sock:postfix

Die eingehende Seite braucht keine Software. Die drei DNS-Records und die Policy-Datei auf dem Webserver reichen aus. Sendende Server wie Gmail, Outlook oder Yahoo werten die Policy selbständig aus.

Testen

# DNS-Records prüfen
dig TXT _mta-sts.kernel-error.de +short
dig TXT _smtp._tls.kernel-error.de +short

# Policy abrufen
curl https://mta-sts.kernel-error.de/.well-known/mta-sts.txt

Siehe auch: internet.nl: Mailserver-Sicherheit testen mit dem niederländischen Standard, TLS 1.3 für Postfix & Dovecot: Einrichtung und Konfiguration, internet.nl verschärft die TLS-Anforderungen für Mailserver

Zusammen mit SPF, DKIM, DMARC und DANE ergibt MTA-STS eine lückenlose Absicherung: Authentifizierung (wer darf senden), Integrität (DKIM-Signatur) und Transportverschlüsselung (DANE/MTA-STS). Fragen? Einfach melden.

TLS 1.3 für Postfix & Dovecot: Einrichtung und Konfiguration

TLS 1.3 ist im Mailbetrieb der Normalfall. Sobald Postfix und Dovecot gegen ein aktuelles OpenSSL gelinkt sind, wird es ohne Zutun verwendet. Die Konfigurationsarbeit dreht sich nicht mehr darum, TLS 1.3 zu aktivieren, sondern darum, die alten Protokollversionen sauber abzuschalten und für den verbleibenden TLS-1.2-Fallback eine kontrollierte Cipher-Policy zu definieren.

Illustration zu TLS 1.3 im Mailbetrieb: Symbolische Darstellung von Postfix und Dovecot mit Schloss und Schlüssel vor Server-Hintergrund, steht für verschlüsselte SMTP- und IMAP-Verbindungen mit modernen TLS-Standards.

Voraussetzungen

Auf jedem aktuellen Linux oder BSD ist OpenSSL 3.x längst Default. OpenSSL 1.1.1 ist seit September 2023 End-of-Life und sollte nicht mehr im Einsatz sein. Postfix und Dovecot übernehmen den TLS-Stack vollständig aus der Library, eine eigene Aktivierung von TLS 1.3 entfällt. Welche Version tatsächlich verwendet wird, lässt sich auf dem Server eindeutig prüfen:

postconf -a | grep -i tls
dovecot --version
ldd $(which dovecot) | grep ssl
openssl version

Erscheint OpenSSL 3.x, ist alles an Bord was man braucht. Auch ältere 1.1.1-Builds beherrschen TLS 1.3, sind heute aber kein Argument mehr.

Postfix

Postfix verwendet TLS 1.3 automatisch, sobald die Gegenstelle es anbietet. Wichtig ist die Mindestversion. TLS 1.0 und TLS 1.1 sind kryptografisch tot und gehören aus der Aushandlung ausgeschlossen. Für Submission auf 587 und 465 ist heute realistisch sogar TLS 1.3 only sinnvoll, weil dort nur Mail-Clients hochkommen die eine moderne Library mitbringen. Für SMTP-Relay auf Port 25 zwischen Mailservern bleibt TLS 1.2 als Fallback notwendig, weil die Internet-Realität dort heterogener ist.

Eine solide Basis-Konfiguration für Postfix sieht so aus:

smtpd_tls_protocols = >=TLSv1.2
smtp_tls_protocols  = >=TLSv1.2

smtpd_tls_security_level = may
smtp_tls_security_level  = may

smtpd_tls_cert_file = /etc/letsencrypt/live/DOMAIN/fullchain.pem
smtpd_tls_key_file  = /etc/letsencrypt/live/DOMAIN/privkey.pem

Die Cipher-Optionen in Postfix wirken ausschließlich auf TLS 1.2 und älter. TLS 1.3 hat eine fest definierte Liste von AEAD-Cipher-Suites und ignoriert die Postfix-Optionen vollständig. Trotzdem ist es sinnvoll, für den Fallback eine saubere Policy zu setzen:

tls_preempt_cipherlist = yes

smtpd_tls_ciphers = high
smtp_tls_ciphers  = high

smtpd_tls_mandatory_ciphers = high
smtp_tls_mandatory_ciphers  = high

Damit greifen ausschließlich AEAD-Cipher mit Forward Secrecy. Welche das konkret sind, regelt OpenSSL über seine Defaults der jeweiligen Distribution. Für die Submission-Ports darf man strenger sein und auf encrypt oder secure hochziehen, während Port 25 mit may opportunistisch bleibt.

Session-Caching reduziert Handshake-Overhead und sollte aktiv sein:

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

Dovecot

Dovecot nutzt TLS 1.3 ebenfalls automatisch, sofern OpenSSL es liefert. Konfiguriert wird die minimale Protokollversion, alles darunter wird hart abgeschaltet:

ssl = required
ssl_min_protocol = TLSv1.2

Wer nur noch moderne Clients erwartet, kann das auf TLSv1.3 heben. Eigene Praxiserfahrung: für IMAPS auf 993 und Submission auf 587/465 ist das auf einem privat betriebenen Server problemlos machbar. Auf öffentlichen Hostern mit unbekannter Client-Basis lieber bei TLS 1.2 als Untergrenze bleiben.

Die Cipher-Liste betrifft auch in Dovecot nur TLS 1.2 und älter. Eine restriktive Liste verhindert unsaubere Fallbacks bei alten Clients:

ssl_cipher_list = \
ECDHE-ECDSA-CHACHA20-POLY1305:\
ECDHE-RSA-CHACHA20-POLY1305:\
ECDHE-ECDSA-AES256-GCM-SHA384:\
ECDHE-RSA-AES256-GCM-SHA384

ssl_prefer_server_ciphers = yes

Zertifikate werden wie gewohnt eingebunden:

ssl_cert = </etc/letsencrypt/live/DOMAIN/fullchain.pem
ssl_key  = </etc/letsencrypt/live/DOMAIN/privkey.pem

TLS 1.3 und Cipher-Suites

TLS 1.3 unterscheidet sich grundlegend von älteren Versionen. Die Cipher-Suites sind in RFC 8446 fest definiert und bestehen ausschließlich aus AEAD-Verfahren mit integrierter Authentifizierung und Forward Secrecy. Der Mailbetrieb sieht in der Praxis vor allem drei Suites: TLS_AES_256_GCM_SHA384, TLS_CHACHA20_POLY1305_SHA256 und TLS_AES_128_GCM_SHA256.

Postfix und Dovecot bieten keine Möglichkeit, diese Cipher direkt anzusteuern. Die Auswahl erfolgt während des Handshakes durch OpenSSL. Das ist kein Mangel, sondern Absicht und reduziert Fehlkonfigurationen erheblich.

Wer trotzdem versucht, TLS-1.3-Cipher über Applikationsoptionen zu beeinflussen, konfiguriert in Wahrheit nur TLS 1.2.

Der vollständige Mail-Crypto-Stack

TLS 1.3 alleine schützt eine SMTP-Verbindung nur dann zuverlässig, wenn die Gegenstelle die Verschlüsselung auch wirklich erwartet. Bei opportunistischem TLS auf Port 25 entscheidet jeder Server selbst, ob er sich auf eine unverschlüsselte Verbindung einlässt. Damit das nicht passiert, gibt es zwei Mechanismen die heute zum Standard gehören:

  • DANE nutzt DNSSEC und einen TLSA-Record, um den erwarteten Zertifikat-Fingerprint im DNS zu hinterlegen. Postfix kann das nativ verifizieren, sobald smtp_dns_support_level = dnssec und smtp_tls_security_level = dane gesetzt sind. Voraussetzung ist eine funktionierende DNSSEC-Validierung im lokalen Resolver.
  • MTA-STS publiziert die TLS-Erwartung über HTTPS und einen DNS-TXT-Record. Während DANE auf DNSSEC angewiesen ist, kommt MTA-STS ohne aus und wird daher von Anbietern wie Google, Microsoft und Apple breit unterstützt.
  • TLS-RPT liefert die Reports zurück, wenn ein Empfangsserver die TLS-Erwartung gerissen hat. Ohne TLS-RPT merkt man Konfigurationsdrift nur durch Zufall, mit TLS-RPT als JSON-Bericht ins Postfach.

In der Praxis lohnt sich keiner der drei Mechanismen alleine. DANE, MTA-STS und TLS-RPT bilden zusammen die durchgängige Kette aus Erwartung, Verifikation und Auditing. Wer nur einen davon hat, verliert eine Etappe.

Logging, Monitoring und Adoption messen

Ohne TLS-Logging fliegt man blind. Postfix bringt das frei Haus mit:

smtpd_tls_loglevel = 1
smtp_tls_loglevel  = 1

Damit landet pro Verbindung eine Zeile im Log mit Protokoll, Cipher und Schlüsselaustausch. Aus diesen Zeilen lässt sich auch die TLS-Adoption auswerten, also wer mit welcher Version und welchem Cipher kommt. Das gleiche Vorgehen habe ich für die Webseite mit dem Beitrag Post-Quantum TLS auf Nginx: 15 Tage $ssl_curve ausgewertet dokumentiert. Für SMTP funktioniert das analog, der einzige Unterschied ist die Logquelle.

Bei Dovecot reicht ein verbose_ssl = yes in der relevanten Service-Sektion, wenn man im Detail wissen will, was der TLS-Handshake gerade tut. Im Normalbetrieb genügt der Default.

Verifikation

Ob TLS 1.3 wirklich genutzt wird, lässt sich von außen sauber prüfen.

SMTP mit STARTTLS:

openssl s_client -starttls smtp -connect mail.example.com:25 -tls1_3

Submission und IMAPS direkt:

openssl s_client -starttls smtp -connect mail.example.com:587 -tls1_3
openssl s_client -connect mail.example.com:465 -tls1_3
openssl s_client -connect mail.example.com:993 -tls1_3

Wird der Handshake mit einem AEAD-Cipher aufgebaut, ist TLS 1.3 aktiv. Fällt die Verbindung auf TLS 1.2 zurück, greift die konfigurierte Cipher-Liste.

Für eine zweite Meinung lohnt sich ein Blick auf Hardenize oder internet.nl. Beide testen den Mail-Stack inklusive DANE, MTA-STS, TLS-RPT und Cipher-Set in einem Rutsch.

Wohin geht die Reise

TLS 1.2 wird in den nächsten Jahren auch im Mail-Bereich aussterben. Auf der Web-Seite ist das praktisch schon passiert, im SMTP-Relay zwischen Mailservern dauert es länger, weil dort die langsameren Migrationszyklen großer Provider den Takt vorgeben. Wer heute neu konfiguriert, sollte TLS 1.0 und 1.1 hart raushalten und TLS 1.2 als reine Fallback-Etappe behandeln.

Die nächste Stufe ist Post-Quantum-Kryptografie. X25519MLKEM768 ist bei mir auf dem Mail-Server seit Anfang 2026 produktiv und ich habe das Setup im Beitrag Post-Quantum TLS für E-Mail dokumentiert. Auf der Webseite habe ich die Adoption über 15 Tage gemessen und die Ergebnisse in 15 Tage $ssl_curve ausgewertet aufgeschrieben. Für den Mail-Stack steht eine analoge Auswertung noch aus, das Setup dafür ist aber identisch.

Fazit

TLS 1.3 erfordert in Postfix und Dovecot keine Sonderbehandlung. Was zählt, ist eine moderne OpenSSL-Version, eine klare Mindest-TLS-Policy, eine saubere Cipher-Liste für den TLS-1.2-Fallback und das Zusammenspiel aus DANE, MTA-STS und TLS-RPT für die Transport-Verschlüsselung im Internet.

Kein Feature-Flag.
Keine Magie.
Nur korrekte Defaults, bewusst begrenzt.

Siehe auch: Post-Quantum TLS für E-Mail mit X25519MLKEM768, MTA-STS einrichten, DNSSEC und DANE: TLS-Zertifikate mit TLSA-Records absichern und Rspamd: Automatisches Spam/Ham-Lernen mit Dovecot und IMAPSieve.

Fragen? Einfach melden.

TLS 1.0 und 1.1 abschalten: Postfix, Dovecot und Nginx auf TLS 1.2+ umstellen

TLS 1.0 stammt von 1999, TLS 1.1 von 2006. Beide Versionen haben bekannte Schwächen (BEAST, POODLE, fehlende AEAD-Cipher) und werden seit 2020 von keinem Browser mehr unterstützt. Qualys SSL Labs vergibt seit 2020 maximal ein B-Rating wenn TLS 1.0 oder 1.1 aktiv ist. Es gibt keinen Grund mehr, diese Protokolle anzubieten.

Postfix

In der main.cf die Mindestversion auf TLS 1.2 setzen. Die Einstellungen gelten getrennt für eingehende (smtpd) und ausgehende (smtp) Verbindungen:

# Eingehend (smtpd)
smtpd_tls_mandatory_protocols = >=TLSv1.2
smtpd_tls_protocols = >=TLSv1.2

# Ausgehend (smtp)
smtp_tls_mandatory_protocols = >=TLSv1.2
smtp_tls_protocols = >=TLSv1.2

Die Syntax >=TLSv1.2 gibt es seit Postfix 3.6. Bei älteren Versionen muss man die alten Protokolle einzeln ausschließen: !SSLv2, !SSLv3, !TLSv1, !TLSv1.1. Wenn OpenSSL 1.1.1+ oder neuer installiert ist, wird TLS 1.3 automatisch unterstützt und bevorzugt.

Dovecot

In conf.d/10-ssl.conf:

ssl_min_protocol = TLSv1.2
ssl_cipher_list = ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256
ssl_prefer_server_ciphers = yes

ssl_min_protocol gibt es seit Dovecot 2.3.15. In älteren Versionen heißt es ssl_protocols = !SSLv3 !TLSv1 !TLSv1.1. Die Cipher-Liste enthält nur AEAD-Cipher mit Forward Secrecy.

Nginx

ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;
ssl_prefer_server_ciphers on;

Die TLS-1.3-Cipher (TLS_AES_*) werden von OpenSSL automatisch bevorzugt und lassen sich nicht über ssl_ciphers deaktivieren. Die Reihenfolge in der Cipher-Liste gilt nur für TLS 1.2.

stunnel

Wer stunnel als TLS-Wrapper nutzt (z.B. für DNS over TLS):

options = NO_SSLv3
options = NO_TLSv1
options = NO_TLSv1.1

Prüfen

Nach der Umstellung prüfen ob die alten Protokolle wirklich deaktiviert sind:

# TLS 1.0 testen (sollte fehlschlagen)
openssl s_client -connect smtp.example.de:25 -starttls smtp -tls1 2>&1 | grep "Protocol"

# TLS 1.2 testen (sollte funktionieren)
openssl s_client -connect smtp.example.de:25 -starttls smtp -tls1_2 2>&1 | grep "Protocol"

Für Webserver hilft Qualys SSL Labs. Wer noch einen Schritt weitergehen will: Mit ECDSA-Zertifikaten wird der Handshake schneller und mit Post-Quantum Key Exchange ist der Schlüsselaustausch auch gegen Quantencomputer abgesichert. Fragen? Einfach melden.

FreeBSD: Verschlüsseltes ZFS-Backup auf USB-Platte mit geli

FreeBSD-Notebook erstellt per ZFS-Snapshot und zfs send ein verschlüsseltes Backup auf eine USB-Platte mit geli, Schlüsseldatei, Passphrase und sicherem Aushängen.

Ein Notebook mit Full-Disk-Encryption verdient auch ein verschlüsseltes Backup. Plan: ZFS-Snapshots per zfs send auf eine USB-Platte schieben, die komplett mit geli verschlüsselt ist. Schlüssel und Passphrase sicher aufbewahren, fertig.

Hinweis: Seit OpenZFS 2.0 (FreeBSD 13+) gibt es native ZFS-Verschlüsselung (zfs create -o encryption=aes-256-gcm). Damit entfällt geli als Zwischenschicht. Auf älteren Systemen oder wenn man die gesamte Platte unabhängig vom Dateisystem verschlüsseln will, bleibt geli die richtige Wahl.

USB-Platte verschlüsseln

Platte einstecken und per dmesg das Device identifizieren, in diesem Fall da0. Dann mit gpart eine neue GPT-Partitionstabelle anlegen und eine Partition erstellen.

geli braucht einen Schlüssel aus Zufallsdaten:

dd if=/dev/random of=./backup-key bs=256 count=1

Mit diesem Schlüssel die verschlüsselte Partition einrichten:

geli init -s 4096 -K ./backup-key -l 256 /dev/da0s1
Enter new passphrase:
Reenter new passphrase:

Metadata backup can be found in /var/backups/da0s1.eli and
can be restored with the following command:

    # geli restore /var/backups/da0s1.eli /dev/da0s1

Partition öffnen:

geli attach -k ./backup-key /dev/da0s1
Enter passphrase:

ZFS-Pool anlegen

Auf der geöffneten geli-Partition (da0s1.eli) den ZFS-Pool erstellen:

zpool create usb-backup /dev/da0s1.eli

zpool list
NAME         SIZE  ALLOC   FREE  CAP  HEALTH
zroot        460G   184G   276G  40%  ONLINE
usb-backup   928G   296K   928G   0%  ONLINE

Backup starten

Initiales Vollbackup per zfs send -R (rekursiv, alle Datasets und Snapshots):

zfs send -R zroot@auto-2015-05-23-21-00-00 | zfs recv -u usb-backup/notebook

Die Option -R sendet alles rekursiv. Die Option -u beim Empfänger verhindert, dass die Datasets auf der USB-Platte gemountet werden. Bei allen folgenden Backups muss nur noch die Differenz zwischen zwei Snapshots übertragen werden.

Platte sicher aushängen

Drei Schritte in der richtigen Reihenfolge:

  • Sync erzwingen, alle Daten sicher auf die Platte schreiben
  • ZFS-Pool exportieren
  • geli-Partition schließen
sync
zpool export usb-backup
geli detach /dev/da0s1

Wichtig: Den Schlüssel (backup-key) an einem dritten Ort aufbewahren, weder auf dem Notebook noch auf der Backup-Platte. Ohne Schlüssel und Passphrase sind die Daten nicht wiederherstellbar.

Mehr zu ZFS-Backups: Automatische ZFS-Snapshots und ZFS send/recv Fehler beheben. Fragen? Einfach melden.

« Ältere Beiträge Neuere Beiträge »

© 2026 -=Kernel-Error=-RSS

Theme von Anders NorénHoch ↑