Shared-Secrets: Geheimnisse über verschlüsselte Links austauschen

28.09.2016 yahe code legacy linux security

Im Internet gibt es inzwischen eine größere Anzahl an Diensten, über die es möglich ist, Texte auszutauschen, der bekannteste davon dürfte wohl Pastebin.com sein. Einige davon haben zudem begonnen, damit zu werben, dass man über sie Geheimnisse austauschen kann, die wahlweise verschlüsselt auf dem Server abgelegt werden oder nur einen einzigen Abruf des Geheimnisses ermöglichen, beispielsweise OneTimeSecret.com.

Auf Arbeit haben wir vor kurzem nach einer Möglichkeit gesucht, Informationen möglichst sicher an einen Empfänger zu übertragen, ohne, dass auf dessen Seite Software installiert werden oder eine spezifische Konfiguration vorgenommen werden muss. Dabei bot sich solch ein einfacher Webdienst regelrecht an. Allerdings sahen wir die vorhandenen Lösungen als eher kritisch an. Denn obwohl ein Passwortschutz besteht, werden die Informationen meistens unverschlüsselt auf dem Server abgelegt. Dadurch hat der entsprechende Betreiber die Möglichkeit, auf sie zuzugreifen und somit auch jeder Hacker, dem es gelingt, in den jeweiligen Dienst einzudringen. Eine zusätzliche Verschlüsselung wiederum würde die Hürde auf der Seite des Empfängers wieder erhöhen. Eine Alternative musste her.

Also begann ich damit, eine neue Lösung zu implementieren. Das Ergebnis der Entwicklung wurde als Shared-Secrets auf Github veröffentlicht. Zudem ist in unserem Firmenblog ein begleitender Artikel veröffentlicht worden.

Im Gegensatz zu den üblichen Lösungen im Netz haben wir dabei auf mehrere Faktoren Wert gelegt:

  1. Die Geheimnisse sollen nicht auf dem Server gespeichert werden.
  2. Die Geheimnisse sollen nur ein Mal abrufbar sein, um einen Vertraulichkeitsverlust erkennen zu können.
  3. Es muss möglich sein, ein Geheimnis zu teilen, ohne, dass der Server es lesen kann.
  4. Es muss möglich sein, ein Geheimnis zu teilen, ohne, dass der Server bei der Verteilung involviert ist.

Dabei herausgekommen ist folgende Lösung: Das zu teilende Geheimnis wird via GPG verschlüsselt und Base64-encodiert. Der Base64-encodierte String wird in eine URL überführt. Bei Aufruf der URL wird der Base64-encodierte String an einen Server übertragen, der ihn decodieren und entschlüsseln kann. Das entschlüsselte Ergebnis wird anschließend angezeigt. Die Prüfsumme des Base64-encodierten Strings wird in einer Datenbank abgelegt. Zudem besteht die Möglichkeit, das Geheimnis vor dem Versand an den Server symmetrisch zu verschlüsseln und nach dem Abruf vom Server wieder zu entschlüsseln.

Auf diese recht einfache Weise konnten alle Designziele erfüllt werden:

  1. Dadurch, dass das verschlüsselte Geheimnis direkt in der URL enthalten ist, muss es nicht auf dem Server gespeichert werden. Auch nach einem Abruf wird lediglich die Checksumme der URL und nicht das eigentliche Geheimnis gespeichert.
  2. Durch das Speichern der Checksummen von bereits abgerufenen URLs ist es möglich, zu erkennen, wenn ein Geheimnis mehrfach abgerufen werden soll. Dieser Abruf kann dann unterbunden werden.
  3. Mit der Möglichkeit, ein Geheimnis zusätzlich lokal zu ver- und entschlüsseln, besteht die Möglichkeit, ein Geheimnis auszutauschen, ohne, dass der Server dieses im Klartext lesen kann. Das verwendete Passwort kann bspw. über einen zweiten Kanal übertragen werden.
  4. Dadurch, dass für die Erstellung der URL Standardverfahren eingesetzt werden, können diese lokal mit Hilfe einer einzelnen Shell-Befehlszeile erzeugt werden. Das erspart zudem die Bereitstellung einer API.

Ein weiterer Vorteil der gewählten Lösung ist, dass der Speicherbedarf recht gering ausfällt. Es müssen im Grunde nur die Checksummen der tatsächlich abgerufenen Geheimnisses gespeichert werden. Geheimnisse, für die URLs erzeugt wurden, die aber nicht abgerufen werden, verbrauchen daher im Umkehrschluss auch keinen Speicherplatz.

Getestet werden kann die Anwendung unter secrets.syseleven.de, der Referenzinstallation der Anwendung. Über sie wird auch sichergestellt, dass es möglich ist, mit einem korrekten Setup ein A+ Rating im Mozilla Observatory zu erhalten.


Search

Categories

administration (45)
arduino (12)
calcpw (3)
code (38)
hardware (20)
java (2)
legacy (113)
linux (31)
publicity (8)
raspberry (3)
review (2)
security (65)
thoughts (22)
update (11)
windows (17)
wordpress (19)