Geheimnisse aus der Quellcodeverwaltung heraushalten - verschieben wir nur das Problem?


10

Ich habe einige Projekte geerbt, in denen Geheimnisse in der Quellcodeverwaltung in App.config und ähnlichen Dateien waren. Glücklicherweise ist es kein öffentliches Repository, so dass das Risiko nicht so ernst ist, wie es hätte sein können. Ich suche nach besseren Möglichkeiten, dies zu verwalten, z. B. Azure KeyVault. (Aber ich beabsichtige nicht, dass diese Frage spezifisch für diese Lösung ist.)

Bewegen wir das Problem im Allgemeinen nicht einfach? Mit Azure KeyVault werden beispielsweise die App-ID und das App-Geheimnis zu den Dingen, die Sie benötigen, um die Quellcodeverwaltung zu umgehen. Hier ist ein leider typisches Beispiel dafür, wie dies dazu neigt, schief zu gehen. Andere Ansätze sind ähnlich, mit API-Schlüsseln oder Keystore-Dateien, die Sie schützen müssen.

Es scheint mir, dass Produkte wie Azure KeyVault nicht besser und sinnlos komplizierter sind, als Ihre Geheimnisse in einer separaten Konfigurationsdatei zu speichern und sicherzustellen, dass sie sich in Ihrem .gitignore oder einem gleichwertigen Dokument befinden. Diese Datei müsste nach Bedarf über einen Seitenkanal freigegeben werden. Natürlich werden sich die Leute wahrscheinlich unsicher gegenseitig eine E-Mail schicken ...

Gibt es eine Möglichkeit, Geheimnisse zu verwalten, die das Problem nicht nur lösen? Ich glaube, diese Frage hat eine einzige klar definierte Antwort. Wenn ich analog fragen würde, wie HTTPS das Problem nicht einfach verschiebt, wäre die Antwort, dass CA-Schlüssel mit Ihrem Betriebssystem verteilt werden, und wir vertrauen ihnen, weil wir der Verteilungsmethode des Betriebssystems vertrauen. (Ob wir sollten, ist eine separate Frage ...)

Antworten:


12

Sie könnten sagen, Sie bewegen nur das Problem. Letztendlich muss irgendwo ein Geheimnis gespeichert sein, auf das Ihre App Zugriff hat, um Passwörter, SSH-Schlüssel usw. zu haben.

Wenn Sie es jedoch richtig machen, verschieben Sie das Problem von einem Ort, der schwer ordnungsgemäß zu sichern ist, an einen Ort, den Sie besser schützen können. Zum Beispiel ist das Einfügen von Geheimnissen in ein öffentliches Github-Repo so ziemlich so, als würden Sie Ihre Hausschlüssel an Ihrer Haustür kleben lassen. Jeder, der sie will, wird keine Probleme haben, sie zu finden. Wenn Sie jedoch zu einem Schlüsselspeicher in einem internen Netzwerk ohne externe Konnektivität wechseln, haben Sie eine viel bessere Chance, Ihre Passwörter sicher zu halten. Das ist eher so, als würden Sie Ihre Schlüssel in der Tasche behalten. Es ist nicht unmöglich, sie zu verlieren (das entspricht beispielsweise der Ausgabe Ihres Azure-Kennworts), aber es schränkt Ihre Gefährdung ein, anstatt Ihre Schlüssel an Ihre Tür zu kleben.


4

