Gecloude, paranoide Sicherheit

Gecloude, paranoide Sicherheit

Du hast etwas Zeit über und magst lange Texte? Sicherheit in der IT ist genau Dein Ding? Dann lies Dir mal bitte folgende zwei Fallbeispiele durch und entscheide für Dich selbst wie funktionierende Sicherheit hier jeweils aussehen müsste.

Runde 1: Passwortaustausch hipp und modern

Wie überträgt man Passwörter für zum Beispiel IpSec? In derselben Email wie die Proposals? Wohl besser nicht. Also per Fax? Nein, Fax ist total veraltet - wer nutzt den noch so etwas? Per Telefon? Nein, sicherlich nicht. Ist ja noch älter als Fax und das hatten wir ja bereits. Brief? Zu langsam. Email wäre besser. Ach, moment: Stopp. Nein. Zwar gut aber irgendwie doof. Modern und hipp ist "Cloud". Warum also nicht eine Passwort-Austauch-Cloud? Mit Ende-zu-Ende-Verschlüsselung. Jetzt wird alles gut.

Frage

Die Idee ist doch super. Und sicher ist das auch. Ich erkläre mal das Verfahren: Ich erstelle ein zufälliges Passwort welches ich jemand Drittem übertragen muss. Nun melde ich mich an der Webseite eines Cloud-Dienstes an. Das Formularfeld mit dem Passwort wird allerdings bevor es an die Cloud geschickt wird noch entsprechend verschlüsselt. Per Javasript in meinem Webbrowser. Was da also übertragen wird ist ein bereits verschlüsseltes Passwort. Dazu kommt, dass die Seite per https geöffnet ist. Also nochmals verschlüsselt. Das so verschlüsselt übertragene verschlüsselte Passwort wird in der Passwort-Austausch-Cloud abgelegt. Nun muss die Cloud-Plattform dem Empfänger noch mitteilen, dass es hier ein Passwort für ihn gibt. Zum Beispiel per Mail. Also erhält der Empfänger einen Download-Link, kann via https das verschlüsselte Passwort verschlüsselt übertragen und in seinem Webbrowser per JavaScript wieder entschlüsseln. Voila, schon sieht er das von mir erstellte Passwort im Klartext.

Schlüssel

Doch Moment, das Ganze hat doch irgendwo einen Haken. Eine Plattform, welche jemand Drittes darüber informiert, dass ein Passwort da ist. Eine Plattform in der Cloud. Die wird wohl via Email benachrichtigen. Könnte ich, anstatt eine zusätzliche Plattform zu verwenden, hier nicht direkt eine Email an den Empfänger senden? Ja, klar - das könnte ich tun. Das würde die Cloud-Plattform einsparen. An der Sicherheit des Verfahrens hätte sich so noch nichts geändert: Ich verschlüssele das Passwort bevor ich es übertrage, übertrage es irgendwie, der Empfänger entschlüsselt das Passwort. Das "übertrage es irgendwie": Ist doch egal ob Cloud-Plattform oder Email?

Doch schon wieder stopp, halt. Die Cloud-Plattform könnte den Download auf einmal beschränken. Ok, da seh ich jetzt gedanklich zwei Dinge über die man mal nachdenken könnte:

  • Es gibt Virenscanner die aus Sicherheitsgründen von zu herunter ladenden Inhalten einen Prefetch machen. Der erste Downloadversuch könnte also bereits beim Scanner scheitern. Zugegeben selten, habe ich aber schon mehrfach erlebt.
  • Das hier finde ich ist der spannendere Punkt: Was macht der Empfänger mit diesem einmaligen Download? Er speichert ihn. Damit er ihn öfters lesen kann. Einmal übertragen, aber beliebig oft lesen. Das kann ich nicht beeinflussen. Richtig? Richtig. Dann hätte es auch eine Mail getan: Einmal übertragen, aber beliebig oft lesen. Finde den Unterschied.

