Geheimnisse und Geheimnisverwaltung in Java

Abgeschlossen

Geheimnisse sind Zeichenfolgen, die nicht an Außenstehende weitergegeben werden sollten: Datenbankkennwörter, private Verschlüsselungsschlüssel, persönliche Zugriffstoken und so weiter. Aus Sicherheitsgründen sind viele Personen auch der Meinung, dass alles was Angreifer*innen helfen könnte, als Geheimnis angesehen werden sollte. Die URL zu Ihrer Produktionsdatenbank könnte beispielsweise als Geheimnis gelten. Ihre Datenbank sollte nicht öffentlich zugänglich sein. Der Grund dafür ist, dass solche Informationen von Natur aus vertraulich sind. Je weniger Informationen sich in Ihrem Code befinden, desto besser.

Was bedeuten Zero Trust und Zero Secrets?

Das Zero-Trust-Konzept bedeutet, dass niemandem blind vertraut wird und niemand ohne Überprüfung und Autorisierung Zugriff auf Unternehmensressourcen erhält.

Dieses Konzept gilt auch für Webanwendungen: Es sollten keine Geheimnisse in ihrem Code oder in ihren endgültigen Binärdateien vorhanden sein. Dieses Konzept wird als Zero Secrets bezeichnet.

Geheimnisse sollten von einem externen System mit strengen Zugriffsregeln und Überprüfungen verwaltet werden, um das Angriffsrisiko zu verringern.

Keine Geheimnisse in Git-Repositorys

Auch wenn Ihr Git-Repository privat ist, ist es schlecht, ein Geheimnis in den Quellcode einzufügen:

  • Jeder mit Zugriff auf Ihr Repository kennt Ihre vertraulichen Daten.
  • Jeder mit Zugriff auf die Binärdatei Ihrer Anwendung kann Geheimnisse daraus extrahieren.

Sobald ein Geheimnis in einem Git-Repository gespeichert ist, können Angreiferinnen und Angreifer es über den Verlauf des Repositorys finden, auch wenn schon eine lange Zeit vergangen ist.

Sie sollten niemals Geheimnisse in Ihrem Quellcoderepository speichern, auch wenn das praktisch erscheint. Um dieses Problem zu vermeiden, können Sie automatische Tools verwenden, die Ihr Repository regelmäßig überprüfen und Warnungen senden, wenn irrtümlich gespeicherte Kennwörter oder Datenbank-URLs gefunden werden.

Verwenden von Umgebungsvariablen

Die einfachste Lösung zum Verwalten von Geheimnissen ist die Verwendung von Umgebungsvariablen. Sie haben mehrere Vorteile:

  • Sie sind einfach zu verwenden.
  • Sie funktionieren auf allen Systemen (auch auf lokalen Systemen).
  • Jeder kennt sie und weiß, wie sie funktionieren.

Sie sind jedoch nicht sicher genug: Alle Prozesse in Ihrem System können sie lesen, und sie können problemlos mithilfe von Java Management Extensions (JMX) auf einem Java-System offengelegt werden.

Daher werden Umgebungsvariablen häufig als erster Schritt auf dem Weg zu Zero Trust gesehen: Sie sind sicherer als das direkte Speichern von Geheimnissen im Quellcode, aber sie verfügen nicht über Verwaltungsfunktionen und sind für Angreifer*innen leicht zugänglich.

Verwenden von Kubernetes-Geheimnissen

Kubernetes-Geheimnisse sind eine weitere gute Lösung. Diese Geheimnisse können als Datei im Dateisystem der Anwendung geladen werden. Ein Java-Programm kann diese Datei dann beim Start lesen, um auf diese Geheimnisse zuzugreifen. Tools wie Spring Frameworks unterstützen diesen Mechanismus sogar standardmäßig, sodass diese Geheimnisse einfach und effizient verwendet werden können.

Dieser Mechanismus ist sicherer als Umgebungsvariablen, da diese Dateien nur von dem Prozess gelesen werden können, der sie benötigt. Sie profitieren auch vom vielfältigen Kubernetes-Ökosystem und können von verschiedenen Verwaltungstools verwaltet werden, einschließlich der Tools, die von Ihrem Cloudanbieter bereitgestellt werden.

Kubernetes-Geheimnisse sind zwar eine gute Lösung für Kubernetes, aber auch auf Kubernetes beschränkt und verfügen nicht über erweiterte Verwaltungsfunktionen, je nachdem, welche Tools zum Verwalten der Kubernetes-Infrastruktur verwendet werden.

Verwenden eines Geheimnisspeichers

Geheimnisspeicher wie Hashicorp Vault oder Azure Key Vault sind spezielle Software zum Verwalten von Geheimnissen. Sie bieten ein umfassendes Verwaltungssystem zum Autorisieren von Benutzer*innen, zum Rotieren von Sicherheitsschlüsseln und zur Überprüfung, welche Anwendung auf welches Geheimnis zugreifen kann.

Sie stellen auch eine externe API bereit, damit sie auf jedem System verwendet werden können. Beispielsweise können Sie Azure Key Vault für alle Azure-Dienste verwenden, einschließlich Virtual Machines, Azure App Services, Azure Kubernetes Services und Azure Spring Apps.

Ein Geheimnisspeicher ist die sicherste Lösung für die Verwaltung von Geheimnissen, erfordert jedoch die Verwendung eines dedizierten Tools.