Exim – Wie man TLS erzwingt II

Im letzten Beitrag Exim – Wie man TLS erzwingt war das Blockieren von ausgehenden Verbindungen ohne TLS Thema. Heute befassen wir uns mit dem Gegenteil : Wie verhindern wir, daß wir eine Email bekommen, die unsicher übertragen wurde?

Exim ’s Access Control Lists

Exim als Mailserver erlaubt es uns, in jede Phase der Übertragung von Emails per SMTP einzugreifen und Emails aufgrund von Mustern und Bedingungen abzulehnen. Die ACL genannten Bedingungsketten sind universell einsetzbar, hier ein Beispiel:

acl_check_helo:

drop condition = ${if eq{$sender_helo_name}{ylmf-pc} {1}}
     message = Your a naugthy boy

accept

Die Helo-ACL prüft ob, sich der anfragende Mailserver mit einem bestimmten Namenskürzel meldet, hier „ylmf-pc„. Das ist so ziemlich todsicher ein Bot aus einem asiatischen Netzwerk. Zur Erklärung :

drop ist das Ziel der Aktion, wenn die condition greift. Hier der Vergleich (if eq) von dem was der „Client“ gesendet hat und dem ylmf-pc Text. Übersetzt heißt das : if ( „sender_helo_name“  == „ylmf-pc“ )  { log.message = „Your a naugthy boy“; message.drop(); }

So sieht das dann im SMTP aus :

220 irgendeinserver.de ESMTP Exim 4.89 Sun, 03 Dec 2017 14:33:48 +0100
HELO ylmf-pc
550 Your a naugthy boy

Ansonsten akzeptiere ( accept ) die Email. Natürlich könnte man hier auch schon DNS IP Blacklisten eintragen, oder andere Abfragen, die keinen Empfänger / Sender benötigen. Die meisten ACls werden aber genau bei der Sender- und Empfängerprüfung eingesetzt. Genau das werden wir in der ACL acl_check_rcpt tun.

Zum Glück sind die nötigen Anweisungen extrem übersichtlich :

acl_check_rcpt:
 ...
 deny condition = ${if eq{$tls_cipher}{}{1}{0}}
      message   = Sender did not use TLS secured connection.

Meint:

If ( tls_cipher ==  „“ ) { log.message = „Sender did not use TLS secured connection. „; message.deny() }

Das war es schon. Damit kommen nur noch Emails weiter, die über eine TLS gesicherte Verbindung gesendet werden. Ob das Spam ist oder nicht, muß man natürlich trotzdem prüfen, wenn die Mail erst einmal übertragen wurde.

Analyse

Da erst einmal nur der Empfänger in der SMTP Phase genannt wurde, ist der Inhalt der Email noch aus dem sendenen Server, denn der wird erst mit dem DATA Block übertragen. In die HELO ACL kann man das nicht einbauen, da SMTP verlangt, daß ein netter Server erstmal HELO  oder EHLO sagt, bevor er weiter macht.

Die übliche SMTP-Befehlsreihenfolge dürfte daher :

HELO
STARTTLS
MAIL FROM:
RCPT TO:
DATA

sein. Man kann es natürlich auch bereits in der mail_from ACL machen, ob das einen großen Unterschied machen wird, ist fraglich.

 

Exim – Wie man TLS erzwingt

Exim ist einer der vielseitigsten Mailserver die man auf einem Server haben kann, fast Nichts ist unmöglich. In einer Zeit, in der immer mehr abgehört wird und die Kommunikation von Personen, Firmen und Behörden geschützt werden muß, finden sich immer noch Mailserver, die kein TLS sprechen.

Mailtransportverschlüsselung

TLS wurde vor fast 19 Jahren per RFC als Nachfolger von SSL geboren und hat dies erfolgreich abgelöst. Sollte man jedenfalls meinen. Tatsächlich habe ich erst heute eine Rechnung von 1und1 bekommen, ja, Name & Shame in progress, die mit einem gebrochenen TLS 1.0 aka. „SSLv3 modified“ übertragen wurde :

