Fedora: Exim 4.97.1 zerbricht Munin – How To Fix

Das neue Jahr fängt ja gut an, Fedora User dürfen Ihre Mailserver einmal mehr selbst fixen 🙁

Fedora: Exim 4.97.1 zerbricht Munin – How To Fix

Heute Nacht kam das Exim 4.96 auf 4.97.1 Update ins Stabel und reihenweise sind uns die Munininstallationen um die Ohren geflogen. Grund ist ein Fehler beim Parsen der mailq Übersicht von exiqgrep .

Munin ruft exiqgrep -cz auf und wertet dann per interessanter AWK Anweisung die Ausgabe aus, aber das geht nicht mehr, weil exiqgrep einen Fehler meldet:

# exim -bpu
9h 2.2K 1rO3sE-005JbF-1D-H <> *** frozen ***
 xxxx@xxxxxx.de

# exiqgrep -cz
Line mismatch: 9h 2.2K 1rO3sE-005JbF-1D-H <> *** frozen ***

gebraucht wird das im Munin Plugin: exim_mailqueue

Ursache ist eine defekte RegExpression in exiqgrep Zeile 217:

Line 215:      if ($line =~ /^\s*(?<age>\w+)
Line 216:          \s+(?<size>(?:\d+(?:\.\d+)?[A-Z]?)?)
Line 217:          \s*(?<msgid>(?:\w{6}-\w{6}-\w{2}|\w{6}-\w{11}-\w{4})) # old, 2023 msgid formats
Line 218:          \s+(?<from><.*?>)/x) {

Die Zeile 217 muß man nur so ändern:

\s*(?<msgid>(?:\w{6}-\w{6}-\w{2}|\w{6}-\w{11}-\w{4}))(?:-H)?     # old, 2023 msgid formats

und schon ist das Problem gelöst.

Natürlich gibt es einen aktiven Fedora Bugreport dazu. Ich frage mich nur, wieso jemand einen neuen Exim baut und dann nicht alle Patche bis zu dem Stand einbaut?

Quelle: Exim Dev ML & https://bugzilla.redhat.com/show_bug.cgi?id=2258027exim_mailqueue

 

SMTP: pphosted.com trifft auf moderne SSL-Technik

pphosted … pphosted … woran erinnert mich das nur? Nach ja, wenn man eigene Mailserver betreibt und deren Logs liest, dann stolpert mal ab und zu mal über irgendwas.irgendwasanderes.pphosted.com . Normalerweise bemerkt man das nicht, aber letzte Woche mußte ich so tief in die Kryptoabgründe blicken, daß ich Euch das nicht ersparen kann 😀

SMTP: pphosted.com trifft auf moderne SSL-Technik

DISCLAIMER: Diese Geschichte ist wahr und kann jederzeit bewiesen werden. Sie erhebt aber keinen Anspruch auf Vollständigkeit. Teile der betroffenen Infrastruktur könnten auch anders ausgestattet sein. 

Ok, nach dem das gesagt wurde… Hammertime! 😀

Frage: Was passiert, wenn ein Mailserver von *****************.pphosted.com auf einen OpenSSL 3 Mailserver im Jahre 2024 trifft?
Antwort: Eine Weile lang kommen verschlüsselte Emails, dann nur noch Klartextmails 😀

Ihr wisst ja, daß ich bei einem Hoster arbeite und deswegen viel mit Emails und Mailservern zu tun habe. Letzte Woche bekommen wir von einem Kunden ein Ticket rein, er bekäme keine Emails mehr von einem wichtigen Partner. Dieser Partner würde jetzt immer eine Meldung bekommen, daß er nicht verschlüsseln würde.

Die Fehlermeldung gibt unser Mailserver aus, wenn der Empfänger die DSGVO Pflicht aktiviert hat, aber eine Klartextemail von 1980 reinkommt. Sprich: die TLS Verschlüsselung war aus. Das verhindert auf SMTP Ebene die Übertragung der Email selbst, so daß der verschlüsselte Transport nach DSGVO Artikel 32 (1) a  garantiert wird. So weit, so klar.

Keine Updates am Mailserver

Jetzt hatte aber im Dezember noch alles geklappt. Seit Anfang Dezember hatte weder OpenSSL, noch unser Mailserver Exim, ein Update bekommen. Da lag es nahe, daß die Ursache auf der anderen Seite zu suchen ist. Was wir noch nicht wußten war das hier:

TLS error on connection from mx07-00181c02.pphosted.com [185.132.180.43] (SSL_accept): error:0A0000C1:SSL routines::no shared cipher

d.b. der andere Server hat erst probiert eine TLS Verbindung aufzubauen, konnte aber nicht (mehr). Deswegen ist er auf Klartext zurückgefallen, was natürlich ein Konfigurationsfehler ist, weil wenn man in 2024 eine Emails nicht verschlüsselt schicken kann, dann schickt man die gar nicht, sondern meldet den Fehler dem Absender. DSGVO Konform halt. Da unser Server für den Kunden keine Klartextmails annimmt, kam es zu der korrekten Fehlermeldung.

Das was hätten wir geklärt, aber das wieso fehlt noch

Und jetzt wird es richtig gruselig. Über unseren Kunden hatten wir Kontakt zum Support des Partners, der uns nach einigem Hin-und-Her dann in einer Email geschrieben hat, daß wir doch einen der folgenden Cipher ( das sind die eigentlichen Verschlüsselungsalgorithmen ) benutzen sollten ( und das ja nicht würden):

Natürlich findet Ihr hier keine IPs/Namen des betroffenen Kunden oder dessen Partners.

Erstmal die Werbung für Ihren Anbieter 🙂

We always use TLS and millions of email pass through our email gateways and no one reported the similar issue, it appears that issue at the other end only.

Hence we have opened a case with Proofpoint support to share more details on this incident .

Regards,
********* ***

Dann diese Email:

As checked with Proofpoint (************’s email hygiene solution), it appears that there is no common cipher from recipient end during TLS negotiation.

Below are Proofpoint supported cipher list which recipient needs to ensure that they have one of them listed in their cipher list:

O CipherList=ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:RC4-SHA:DES-CBC3-SHA

Hence, kindly share the same to recipient IT team and ensure that they support one of the ciphers from the list.

Note: We always use TLS and millions of email pass through our email gateways and no one reported the similar issue.

As no action is pending at Takeda’s end, hence we are proceeding to archive this incident.

Daher kannte ich „PPhosted“ => Proofe Point Hosted 🙂 Die verkaufen den Leuten Appliances, die die in Ihre Serverschränke stecken können, oder wie hier, hosten die Software individuell für den Kunden. So etwas wie Microsoft mit Office 365 auch macht. Software als Service, Ihr kennt das bestimmt.

Die Cipherliste

Werfen wir mal einen Blick in die Liste der „validen“ Cipher die uns in der Email gegeben wurde:

ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:RC4-SHA:DES-CBC3-SHA

Wer von Euch passendes Kryptovorwissen hat, der hat schon längst angefangen zu lächeln, zurecht ;). z.B. ist der „DES-CBC3-SHA“ Cipher schon bei TLS 1.0 aka SSLv3 dabei gewesen, also sagen wir mal, dieser Retner ist sehr rüstig 😉

