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.