H=mbulk.1and1.com [212.227.126.220] P=esmtps X=TLSv1:DHE-RSA-AES256-SHA:256

Da unser Server TLS1.2 spricht und anbietet, kann man von einem Konfigurationsfehler ausgehen. Wenigsten wurde hier TLS gesprochen. Andere Mailserver können nicht mal SSL, die senden und empfangen unverschlüsselt, nicht wahr liebe Admins von faller.de 😉

Wie man TLS erzwingt

Im letzteren Fall kann man Exim dazu bewegen, daß er keine Emails ohne TLS sendet. Damit kann verhindert werden, daß Geheimnisse abgehört werden können. Exim ist von Haus aus mit den nötigen Funktionen ausgestattet und daher extrem leicht dafür zu begeistern 🙂

Der in praktisch jeder Eximconfig vorkommende Transporttreiber „remote_smtp“ muß nur um zwei Befehle erweitert werden:

remote_smtp:
 driver = smtp
 hosts_require_tls = *
 tls_tempfail_tryclear = false

Das zwingt Exim dazu, ohne TLS Verbindung abzubrechen und auf keinen Fall auf Klartext zurückzufallen. Das wäre ja auch selten dämlich, oder ? Tja, wie sich herausstellte, ist sich immer einer in der Welt nicht zu blöd, genau das zu machen 😀 Mein Name & Shame Beispiel für diesen Fail, hat sich allerdings bekehren lassen und sendet jetzt vorbildlich in TLSv1.2 \o/

Der ewige Optimist Exim

Exim sieht einen Fail beim TLS leider als temporären Fehler an. Er geht also davon aus, daß der empfangende Mailserver irgendwann in der Retryzeit seine Meinung ändert 😀 Aus Erfahrung kann ich sagen, nein, tun die empfangenden Mailserver nicht 🙂

Daher müssen wir die Retryzeit für diesen Fall auf 0 setzen, so daß sofort eine Delivery Message erzeugt wird.  Das erledigen wir so :

begin retry

*          refused
*           quota
*        tls_required
*             *         F,2h,15m; G,16h,1h,1.5; F,4d,6h

Das war es bis auf einen kleinen Schönheitsfehler schon: die Delivery Message macht für den Leser derselben keinen Sinn, da ein falscher Fehlergrund ausgegeben wird, aber das ist Euer Problem 😉

 

Sächsische Polizei benutzte gebrochene Verschlüsselung

Diese Geschichte spielt im September 2016 und handelt davon ..

… das 365 Full-DisclosureTimer abgelaufen sind und ..

… Wie aus einer Maus ein Elefant wird

Im Zuge einer Ermittlung zu SSL Problemen eines Kunden, bin ich über ein SSL Problem der Polizei Sachsen gestolpert. Aufmerksame Leser meines Blogs ist das Thema SSL/TLS bei Mailservern nichts neues. Es reiht sich ein in Probleme wie die des CERT-BUND vom BSI , die sich im Vergleich dazu aber schnell schliessen liessen. Der Versuch, die Sicherheitslücke der zuständigen Abteilung  zu melden, artete regelrecht in einen Instanzenlauf aller „Die Zwölf Aufgaben des Asterix“ aus. Am Ende waren 6 Behörden daran beteiligt.

Was ist eigentlich passiert ?

Wer sein Mailserverlogfiles schonmal genauer angesehen hat, wird darin Angaben wie diese finden : „X=SSLv3:AES256-SHA:256″ . Diese stammen zwar jetzt von Exim, sind so aber auch in anderen Produkten zu finden. Bei dem X= handelt es sich um das Verschlüsselungsprotokoll ( SSLv3 ) und dem genutzten Verschlüsselungsalgorithmus/Cipher ( AES-256 mit Hashalgo SHA256 ) . Am Cipher gibt es nicht viel auszusetzen, klar, es gibt bessere z.B. AES256-GCM-SHA384:256, aber das ist nicht des Pudels Kern, sondern die Version SSLv3.