Geheimnisse wie Verschlüsselungsschlüssel und Anmeldeinformationen sollten aus einigen Gründen nicht in die Quellcodeverwaltung eingecheckt werden. Das erste ist offensichtlich, dass Verschlüsselungsschlüssel und Anmeldeinformationen immer auf einer Wissensbasis sein sollten, und die Quellcodeverwaltung ist kein zuverlässiger Weg, um Informationen vor Offenlegung zu schützen. Der andere Grund, warum Sie solche Geheimnisse nicht in Ihrer Quellcodeverwaltung haben möchten, liegt normalerweise darin, dass Geheimnisse normalerweise (aber nicht immer) spezifisch für ein bestimmtes Attribut der Umgebung sind, in der Ihre Anwendung ausgeführt wird. (ZB Erwerb eines privaten Schlüssels zum Erstellen eines digitalen Schlüssels Signatur, die für eine Webdienstautorisierung erforderlich ist. Der spezifische Endpunkt dieses Webdienstes wird möglicherweise in einer QS-Umgebung ausgeführt, für die eine QS-Signatur erforderlich ist.

Der richtige Weg, eine Umgebung (oder ein globales Geheimnis) zu behandeln, besteht darin, sie wie jedes andere Umgebungskonfigurationsattribut zu behandeln, mit zusätzlichen Sicherheitskontrollen für eine gute Maßnahme. Ein gut gestaltetes, unabhängiges und versionierbares Codemodul sollte in allen Umgebungen identisch sein, sodass die Umgebung, in der sie bereitgestellt werden, die Anwendung über ihre Attribute informiert (z. B. Details zur Datenbankverbindung, Anmeldeinformationen, Webdienstendpunkte, Dateipfade usw.) Die für Ihre Anwendung entscheidenden Konfigurationsdetails werden externalisiert und zu Konfigurationsparametern Ihrer Umgebung.

Um nun einige Ihrer Argumente anzusprechen:

Bewegen wir das Problem im Allgemeinen nicht einfach?

Es gibt keine perfekte Sicherheit, aber das "Verschieben" des Problems in einen Bereich, in dem zusätzliche Maßnahmen und Kontrollen durchgeführt werden können, wird die Schwierigkeit verbessern und die Wahrscheinlichkeit einer versehentlichen oder böswilligen Offenlegung von Geheimnissen verringern. Eine gute Faustregel beim Entwurf eines Systems, bei dem vertrauliche Daten geschützt werden müssen, besteht darin, die Kontrollen immer zu zweit durchzuführen. Damit meine ich, dass für eine versehentliche oder böswillige Offenlegung vertraulicher Informationen oder Sicherheitsvorfälle ein Fehler oder zwei oder mehr Kontrollen erforderlich sind.

Ein gutes Beispiel hierfür ist das Speichern einer verschlüsselten Datei auf einem Server. Ich habe auch einen geheimen Entschlüsselungsschlüssel, den ich in einer anderen Datei vertraulich behandeln muss.

  • Speichern Sie den Schlüssel und die verschlüsselte Datei auf demselben Server (0 Steuerelemente, jeder, der Zugriff auf den Server hat, kann die vertraulichen Informationen trivial abrufen).
  • Führen Sie die obigen Schritte aus und schützen Sie den Dateizugriff auf beide Dateien, damit sie nur vom Anwendungsbenutzer zur Laufzeit des Betriebssystems gelesen werden können (1 Wenn Sie das Kennwort des Root-Benutzers oder des Anwendungsbenutzer zur Laufzeit kompromittieren, kann ein Angreifer vertrauliche Informationen abrufen.)
  • Speichern Sie den Schlüssel in einem externen Schlüsseldepot, und erwerben Sie den Schlüssel mit mehreren Sicherheitsmaßnahmen wie IP-Adress-Whitelist, Zertifikatauthentifizierung und anderen Maßnahmen für die Anwendung, die auf die verschlüsselte Datei in ihrem Dateisystem zugreifen kann. (Mehrere Kontrollen, mehrere Fehler bei Sicherheitskontrollen müssen auftreten, damit vertrauliche Daten gefährdet werden.)

Auch hier gibt es keine perfekte Sicherheit, aber das Ziel mehrerer Kontrollen stellt sicher, dass mehrere Fehler auftreten müssen, damit die Offenlegung erfolgt.

Es scheint mir, dass Produkte wie Azure KeyVault nicht besser und sinnlos komplizierter sind.

Kompliziert ja, sinnlos ist völlig subjektiv. Wir können nicht über die Sinnlosigkeit zusätzlicher Sicherheit diskutieren, ohne realistisch zu berücksichtigen, wie ernst es wäre, wenn vertrauliche Daten offengelegt würden. Wenn man die vertraulichen Daten verwenden könnte, um illegale Überweisungen von Ihrem Finanzinstitut zu senden, dann ist so etwas wie ein Schlüsseldepot ungefähr das weiteste, was es von sinnlosem geben würde.

als Ihre Geheimnisse in einer separaten Konfigurationsdatei zu speichern und sicherzustellen, dass sie sich in Ihrem .gitignore oder einem gleichwertigen Dokument befindet.

Bis jemand es versehentlich in die Quellcodeverwaltung eincheckt, ist das Geheimnis jetzt für immer in den Verlauf der Quellcodeverwaltung eingebettet.

Natürlich werden sich die Leute wahrscheinlich unsicher gegenseitig eine E-Mail schicken ...

Sicherheit ist nicht nur ein technisches Problem, sondern auch ein Problem der Menschen. Das wäre kein Thema, aber ich denke, an diesem Punkt versuchen Sie, sich davon abzubringen, das Notwendige zu tun.

Gibt es eine Möglichkeit, Geheimnisse zu verwalten, die das Problem nicht nur lösen? Ich glaube, diese Frage hat eine einzige klar definierte Antwort. Wenn ich analog fragen würde, wie HTTPS das Problem nicht einfach verschiebt, wäre die Antwort, dass CA-Schlüssel mit Ihrem Betriebssystem verteilt werden, und wir vertrauen ihnen, weil wir der Verteilungsmethode des Betriebssystems vertrauen.

Sicherheit lässt Probleme nicht immer verschwinden, die meiste Zeit werden sie kontrolliert. Ihre Analogie ist kurz und bündig, denn genau das macht die Kryptographie mit öffentlich-privaten Schlüsseln. Wir "verlagern das Problem" auf die Zertifizierungsstelle, indem wir uneingeschränktes und vollständiges Vertrauen in unsere Zertifizierungsstelle setzen, um für die Identität der Entität zu bürgen, die das öffentliche Zertifikat besitzt. Grundsätzlich müsste nichts weniger als eine katastrophale Reihe von Fehlern (z. B. Vertrauensverlust in die Zertifizierungsstelle) auftreten, um zu einem Sicherheitsproblem zu führen.

Wie bei vielen Dingen ist Sicherheit eine Grenze, die Sie anhand subjektiver Kriterien, der Art der Daten, der Folgen der Offenlegung, des Risikoappetits, des Budgets usw. ziehen müssen.


0

Es lohnt sich, ein git secretProjekt ( http://git-secret.io/ ) in Betracht zu ziehen, um geheime Dateien in Git Repo mit einem asymetrischen Schlüssel verschlüsselt zu halten. Öffentliche Schlüssel sind auch im Repo, private Schlüssel nicht.

Merkmale dieses Ansatzes sind:

  • Wenn ein neuer Benutzer / Computer gesicherte Dateien entschlüsseln muss, veröffentlicht er seinen öffentlichen gpg-Schlüssel (gnu privacy guard aka pgp). Der Benutzer, der bereits gesicherte Dateien entschlüsseln kann, kann sie mit einem neuen zusätzlichen Schlüssel erneut verschlüsseln. Danach kann der neue Benutzer gesicherte Dateien mit seinem privaten Schlüssel entschlüsseln.
  • Natürlich müssen Sie steuern, wer das Git-Repository festschreiben / pushen kann. Andernfalls kann der Angreifer seinen eigenen öffentlichen Schlüssel festschreiben und warten, bis eine autorisierte Person die gesicherten Dateien mit diesem neuen kompromittierten öffentlichen Schlüssel erneut verschlüsselt.
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.