Mehr Infos zu Ciphersecurity gibt hier: ciphersuite.info

Aber „ECDHE-RSA-AES256-GCM-SHA384“ ist ein ganz gängiger TLS 1.2 Cipher, gegen den nichts zu sagen ist. Was fällt uns noch auf? Dazu müßt Ihr erstmal wissen, wie so ein Ciphername aufgebaut ist: (mehr Info)

{KEX}-{AUTH}-{SESSIONCIPHER}-{TYPE}-{HASHALGO}-{HASHSIZE}

In unserem Fall:

KEX = KeyExchange => ECDHE => EllipticCurve Diffie-Hellmann
AUTH = Authentication Algorithm in Handshake => RSA
SESSIONCIPHER = der eigentliche Algo => AES256

Der Rest ist für das Problem egal. Wenn Ihr mal die Liste oben durchseht, dann sind das alles RSA basierte Cipher. Jetzt wißt Ihr vielleicht noch nicht, daß RSA auf dem absteigenden Ast ist, was Krypto betrifft, weil  der Algo ist 1970 entworfen worden und braucht heute Keylängen von 16k um „sicher“ zu sein ( abhängig von Anwendungfeld ). Die Länge ist blöd, der Energieeinsatz ist groß, und die Berechnungen dauern länger, als wenn man EllipticCurves benutzen würde.  u.a. hat Fedora RSA aus der OpenSSH Defauleinstellung verbannt, vermutlich weil OpenSSH das gemacht hat. OpenSSL wirds ähnlich handhaben und sogar Lets Encrypt hat RSA als Default Type für die ausgestellten Zertifikate umgestellt.