SSLv3 gilt seit 2 Jahren im Rahmen der POODLE Attacke als geknackt, zudem wurde es im Bereich Email vor über 15 Jahren schon von TLS abgelöst. Seit dem es als geknackt gilt, sollte man es auch nicht mehr einsetzen. Daher haben Internetprovider weltweit SSLv3 aus Ihrem Webservern und Emailservern entfernt. Jetzt wäre es falsch zusagen „Nur die Polizei Sachsen“ nicht, denn das stimmt nicht und wäre eh nur die halbe Wahrheit, denn es gehören immer zwei Server zu einer Übertragung.

Normalerweise läuft das so ab, daß sich sich der sendende und der empfangene Mailserver beim Verbindungsaufbau auf das Protokoll, den Cipher und den SessionKey einigen. Dabei wird erst TLS1.2 , dann TLS1.1 und dann TLS1/SSLv3 ausgewählt. Der Server der Polizei in Sachsen hatte nun SSLv3, also den schlechtesten Algorithmus gewählt, obwohl bessere zur Verfügung standen. Warum er das tat ist (war) noch Ziel einer Untersuchung. Die Kripo in Leipzig hat es auf sich genommen, das an die zuständigen Stellen weiterzuleiten und dafür zu sorgen, daß das zugrunde liegende Problem behoben wird.

Das war die Maus… und jetzt der Elefant

Für die Polizei betreut ein Dienstleister als sogenannter Staatsbetrieb die Netzwerke des Bundeslandes und seiner Behörden, das ist i.d.R. eine privat organisierte Tochter des jeweiligen Bundeslandes. In Sachsen ist das die „Staatsbetrieb Saechsische Informatik Dienste“ in Dresden. Wenn man jetzt glaubt, daß man dies ja nur dieser, für die Netze zuständigen Organisation mitteilen müßte, hat das noch nie probiert 😀

Dort habe ich natürlich zuerst angerufen um rauszubekommen, wer meine Kontaktperson sein wird. Pustekuchen. Die Leute da haben sich das zwar angehört, wollten aber aus externen Input nichts tun. Ich sollte das doch an den Polizeibeamten schicken der die fragliche Email geschickt hatte übermitteln, er würde das schon weiterleiten. Das habe ich gemacht.

und ….. ???

Nix. Gar nichts. Keine Empfangsbestätigung, kein Rückruf. Wie sich heute rausgestellt hat, war die Kripo Leipzig am letzten Freitag, Tag des Maileingangs, total überlastet. Der zuständige Mitarbeiter hat die Mail einfach weggeklickt, weil er den Inhalt auch nicht ganz erfaßt hatte. Zum Glück für die Polizei hat der besorgte ITler keine Ruhe gegeben und sich heute erneut durch die Instanzen gequält bis der zuständige Mitarbeiter sich dann selbstständig bei mir gemeldet hat.

Die nicht an behördenarme Suche soll hier skizzenhaft dargestellt werden:

Polizeidirektion Braunschweig
LKA Niedersachsen
LKA Sachsen
Polizeidirektion Leipzig
Staatskanzlei Sachsen
Bundesamt für Sicherheit in der Informationtechnik

als Optionen wären noch drin gewesen :

Landesdatenschutzbehörde Sachsen
Innenministerium Sachsen
Bundesministerium des Inneren
Verfassungsschutz Sachsen
Staatsschutz

Wenn es nach dem BSI gegangen wäre, wärs gleich beim Bundesministerium des Inneren gelandet, also ganz oben 🙂