Ihr seht schon, es braucht vom Grundsatz her keine Passwort-Austausch-Cloud-Plattform. Email kann das auch. Doch schon wieder Moment, stopp: Da ist doch noch was anderes? Einen ganz wichtigen Punkt habe ich noch gar nicht angesprochen: Ich verschlüssele das Passwort im Browser bzw. für die Mail und übertrage... Ja mit was hab ich den das Passwort verschlüsselt? Mit einem Passwort? Ach, spannend. Und wie übertrage ich dies? Per Email? Ja klar, mit dem Link zum Download bzw. dem verschlüsselten Passwort... Ach nein, Selbstironie Ende. Ich versuche dem gegenüber das Passwort via Telefon zu übertragen. 64 Zeichen: Groß- und Kleinbuchstaben. Dazu noch Ziffern. Schlimmer sind die Sonderzeichen. Da sind einige dabei wo ich nicht mal weiß wie die heißen. Kann Dir nicht passieren? Ok, wie heißen den die beiden hier `und ´? Oder diese beiden hier: ° und µ? Vor allem letzterer: Zeichen wie µ gibt es viele. Bei mir auf meiner Tastatur ist sogar das hier drauf ». Nur weil keine Taste damit beschriftet ist, ist es trotzdem da und kann verwendet werden. Was jetzt?

Nein, Telefon macht hier wenig Spaß. Dann lieber eine Textdatei an eine Email angefügt: 50 nummeriere Zeilen mit möglichen Passwörtern. Dazu geht der Telefonanruf an den Empfänger mit dem Hinweis Zeile 12, allerdings alle "a" durch "@" ersetzen, das gleiche für "3" welches zum "Ä" wird usw.

Diese Variante braucht einen Telefonanruf und eine Email. Wer will kann die vermeintliche Sicherheit noch zusätzlich erhöhen in dem er die Datei per einmaligem Downloadlink anbietet. Das können inzwischen viele der Dateiplattformen für die Cloud. Bevor wir jetzt an der Stelle ebenfalls wieder ausschweifen mal eine Zusammenfassung der bisherigen Situation.

Ausrufezeichen

Zusammenfassung Fall 1

Ok, lasst uns mal 1:1 zusammenzählen was wir erarbeitet haben: Eine Plattform welche Passwörter verschlüsselt um diese verschlüsselt zu übertragen... Irgendwann müssen diese Daten entschlüsselt werden. Wieder per Passwort? Das hat das Problem der Klartextübertragung des Passwortes nur an eine andere Stelle verschoben. Es gibt weiterhin ein Passwort welches im Klartext vorliegt. Aber hat sich die Sicherheit dadurch verbessert? Nicht wirklich: Das Verfahren wurde komplexer, komplexere Verfahren sind anfälliger für Fehler. Und was ist wenn der Download nur einmal angeboten wird? Das würde ja bedeuten, dass es möglich ist das verschlüsselte Passwort bei der Übertragung abzufangen. Ansonsten könnte man den Download mehrfach anbieten: Es kommt doch eh nur die berechtigte Person dort hin. Oder doch nicht? Dieses Problem versuche ich zu umgehen indem ich den Download nur einmal anbiete. Es ist möglich, die Daten abzugreifen. Jetzt speichert der Empfänger die Daten irgendwo. Weil er sie nicht gleich braucht sondern erst in ein paar Tagen dazu kommt. Warum auch immer. Es ist möglich, die Daten abzugreifen. Ihr seht schon: Hat nichts an der Sicherheit geändert, nur der Ort wo ich die Daten abgreifen muss wurde geändert. Komplexität löst keine einfachen Probleme.

Und eine kritische Frage zum Schluss: Gibt es eine große, bekannte und etablierte Plattform zum Austauschen von Passwörtern die diesem Verfahren folgt? Was wäre wenn diese von einem der großen Konzernen mit fragwürdigem Ruf zum Thema Datenschutz angeboten werden würde? Na dann lieber auf den Codeplattformen git und Co gesucht. Da findet sich was. Dank opensource ist das sicher. Ach, ist das so? Den Quellcode selbst geprüft? Du vertraust der Person welche behauptet sie hätte den Quellcode geprüft? Was soll schon passieren, ist doch opensource. Ich mag opensource, das ist kein Geheimnis. Aber wenn das so wäre, wäre opensource per Defintion fehlerfrei. Das ist ein Reifegrad an Software den selbst kommerzielle Produkte wohl nie erreichen werden.

Runde 2: Emails abholen

Die Woche war noch nicht vorbei als folgende Anfrage auf meinem Schreibtisch gelandet ist: Der Besitzer einer Domain betreibe eine Groupware Lösung. Wenn nun Emails von einem Postfach an ein anderes Postfach innerhalb dieser Groupware Lösung übertragen werden, werden diese Daten verschlüsselt übertragen. Ja, das machen moderne Groupware Systeme so. Wenn aber nun eins der Postfächer an jemand externes weitergeleitet werden müsste: Was ist dann? An dieser Stelle will der Kunde ebenfalls sicher stellen, dass die Emails verschlüsselt übertragen werden. So wie wenn das intern wäre. Den Kunden treibt die Angst vor Man-In-The-Middle Angriffen. Ein verständliches Anliegen.

Fragezeichen

Als Lösung für dieses Thema wurde folgendes Vorgehen vorgeschlagen: Eine Weiterleitung an den extern Mailserver via SMTP ist unerwünscht. Stattdessen wäre ein abholen der Mails via IMAP gewünscht. Allerdings sollte sichergestellt werden, dass der IMAP-Server das richtige Zertifikat vorweist. Doch wann ist ein Zertifikat gültig? Die übliche Vorgehensweise ist prüfe ob der Name des Zertifikats zum  zu kontaktierenden Host passt, dass das Zertifikat im Gültigkeitszeitraum liegt und, dass der Aussteller des Zertifikats in der Liste der vertrauenswürdigen Herausgeber liegt.

Hilft das allerdings gegen Man-In-The-Middle? Nein, nur bedingt. "Gültige" Zertifikate sind ein leichtes zu bekommen. Am sichersten wäre dies Prüfung zu erweitern: In dem man den Fingerabdruck des Zertifikats mit prüft. Allerdings muss man jetzt jedes mal den Fingerabdruck aktualisieren wenn die Gegenseite das Zertifikat verlängert. Und das kann oft der Fall sein - vor allem dann, wenn eines der kostengünstigen Zertifikate mit kurzer Laufzeit verwendet wird. Aber nein, das will der Kunde nicht. Zu aufwändig. Eine allgemeine Prüfung des Zertifikats reicht aus.

Fragen über Fragen

Finde den Fehler. Schon einmal darüber nachgedacht was eigentlich erreicht werden sollte? Und was tatsächlich erreicht wird? Da passt eins und eins alles andere als zusammen. Der Kunde will, dass Emails von seinem System sicher zu einem Dritten weitergeleitet werden. Erreicht wird, dass der Dritte prüft von welchem Server er die Mails abholt. Spannende Frage: Was ist wenn er das nicht prüft? Würde das der Kunde mitbekommen? Nein, tut er nicht. Nächste Frage: Der Kunde will, dass die Daten sicher zum Dritten übertragen werden. Per IMAP. Prüft der Kunde wer da gerade die Emails abholt? Also ob der wo gerade den Benutzernamen und das Passwort eingibt auch wirklich der ist den er vorgibt zu sein? Die Sicherheit ist an der Stelle reduziert auf den Benutzernamen und das Passwort. Egal wo und wie verschlüsselt wird. Benutzername und Passwort. Die kann jeder eingeben und verwenden wo diese Daten kennt. Egal ob berechtigt oder nicht.

Das kann so also nicht funktionieren und muss anders gelöst werden. Nur wie? Deswegen rasch nochmal die vier Gründe für Verschlüsselung aufgetischt:

  1. Vertraulichkeit
  2. Integrität
  3. Authentizität
  4. Verbindlichkeit

Na, das trifft es doch! Der Kunde will, dass nur der berechtigte Dritte die Daten, also die Emails, lesen darf. Seine Beweggründe sind gefunden, es sind die üblichen Verdächtigen. Nur wie werden die bei IMAP erreicht? Das Ziel, welches der Kunde will sind die 4 gezeigten Punkte. Und die erreicht man über die üblichen, verdächtigen Wege: Der IMAP-Server muss sicherstellen, dass er nur dann Emails überträgt wenn der Benutzer "ausreichend", gemäß den 4 Punkte, authentifiziert ist. Das kann zum Beispiel dadurch passieren, dass der IMAP-Server neben seinem eigenen Zertifikat noch gleich noch für die Authentifizierung das vom IMAP-Client prüft. Nur wenn er dieses kennt, dann ist alles ok. Oder, wer den Schritt nicht mag: Den IMAP-Server hinter ein VPN gepackt. VPN bringt von sich aus ebenfalls die obigen 4 Punkte mit.

Zusammenfassung Runde 2

Es ist hilfreich zu erkennen welche Ziele erreicht werden sollen. Mit dem Blick auf die genau definierten Ziele lassen sich geeignete Wege dorthin erarbeiten. Schwammige Ziele ergeben schwammige Lösungen die in der Regel nur bedingt das tun was man eigentlich erreichen wollte.

Die Absicht des Zieles war klar, der vorgeschlagene Lösungsweg mag im ersten Moment stimmig klingen. Eine kritische Prüfung ob das Ziel damit wirklich zu erreichen ist kann allerdings nie schaden. Der genaue, zweite Blick lohnt sich.

Ausrufezeichen
Sorry

Finale

Ist das oben erklärte die ultimative Lösung für die beiden Fälle? Sicherlich nicht. Zeigt die Diskussion, dass beim Thema Sicherheit durchaus Gesprächsbedarf besteht? Sicherlich ja.

Die Schwierigkeit beim Katz- und Mausspiel ist zu wissen wer die Katze ist. Übertragen auf die beiden Beispiele: Die Schwierigkeit ist zu erkennen welches Ziel wirklich erreicht werden sollte. Sobald dieser wichtige Punkt erkannt ist, ist der Rest rasch erledigt.

Sicherheit first, Bedenken last. Mein Bedenken first wegen der Sicherheit die last endlich auf der Strecke bleibt: total out. Ich bin wohl genauso rückständig und zurückgeblieben wie die alte analoge Telefonie: Total out. Wer jetzt Parallelen zu den aktuellen Bezahlterminals für eletronic cash sucht: Total out. Aber es mag sich am Horizont ein Licht auftun: Man könnte der analogen und veralteten Telefonie einen modernen, digitalen Anstrich verpassen. Dann wäre man eventuell wieder mehr bereit einfach mal zum Telefonhörer zu greifen und nachzufragen...

Sie haben kein Recht auf Ihre Meinung. Sie haben ein Recht auf Ihre fundierte Meinung. Niemand ist berechtigt zur Ignoranz.

Quelle Bild: Wikipedia (https://de.wikipedia.org/wiki/Harlan_Ellison#/media/Datei:Harlan_Ellison_at_the_LA_Press_Club_(cropped).jpg)

Harlan Ellison
US-amerikanischer Schriftsteller, Drehbuchautor und Kritiker
SASL DIGEST-MD5 mit slapd bzw. OpenLDAP

SASL DIGEST-MD5 mit slapd bzw. OpenLDAP

Eine kurze Anleitung wie man einem slapd von OpenLDAP dazu bringt Benutzer via SASL mit DIGEST-MD5 anmelden zu lassen. Selten in einem Titel bereits so viele Akronyme gehabt. Deswegen der Reihe nach:

Aber das alles ist unter Umständen ja bereits bekannt - warum sonst solltest Du Dich auf diese Seite verirrt haben? Was mich immer dran geärgert hat ist, dass aus der OpenLDAP Dokumentation zwar hervor geht wie alles funktioniert, ein praktisches Einrichtungsbeispiel aber schlichtweg fehlt. Dies möchte ich an dieser Stelle nach holen.

Und als Beispiel soll an dieser Stelle DIGEST-MD5 auch völlig ausreichen - auf die anderen Möglichkeiten will ich hier in diesem Posting gar nicht weiter eingehen.

Für die ungeduldigen Leser: Ganz unten ist mein Dockerfile angefügt sowie die ldif Datei mit der man cn=config anpassen kann sobald der slapd läuft. Docker bzw. ldapadd usw. ist noch nicht ganz Deins? In der Dockerfile stehen oben in den Kommentaren passende Beispiele wie das laufen könnte.

Docker

Um solche Sachen zu testen nutze ich ganz gern einen Docker Container. Ich mag es einfach, dass ich Dinge testen kann ohne groß irgendwas an Software installieren zu müssen. Und wenn man fertig ist kann man den Container bzw. das Image einfach so löschen und alles ist wieder spurlos verschwunden als ob es nie dagewesen wäre.

Natürlich geht das ganze auch ohne Docker. Dazu einfach die Schritte aus der Dockerfile sinngemäß auf einem beliebigen slapd übernehmen.

Umsetzung

Um rasch einen OpenLDAP Docker Container zu bekommen verwende ich ganz gerne dieses Image: https://hub.docker.com/r/osixia/openldap/. Das ist Debian basiert, klein, schlank und richtet einen grundlegend vorkonfigurierten slapd Server ein. Wenn es schnell gehen muss oder man sich einfach die Arbeit sparen will selbst ein Image anzulegen: Meiner Meinung nach ein gutes Ausgangsimage!

Und was mache ich im Dockerfile? Wie gehabt, diese Schritte kann man ohne Docker sinngemäß auf dem Linux bzw. der Linux VM durchführen.

  1. Ich installiere das Debian-Paket sasl2-bin. Durch dieses Paket werden diverse Hilfstools rund um SASL installiert.
  2. Als Beispiel lege ich einen SASL Benutzer an sasladmin@slpad.ldap.
  3. Der Benutzer unter welchem Debian slapd laufen lässt wird in die sasl Gruppe mit aufgenommen. Eben damit er die sasldb auch tatsächlich lesen kann 😉
  4. Die SASL Konfiguration für OpenLDAP /etc/ldap/sasl2/slapd.conf wird angelegt und entsprechend mit den notwendigen Dateisystemsrechten versehen.
Entgegen dem Eindruck der aus der OpenLDAP Dokumentation entstehen könnte braucht man für DIGEST-MD5 keinen laufenden saslauthd. Das ist auch der Grund warum ich diesen Passus in der SASL Konfiguration übersprungen habe.

slapd.conf bzw. cn=config

Nun fehlen noch Änderungen an der slapd.conf selbst. Wer das alte Konfigschema verwendet muss die entsprechende slapd.conf Datei sinngemäß bearbeiten, für alle mit neuem cn=config Schema liegt die passende ldif Datei mit dabei. Das von mir verwendete Image verwendet bereits cn=config und da das Dockerfile den slapd-Server erst noch konfiguriert läuft dieser nunmal auch noch nicht. Somit ist die ldif über die üblchen Wege im LDAP-Server mit aufzunehmen nach dem der Container am laufen ist.

Und das steht im config.ldif drin:

  1. Zum einen setze ich eine Umschreibe-Regeln von dem SASL Benutzer auf einem LDAP internen Benutzer
  2. Diesen Schritt kann man weglassen, funktioniert auch ohne: Ich habe die Verwendung von sasldb explizit gesetzt.
#
# slapd Dockerfile inkl. SASL DIGEST-MD5
#

# Starten mit:
# docker build -t gmn-ldap --no-cache .
# docker run -p 127.0.0.1:389:389 --rm --name gmn-ldap gmn-ldap

# SASL Konfig in cn=config übernehmen
# ldapadd  -x -Dcn=admin,cn=config -wchangeme -f config.ldif
# ldapsearch -ZZ -Hldap://localhost -YDIGEST-MD5 -U sasladmin@slapd.ldap

# Suche mit:
# ldapsearch -ZZ -Hldap://localhost -x -Dcn=admin,dc=gmn,dc=ldap -wchangeme


FROM osixia/openldap

ENV \
   LDAP_ORGANISATION=gmn \
   LDAP_DOMAIN=gmn.ldap \
   LDAP_ADMIN_PASSWORD=changeme \
   LDAP_CONFIG_PASSWORD=changeme \
   LDAP_TLS_VERIFY_CLIENT=never


# Notwendige Tools installieren
RUN apt-get update && apt-get install -y sasl2-bin && apt-get clean

# sasldb anlegen sowie notwendige Datei-/Gruppenrechte setzen
RUN echo changeme | /usr/sbin/saslpasswd2 -c -u slapd.ldap sasladmin
RUN usermod -a -G sasl openldap
RUN echo "mech_list: EXTERNAL DIGEST-MD5 CRAM-MD5 PLAIN LOGIN" > /etc/ldap/sasl2/slapd.conf
RUN chown openldap.sasl /etc/ldap/sasl2/slapd.conf && chmod 0660 /etc/ldap/sasl2/slapd.conf

 

dn: cn=config
changeType: modify
add: olcAuthzRegexp
olcAuthzRegexp: uid=sasladmin@slapd.ldap,cn=digest-md5,cn=auth cn=admin,dc=gmn,dc=ldap

dn: cn=config
changeType: modify
add: olcSaslAuxprops
olcSaslAuxprops: sasldb

 

Test

Und so sieht es aus wenn man das jetzt testet, an einem einfachen ldapwhoami gezeigt:

$ ldapwhoami -ZZ -Hldap://localhost -x -Dcn=admin,dc=gmn,dc=ldap -W
Enter LDAP Password: 
dn:cn=admin,dc=gmn,dc=ldap

$ ldapwhoami -ZZ -Hldap://localhost -YDIGEST-MD5 -U sasladmin@slapd.ldap
SASL/DIGEST-MD5 authentication started
Please enter your password: 
SASL username: sasladmin@slapd.ldap
SASL SSF: 128
SASL data security layer installed.
dn:cn=admin,dc=gmn,dc=ldap

Im ersten Aufruf ganz normal via simple bind direkt an den LDAP-Server, im zweiten via SASL/DIGEST-MD5. Gut zu sehen ist der Benutzernamen sasladmin@slapd.ldap welcher dank der Umschreibung als cn=admin,dc=gmn,dc=ldap zurück geliefert wird.

stunnel: noch lange nicht ausgepopt

stunnel: noch lange nicht ausgepopt

Wer kennt das nicht? Irgendeine alte Software die betriebsnotwendig ist und schon seit geraumer Zeit keine Updates mehr bekommen hat. Und die dümpelt halt so vor sich hin. So lange alle Clients sich noch verbinden bzw. die Verbindungen zu anderen Servern aufgebaut werden können scheint ja alles wunderbar zu sein. Es scheint so. Bis irgendeiner meint seine TLS-Einstellungen zu aktualisieren...Und das ist gar nicht so unwahrscheinlich wenn man zum Beispiel den Empfehlungen des BSI folgen mag.Von SSL ist da schon lange keine Rede mehr und sogar TLSv1.1 fehlt neuerdings. Weitere Infos dazu siehe hier:

Besonders prekär ist es, wenn die Anwendung noch gegen openssl 0.9.x verlinkt ist. Damit geht maximal TLSv1.0. Ihr seht schon, das Unheil nimmt seinen Lauf sobald diese alte Software versucht verschlüsselte Verbindungen aufzubauen bzw. über verschlüsselte Verbindungen erreicht werden soll. Die Verbindung startet zwar, wird aber gleich wieder beendet. Meist sind die Fehlermeldungen im Log dazu wenig aussagekräftig.

Interesse daran wie man mittels tcpdump und openssl solche Verbindungsprobleme erkennen kann? Schreibt mir einfach (Mail oder Kommentar), dann reiche ich einen passenden Blogeintrag nach.

Und wie kann man das lösen? Ein Update der Software wäre möglich. Nur gibt es leider viele Gründe warum dies noch nicht passiert ist bzw. die nächsten Tage ebenfalls nicht passieren wird. Sind wir ehrlich zueinander: Das Verständnis dafür mag sich als Admin in Grenzen halten. Dennoch kennen wir alle die Situation. Die gibt es oft. Zu oft. Mit zu vielen Gründen.

Also gut, das geht so nicht. Also was tun wenn guter Rat teuer ist? Es gibt da so ein altes Sprichwort: "Wenn der Prophet nicht zum Berg kommt, dann kommt halt der Berg zum Propheten" (frei nach Francis Bacon 1625). Ein Update der Software ist nicht möglich, die Sicherheitseinstellungen der gegenüber liegenden Seite wird man wohl kaum reduzieren wollen. Bleibt also der Weg durch die goldene Mitte: Ein Proxy muss her! Der macht aus Klartext aktuelle Verschlüsselung, aus zu alter Verschlüsselung aktuelle Verschlüsselung oder, und das soll es ebenfalls geben: Aus alter Verschlüsselung gar keine Verschlüsselung. Auch hierfür gibt es Fälle wo das völlig ausreichend ist.

stunnel

Für solche Dinge nehme ich gerne stunnel (https://www.stunnel.org/). Der ist klein und schlank und läuft unter aller gängigen Unix/Linux Systemen als auch unter Windows. Das Tool gibt es bereits seit über 20 Jahren und wird immer noch aktiv entwickelt. Hut ab!

Ok, als ich das erste Mal mit stunnel zu tun hatte waren meine Beweggründe eher anders herum: Viele Webfrontends damals kannten noch gar keine Verschlüsselung. Also fix stunnel davor geschaltet und schon war die Seite via https anstatt http zu erreichen. Die Richtung ist aber genau genommen völlig egal - es gibt ein Grundprinzip welches man bei stunnel immer im Hinterkopf behalten muss: Auf der einen Seite ist verschlüsselt, auf der anderen Seite ist Klartext. Wer aus alter Verschlüsselung neue machen will braucht somit zwei stunnel: Einen der übers Netz alte Verschlüsselung an nimmt und Klartext nach localhost leitet. Auf localhost geht ein stunnel ran der Klartext nach aktueller Verschlüsselung umwandelt. Reicht eine der beiden Richtungen reicht logischerweise auch nur ein stunnel.

alpine

Kein Platz stunnel irgendwo mit drauf zu packen? stunnel kann zwar drauf funktioniert aber nicht wie erhofft da am Installationsort eine völlig veraltete openSSL Bibliothek installiert ist? Für sowas nehme ich ganz gerne alpine Linux. Klein, sehr, sehr schlank und bringt stunnel in den zusätzlichen Paketen mit. Egal ob als Mini-VM oder als Container: läuft 🙂

Infos zu alpine? Gibt es hier: https://alpinelinux.org/

Beispiel 1: pop3 mit STARTTLS

Genug der großen Reden, ein paar Beispiele müssen her! Die Konfig ist simpel: Zuerst ein paar globale Einstellungen und im Anschluss daran die jeweiligen Proxys. Das Format sollte jedem bekannt sein: Ini lässt grüßen.

;debug = info
;foreground = yes
;options = -NO_SSLv3
sslVersion = all
ciphers = ALL

[stls2pop3]
protocol = pop3
client = no
accept = 10110
connect = pop.gehirn-mag.net:110
cert = /etc/stunnel/stunnel.pem

Im globalen Abschnitt kann z.B. stunnel dazu gebracht werden im Vordergrund zu starten. Perfekt für Diagnose. Ansonsten habe ich hier nur sichergestellt, dass alles was "alte" Verschlüsselung ist verbinden darf.

Zum Proxy stls2pop3 selbst: Mir ist einmal eine Software begegnet die konnte POP3 und POP3S. Ok, POP3S ist raus. Nur wurde bei POP3, sobald angeobten, STLS (STARTTLS) verwendet. Logisch, ohne Schalter zum abstellen. Versteht sich. Oder auch nicht.

client auf no gestellt, es sollen eingehende Verbindungen verschlüsselt angenommen werden. Das soll für den Moment reichen, mehr Wissen braucht es zum client Schalter im Moment noch gar nicht. Mit accept wird der Port auf 10110 gestellt. Und via connect wird angegeben wohin stunnel sich bei eingehenden Anfragen letztendlich verbinden soll. In dem Beispiel steht ein ganz normaler Server welcher via POP3 angesprochen werden soll. Nur Moment, damit das funktioniert muss man beachten, dass bei POP3 für STARTTLS nur die Kurzform STLS verwendet werden muss. Das sollte man wissen. Und somit sollte auch stunnel darüber Bescheid wissen. Deswegen noch fix protocol auf pop3 gestellt. In der manpage zu stunnel.conf sind die Protokolle aufgelistet welche stunnel versteht: Eine ordentliche Menge. Die manpage kann hier nachgelesen werden: https://www.stunnel.org/static/stunnel.html#SERVICE-LEVEL-OPTIONS. Im Bereich "Service Level Options" einfach mal nach "protocol" suchen. Infos zum POP3 Protokoll uns STLS: https://de.wikipedia.org/wiki/Post_Office_Protocol#Verschl%C3%BCsselung.

Zu guter Letzt: Das Zertifikat via cert: Bei vielen Distributionen wird beim installieren bereits ein passendes angelegt. Das Zertifikat fehlt oder soll durch ein anderes ersetzt werden? Siehe stunnel HowTo im Abschnitt "Generating the stunnel certificate and private key (pem)": https://www.stunnel.org/howto.html.

Jetzt noch in der Anwendung rasch angegeben, dass der zu erreichende POP3 Server unter der IP-Adresse xxx.xxx.xxx.xxx bzw. folgendem DNS-Namen ... auf Port 10110 erreichbar ist. Und sehe wie die Anwendung über das hoffnungslos veraltete POP3 STARTTLS wieder verbindet. Ok, im Klartext auf das Ziel. Mag Situationen geben wo das reicht. Falls nicht lies einfach im nächsten Abschnitt weiter. In dem wird durch einen zweiten Proxy die Verschlüsselung auf neu getrimmt.

Beispiel 2: Aus https alt mach neu

So, ein Proxy reicht also nicht. Dann halt mit zwei: Aus https alt mach http Klartext welches nur über localhost sich verbindet. Und zwar auf einen zweiten Proxy welcher aus Klartext https neu macht.

;debug = info
;foreground = yes
;options = -NO_SSLv3
sslVersion = all
ciphers = ALL

[https_in]
client = no
accept = 10443
connect = localhost:54321
cert = /etc/stunnel/stunnel.pem

[https_out]
client = yes
accept = localhost:54321
connect = www.gehirn-mag.net:443
cert = /etc/stunnel/stunnel.pem

Das Prinzip Konfig wie gehabt. Zuerst der Kopf und dann der erste Proxy. Hier mit dem Namen https_in. Wie in Lösung 1 beschrieben macht der aus https Klartext http. Und verbindet sich als Ziel auf localhost:54321. An der Adresse lauscht der zweite Proxy https_out. Ein Unterschied gibt es: Hier steht client auf yes. Bei yes geht stunnel der Annahme, dass das Verbindungsziel Verschlüsselung benötigt. Somit ist der eingehende Teil die Klartextseite. Bei no ist das gerade anders herum (siehe manpage). Der Rest, oh Wunder, ist wie gehabt und bereits bekannt.

Noch fix das Ziel in der Anwendung geändert auf die Adresse des Proxyservers mit Port 10443 und schon wird aus https ganz arg alt https ganz arg neu gemacht.

Fazit

Und wieder mal die Welt gerettet. Dank einem kleinen, schlanken Tool. Das trotz seines Alters alles andere als ins Alter gekommen ist. Es ist kein Fehler in einem ruhigen Moment mal die Webseite und die Beispiele etwas genauer zu betrachten. So viele Dinge die man darüber hinaus mit stunnel noch machen kann. Es lohnt sich.