Kurzfassung: RSA ist tod.

Jetzt gibt es genug Leute die noch auf RSA setzen, aber wie das so mit Untoten ist, die nerven ne Weile 😉

Um es zu verstehen, ist wichtig, wie Exim (mit Fedora) funktioniert. Die Verschlüsselung der Verbindung wird von OpenSSL durchgeführt, Exim fungiert hier nur als Vermittler. Deswegen kommen OpenSSL Fehlermeldungen direkt durch. Der logische erste Schritt ist dann, sich mal anzusehen ob OpenSSL die Cipher aus der Liste noch anbietet:

$ openssl ciphers liefert:
TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256:TLS_AES_128_CCM_SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES256-CCM:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-CCM:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES128-SHA:AES256-GCM-SHA384:AES256-CCM:AES128-GCM-SHA256:AES128-CCM:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES256-CCM:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES128-CCM:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:PSK-AES256-GCM-SHA384:PSK-CHACHA20-POLY1305:PSK-AES256-CCM:PSK-AES128-GCM-SHA256:PSK-AES128-CCM:PSK-AES256-CBC-SHA:PSK-AES128-CBC-SHA256:PSK-AES128-CBC-SHA:DHE-PSK-AES256-GCM-SHA384:DHE-PSK-CHACHA20-POLY1305:DHE-PSK-AES256-CCM:DHE-PSK-AES128-GCM-SHA256:DHE-PSK-AES128-CCM:DHE-PSK-AES256-CBC-SHA:DHE-PSK-AES128-CBC-SHA256:DHE-PSK-AES128-CBC-SHA:ECDHE-PSK-CHACHA20-POLY1305:ECDHE-PSK-AES256-CBC-SHA:ECDHE-PSK-AES128-CBC-SHA256:ECDHE-PSK-AES128-CBC-SHA:RSA-PSK-AES256-GCM-SHA384:RSA-PSK-CHACHA20-POLY1305:RSA-PSK-AES128-GCM-SHA256:RSA-PSK-AES256-CBC-SHA:RSA-PSK-AES128-CBC-SHA256:RSA-PSK-AES128-CBC-SHA

ok, also unser OpenSSL arbeitet noch mit dem Cipher, auch wenn RSA nicht mehr die erste Wahl ist. Ist auch ok, man muß ja nehmen, was andere anbieten.Das war es also nicht die Ursache. Ich nehme Euch mal durch 4 Stunden Debuggen mit.

Erstmal testen, ob der Cipher überhaupt noch geht:

$ openssl s_client -connect HOSTNAME:25 -starttls smtp -tls1_2 -cipher ECDHE-RSA-AES256-GCM-SHA384
CONNECTED(00000003)
000E2F7FCA7F0000:error:0A000410:SSL routines:ssl3_read_bytes:sslv3 alert handshake failure:ssl/record/rec_layer_s3.c:1586:SSL alert number 40

Oh Scheisse, der Cipher geht tatsächlich nicht mehr. (Wieso steht da übrigens nicht.)

$ openssl s_client -connect HOSTNAME:25 -starttls smtp -tls1_2 -cipher ECDHE-ECDSA-AES256-GCM-SHA384
CONNECTED(00000003)

New, TLSv1.2, Cipher is ECDHE-ECDSA-AES256-GCM-SHA384

„HMM… EllipticCurve geht also, aber RSA geht nicht mehr, was aber vorher ging.???“

Also habe ich unseren Cluster gescannt und alle, außer diesem Host klappten mit RSA, nur der nicht.  Daraufhin habe ich mir einen Testserver gesucht und alles verglichen, was an konfigs und software so da war.

Vielleicht haben wir ja Einstellungen in Exim die RSA ausschließen? Nein, weil ging ja im Dezember noch und OpenSSL und Exim hatte keine Updates.

Gab es Änderungen in der Systemkonfiguration über andere Pakete, z.b. GNUTLS? Nein, keine Updates.