Jetzt fragt Ihr Euch vermutlich wie der Verfassungsschutz da ins Spiel kommt. Das ist ganz einfach, das Mailserversystem des Landes mailt ja nicht nur Bürger an, sondern auch andere Behörden. Wenn jetzt also ein Konfigurationsfehler vorliegt, der dafür sorgt, daß der schwächste Algorithmus ausgewählt wird, dann sind auch Behörden- und damit Staatsgeheimnisse betroffen. Und da wir nicht so enden wollen wie die Amis, wo deren Politiker private Mailserver benutzen, sollten unsere Behördennetzte sicher sein. Davon profitieren wir alle, auch ganz direkt, denn Anwälte haben auch viel Emailkontakt mit der Polizei, Staatsanwaltschaften usw. .  Es will sicherlich niemand seine Aussage/Anzeige/ V-Manninfo von irgendwelchen in- und ausländischen Gruppen dekodiert bekommen, oder ?

Hier ein paar Sätze, die sinngemäß in den Gesprächen enthalten waren:

Auf die Frage: „Können Sie nicht einfach auf dem Dienstweg die Information weiterleiten?“

„Da ist eine andere Polizeibehörde, da haben wir keinen Dienstweg.“ ( PD Braunschweig )
„Das ist ein anderes Bundesland, da sind wir nicht weisungsbefugt.“  ( LKA Niedersachsen )
„Ich habe keine Ahnung wovon Sie da reden.“ ( Staatskanzlei Sachsen )

Die Dame in der Staatskanzlei hatte aber die passende Idee und dazugehörige Nummer von der PD Leipzig, so daß ich dort anrufen konnte, was dann über weitere Umwege zur Lösung geführt hat.

Die Behörden in Sachsen sind aus der Sicht der Polizei übrigens IT mäßig von unten nach oben frageberechtig, es kann also keiner von außen oben nachfragen, wie man dem Artikel ja auch entnehmen kann, sondern man muß jemandem am Ende der Kette aka. Mitarbeiter der PD Leipzig, z.B. ein Kripobeamter, die Sache aufnehmen lassen. Der darf dann seinen ITler fragen, was er sich da grade angehört hat und DER darf dann nach oben durchreichen, was zutun ist. Args!

Das skurillste Gespräch fand aber mit dem Netzbetreuer statt, dem Staatsbetrieb Saechsische Informatik Dienste :

„Wie sind Sie an diese Nummer gekommen ?“
„Steht im Whois des IP Bereichs drin.“
„??? Und warum rufen Sie hier an?“  ( Die Formulierung könnte leicht abgewichen sein)
„Weil ich …. entdeckt habe.“ ( die Sache mit dem SSLv3 )
„Was erwarten Sie jetzt von mir ?
„Das Sie das aufnehmen und intern weitergeben, damit es abgestellt wird.“
„Nö.“

Fazit

Dieser „Wir sind aber eine andere Behörde Kram“ ist doch dem Informanten egal und der Schutz von Staatsgeheimnissen sollte doch bitte schön allen Behörden am Herzen liegen. Vor allem wundert es mich ja, das überhaupt etwas Polizeiarbeit bundeslandübergreifend stattfindet, wenn die keinen Dienstweg dafür haben, wie machen die das dann ?!?!?!

Wie sorgt man nun auf seinem eigenen Mailserver dafür, daß SSLv3 nicht mehr geht ?

Also zunächst mal wärs ratsam ein aktuelles Linux zu haben, weil darauf aktuelle OPENSSL und GNUSSL Versionen wären. Je nach dem welche Kryptobibliothek man verwendet, gibt es unterschiedliche Wege.

Für Exim hält man sich am besten an dies hier: https://lists.exim.org/lurker/message/20141017.093614.e5c38176.de.html

Um eine Neukompilierung kommt man wohl nicht drumherum. Für den Anfang reicht es natürlich schon, wenn man SSv3 ans Ende und TLSV1.2 an den Anfang der Protokollverhandlungen stellt. Damit fällt SSLv3 dann praktisch auch weg.