Hat sich die systemweite Crypto-Policy vielleicht umgestellt, weil ein Timer abgelaufen ist und RSA deaktiviert wurde (siehe OpenSSH Änderung).  Auch nichts, und das zu durchsuchen und zu verstehen, wie das wie zusammenhängt, hat den Großteil der Zeit gekostet. Langsam wurde es eng.

Ok, Testserver mal neustarten, vielleicht gibt es da einen Hinweis? Nein…….oh Scheisse, jetzt geht der Testserver auch nicht mehr. Also mit STRACE nachgesehen was der an Files, Libs usw. lädt bzw. nicht mehr lädt. Sehr viele spannende Infos könnte ich auch da geben, aber dann schreibe ich übermorgen noch dran 😉

Der Funken vor dem Licht am Endes des Tunnels

Am Ende habe ich einen Hilferuf an die Eximmailingliste geschickt, und da kam dann der berühmte Funken der ersten Erkenntnis als Frage: „Hast Du eigentlich RSA oder EC Zertifikate im Einsatz?

Ich hatte die ganze Zeit so einen Verdacht… der Server war am 29.12. einmal neugestartet worden. Dabei zieht sich der Exim die Zertifikate rein und solange der läuft, lädt er die nicht nach. Das Zert war aber schon einige Tage vorher verlängert worden, und danach hat es nachweislich noch funktioniert… weil der Server sich das Zert nicht neu eingelesen hat… weswegen man irrtümlich davon ausgehen mußte, daß keine Kausalität bestand. Die wurde erst mit dem Neustart hergestellt 🙁

Das erklärt aber noch nicht, wieso andere uns weiter Emails schicken können und nur pphostet nicht mehr!

Um das zu klären, muß man grob wissen wie der Schlüsselaustausch bei TLS funktioniert:

Jeder Server gibt die Liste Ciphern bekannt, die er unterstützt, vom Stärksten zum Schwächsten akzeptierten Cipher. Dann wird abgeglichen, welcher Cipher bei beiden der stärkste ist und der wird genommen, außer, und das war mir nicht bewußt, das Schlüsselmaterial hat was dagegen.

EC vs RSA

Wenn man ein EC Zertifikat hat, kann man damit keinen RSA Cipher verwenden. Nun bietet unser Server EC und RSA Cipher an, weil er das kann, die andere Seite kann aber keine EC Cipher und deswegen kommt keine Verbindung zu Stande, wenn man ein EC Zert hat….. oh yes.. Let’s Encrypt hat uns ein EC Zert gebaut, weil wir, wieso auch, nicht auf RSA bestanden hatten.

Das ist aber in 2024 nicht wild, da kann jede Kryptosuite und jeder Mailserver EC.. oh nein!!!

PPHOSTED ist im Jahr 2015 gefangen

Hier eine Liste (Zufällig ausgewählt) mit Ciphern die mit pphosted Servern ausgetauscht wurden:

remote_smtp H=mx07-0019ad02.pphosted.com [91.207.212.232] X=TLS1.2:ECDHE-RSA-AES256-GCM-SHA384:256 CV=yes C=“250
remote_smtp H=mx07-003d6e01.pphosted.com [185.132.181.218] X=TLS1.2:ECDHE-RSA-AES256-GCM-SHA384:256 CV=yes C=“250
remote_smtp H=mx08-003d6e01.pphosted.com [185.183.29.223] X=TLS1.2:ECDHE-RSA-AES256-GCM-SHA384:256 CV=yes C=“250
remote_smtp H=mx0a-0021cb01.pphosted.com [148.163.148.203] X=TLS1.2:ECDHE-RSA-AES256-GCM-SHA384:256 CV=yes C=“250
remote_smtp H=mx0a-0023b801.pphosted.com [148.163.149.109] X=TLS1.2:ECDHE-RSA-AES256-GCM-SHA384:256 CV=yes C=“250
remote_smtp H=mx0b-001dcc01.pphosted.com [148.163.159.10] X=TLS1.2:ECDHE-RSA-AES256-GCM-SHA384:256 CV=yes C=“250
remote_smtp H=mx0b-0021cb01.pphosted.com [148.163.152.203] X=TLS1.2:ECDHE-RSA-AES256-GCM-SHA384:256 CV=yes C=“250

Alles RSA Cipher und jetzt testen wir die Server mal, ob die vor oder nach 2018 leben mit:

openssl s_client -connect $serverip:25 -starttls smtp -tls1_3

Ergebnis: (irrelevante Daten entfernt)

servername 91.207.212.232
CONNECTED(00000003)
New, (NONE), Cipher is (NONE)
Compression: NONE
Expansion: NONE
servername 185.132.181.218
CONNECTED(00000003)
New, (NONE), Cipher is (NONE)
Compression: NONE
Expansion: NONE
servername 185.183.29.223
CONNECTED(00000003)
New, (NONE), Cipher is (NONE)
Compression: NONE
Expansion: NONE
servername 148.163.148.203
CONNECTED(00000003)
New, (NONE), Cipher is (NONE)
Compression: NONE
Expansion: NONE

Fazit: Die leben alle vor 2018!!

Was habe ich gemacht?

Ich habe geprüft, ob die Server mit TLS 1.3 eine Verbindung aufbauen können. Können Sie das nicht, sind die auf einem technischen Stand von vor 2018, als TLS 1.3 eingeführt wurde. Das kann durch eine veraltete Konfiguration so sein, oder weil jemand vergessen hat, die Verschlüsselungssoftware auf den neuesten Stand zu bringen.

Jetzt rechnet mal, wie lange ist 2018 her? 🙂

Machen wir den Test doch mal bei uns mit OPENSSL V3 2024 im Rücken :

$ openssl s_client -connect s113:25 -starttls smtp -tls1_3
CONNECTED(00000003)

New, TLSv1.3, Cipher is TLS_AES_256_GCM_SHA384
Server public key is 4096 bit

So muß das aussehen 🙂

Fazit

Wir stellen fest:

– pphosted Server können kein TLS 1.3
– pphostet Server können keine TLS 1.2 ECDSA Cipher (siehe Liste aus der Email oben)
+ Sie können aber schon ECDHE Keyexchanges

Das zusammen nordet den technischen Stand ungefär 2015, 2016 ein, eher 2015. 2008 als TLS 1.2 auf den Markt kam, gabs EC noch nicht, deswegen müssen da seitdem ein paar Updates gemacht worden sein. EC wurde erst im Februar 2011 in RFC 6090 definiert.

Ich hab hier übrigens eine Liste mit 366 pphosted Servern, alle das gleiche Ergebnis. Das sind sicherlich nicht alle, aber die Stichprobenmenge erlaubt einen wahrscheinlichen Schluß: Mit aktueller Verschlüsselung haben die es nicht so 😀

„Was macht Proofe Point eigentlich so beruflich?“ werdet Ihr fragen:

„Protect your people from advanced email attacks and identity-based threats. Defend sensitive data from theft, loss and insider threats.

Proofpoint Named a Leader in The Forrester Wave™: Enterprise Email Security, Q2 2023
“ Quelle: https://www.proofpoint.com/us  | 2024-01-09-13:00:00

Ich überlasse es Euch zu urteilen 😉

WIe haben wir eigentlich deren Out-Dated-Mailserver wieder bediehnt? Da kommen die Untoten wieder ins Spiel. Noch ist RSA  mit großen Schlüssellängen nicht gebrochen worden, auch nicht vom GoogleQuantencomputer, also vagabundiert RSA jetzt ein Jahr lang als Legacy auf unserem Mailserverzertifikat rum, nur auf dem. Man kann Lets Encrypt glücklicherweise sagen, daß es RSA ausstellen soll. Aber länger als ein weiteres Jahr, wird es die hoffentlich nicht geben. Vielleicht beendet ja LE den Support und dann gehts auch notgedrungen schneller.

Wenn die bei Proofe Point nichts ändern, werden die danach 50% Ihrer Kunden nichts mehr mailen können 😀 Der Tag kann gar nicht früh genug kommen, wenn Ihr mich fragt. Die ziehen da den Leuten Geld aus der Tasche und dann so etwas.

Fedora: Exim 4.96.1 Updates sind jetzt im Test-Repo

Ihr könnt die also auch direkt einspielen:

dnf –enablerepo=updates-testing update exim*

Ich hab dem Maintainer eine entsprechende Mail mit Testlauf geschickt. Ich weiß nicht, wieso das Update nicht per Critpath ins Stable rausging, ist ja immerhin eine kritische Sicherheitslücke.