In den Devops-Richtlinien unter https://12factor.net/config wird vorgeschlagen , Website-Geheimnisse (Datenbankkennwörter, API-Schlüssel usw.) in Umgebungsvariablen abzulegen. Welche Vorteile hat das, anstatt Textdateien (JSON, XML, YAML, INI oder ähnliches) zu verwenden, die von der Versionskontrolle ignoriert werden?
Ich finde es viel einfacher, eine Konfigurationsdatei mit Geheimnissen zu kopieren, als Umgebungsvariablen in der Konfiguration .bash_profile und webserver zu handhaben. Vermisse ich etwas
web-server
configuration
website
environment-variables
Aidas Bendoraitis
quelle
quelle
Antworten:
Der Autor listet ihre Argumentation auf, obwohl es ein bisschen unzusammenhängend ist. Das Hauptargument ist, dass es leicht ist, eine Konfigurationsdatei versehentlich einzuchecken, und dass Konfigurationsdateien unterschiedliche Formate haben und über das System verstreut sind (alle drei sind bestenfalls mittelmäßige Argumente für sicherheitsbezogene Konfigurationen wie Authentifizierungstoken und Anmeldeinformationen).
Nach meiner eigenen Erfahrung haben Sie im Wesentlichen die folgenden drei Optionen mit den damit verbundenen Vor- und Nachteilen:
Speichern Sie die Daten in Konfigurationsdateien.
Wenn Sie diesen Ansatz wählen, sollten Sie sie idealerweise vom Repository selbst isolieren und sicherstellen, dass sie sich außerhalb des Bereichs befinden, in dem die App ihren Inhalt speichert.
Vorteile:
Nachteile:
Speichern Sie die Daten in Umgebungsvariablen.
In der Regel wird dazu eine Liste von Umgebungsvariablen und -werten aus dem Startskript bezogen, in einigen Fällen werden sie jedoch möglicherweise nur in der Befehlszeile vor dem Programmnamen angegeben.
Vorteile:
Nachteile
hidepid
Mount-Option/proc
unter LInux), sind jedoch standardmäßig nicht aktiviert und schützen nicht vor Angriffen des Benutzers, dem der Prozess gehört.Verwenden Sie Befehlszeilenargumente, um die Daten zu übergeben.
Im Ernst, vermeiden Sie dies um jeden Preis, es ist nicht sicher und es ist ein Ärgernis, es beizubehalten.
Vorteile:
Nachteile:
quelle
Umgebungsvariablen werden von jedem untergeordneten Prozess des Webservers geerbt. Das ist jede Sitzung, die eine Verbindung zum Server herstellt, und jedes von ihnen erzeugte Programm. Die Geheimnisse werden all diesen Prozessen automatisch enthüllt.
Wenn Sie Geheimnisse in Textdateien aufbewahren, müssen diese für den Serverprozess und möglicherweise auch für jeden untergeordneten Prozess lesbar sein. Aber zumindest müssen die Programme gehen und sie finden; Sie werden nicht automatisch bereitgestellt. Möglicherweise können Sie auch einige untergeordnete Prozesse unter verschiedenen Konten ausführen und die Geheimnisse nur für diese Konten lesbar machen. Zum Beispiel macht suEXEC dies in Apache.
quelle
MYVAR=foo /path/to/some/executable
) die Weitergabe auf einen Prozess und dessen untergeordnete Elemente - und bei Bedarf können Master-Daemons scrubben / zurücksetzen / ändern die Umgebung der Kindprozesse.Auch wenn es einige sicherheitsrelevante Kompromisse bei Umgebungsvariablen oder -dateien gibt, glaube ich nicht, dass die Sicherheit die Hauptantriebskraft für diese Empfehlung war. Denken Sie daran, dass die Autoren von 12factor.net auch (oder waren auch?) Entwickler des Heroku PaaS sind. Die Verwendung von Umgebungsvariablen für jedermann hat ihre Entwicklung wahrscheinlich erheblich vereinfacht. Es gibt so viele verschiedene Konfigurationsdateiformate und -speicherorte, dass es für sie schwierig gewesen wäre, sie alle zu unterstützen. Umgebungsvariablen sind im Vergleich einfach.
Es braucht nicht viel Vorstellungskraft, um einige der geführten Gespräche zu erraten.
1 : Quelle: erfunden.
quelle
TL; DR
Es gibt eine Reihe von Gründen, Umgebungsvariablen anstelle von Konfigurationsdateien zu verwenden. Zwei der häufigsten Gründe, die übersehen werden müssen, sind der Nutzwert der Out-of-Band-Konfiguration und die verbesserte Trennung zwischen Servern, Anwendungen oder Organisationsrollen. Anstatt eine erschöpfende Liste aller möglichen Gründe vorzulegen, spreche ich in meiner Antwort nur diese beiden Themen an und gehe leicht auf deren Auswirkungen auf die Sicherheit ein.
Out-of-Band-Konfiguration: Geheimnisse vom Quellcode trennen
Wenn Sie alle Ihre Geheimnisse in einer Konfigurationsdatei speichern, müssen Sie diese Geheimnisse auf jeden Server verteilen. Dies bedeutet entweder, dass Sie die Geheimnisse zusammen mit Ihrem Code in die Revisionskontrolle einchecken oder dass Sie ein völlig separates Repository oder einen separaten Verteilungsmechanismus für die Geheimnisse haben.
Das Verschlüsseln Ihrer Geheimnisse hilft dabei nicht wirklich. Alles, was Sie tun müssen, ist, das Problem zu entfernen, denn jetzt müssen Sie sich auch um die Schlüsselverwaltung und -verteilung kümmern!
Kurz gesagt, Umgebungsvariablen sind ein Ansatz zum Verschieben von Daten pro Server oder pro Anwendung aus dem Quellcode, wenn Sie die Entwicklung von den Vorgängen trennen möchten. Dies ist besonders wichtig, wenn Sie Quellcode veröffentlicht haben!
Verbesserung der Trennung: Server, Anwendungen und Rollen
Während Sie sicherlich eine Konfigurationsdatei für Ihre Geheimnisse haben könnten, haben Sie ein Spezifitätsproblem, wenn Sie die Geheimnisse im Quellcode speichern. Haben Sie für jeden Satz von Geheimnissen eine eigene Filiale oder ein eigenes Repository? Wie stellen Sie sicher, dass die richtigen Geheimnisse zu den richtigen Servern gelangen? Oder verringern Sie die Sicherheit, indem Sie "Geheimnisse" haben, die überall gleich sind (oder überall lesbar sind, wenn Sie alle in einer Datei haben) und daher ein größeres Risiko darstellen, wenn die Sicherheitskontrollen eines Systems ausfallen?
Wenn Sie auf jedem Server oder für jede Anwendung eindeutige Geheimnisse haben möchten, müssen Sie mit Umgebungsvariablen nicht mehr eine Vielzahl von Dateien verwalten. Wenn Sie einen neuen Server, eine neue Anwendung oder eine neue Rolle hinzufügen, müssen Sie keine neuen Dateien erstellen oder alte aktualisieren. Sie aktualisieren lediglich die Umgebung des betreffenden Systems.
Abschiedsgedanken zur Sicherheit
Obwohl eine gründliche Untersuchung der Kernel-, Speicher- und Dateisicherheit für diese Antwort nicht in Frage kommt, sollte darauf hingewiesen werden, dass ordnungsgemäß implementierte Umgebungsvariablen pro System nicht weniger sicher sind als "verschlüsselte" Geheimnisse. In beiden Fällen muss das Zielsystem das entschlüsselte Geheimnis noch irgendwann im Speicher halten, um es verwenden zu können.
Es ist auch erwähnenswert, dass es keine Datei auf der Festplatte gibt, die kopiert und offline angegriffen werden kann, wenn Werte in einem flüchtigen Speicher eines bestimmten Knotens gespeichert sind. Dies wird im Allgemeinen als Vorteil für In-Memory-Geheimnisse angesehen, ist aber sicherlich nicht schlüssig.
Bei der Frage der Umgebungsvariablen im Vergleich zu anderen Geheimhaltungs-Management-Techniken geht es mehr um Kompromisse zwischen Sicherheit und Benutzerfreundlichkeit als um absolute Werte. Ihr Kilometerstand kann variieren.
quelle
Persönlich würde ich nicht empfehlen, Umgebungsvariablen in zu setzen
.bashrc
da diese für alle von der Shell gestarteten Prozesse sichtbar werden. Sie sollten jedoch auf Dämon- / Supervisor-Ebene (Init / RC-Skript, Systemd-Konfiguration) festgelegt werden, damit ihr Umfang auf den erforderlichen Bereich beschränkt wird .Wenn separate Teams Vorgänge verwalten, bieten Umgebungsvariablen eine einfache Schnittstelle für Vorgänge zum Festlegen der Umgebung für die Anwendung, ohne die Konfigurationsdateien / -formate kennen zu müssen und / oder auf das Verwerfen ihres Inhalts zurückzugreifen. Dies gilt insbesondere für Einstellungen in mehreren Sprachen und mit mehreren Frameworks, bei denen die Betriebsteams das Bereitstellungssystem (Betriebssystem, Supervisor-Prozesse) basierend auf den betrieblichen Anforderungen (einfache Bereitstellung, Skalierbarkeit, Sicherheit usw.) auswählen können.
Eine weitere Überlegung betrifft CI / CD-Pipelines - da der Code verschiedene Umgebungen durchläuft(z. B. dev, test / qa, Staging, Produktion) Die Angaben zur Umgebung (Bereitstellungszonen, Angaben zur Datenbankverbindung, Anmeldeinformationen, IP-Adressen, Domänennamen usw.) werden am besten von dedizierten Konfigurationsverwaltungstools / -frameworks festgelegt und von der Anwendung verwendet Prozesse aus der Umgebung (in einem DRY, einmal schreiben, überall ausführen). In der Regel checken Entwickler Konfigurationsdateien oder -vorlagen neben Code ein, wenn sich die betrieblichen Anforderungen ändern (z. B. neue Umgebungen / Bereitstellungen / Standorte, Skalierbarkeit / Sicherheit) wiegen sie herein,
Für die Produktion favorisieren Einstellung ich die Anwendung env-Vars in einem EnvironmentFile wie ,
/etc/default/myapplication.conf
dass nur durch das Konfigurationsmanagement und setzen lesbar eingesetzt wird ,root
so dasssystemd
(oder irgendetwas anderes für diese Angelegenheit) kann die Anwendung unter einem dedizierten laichen Deprivileged Systembenutzer in einem privaten Gruppe . Unterstützt mit dedizierten Benutzergruppen fürops
undsudo
- Diese Dateien sind standardmäßig nicht weltweit lesbar. Dies ist 12-Faktor-konform und unterstützt alle Vorteile von Dev + Ops sowie alle Vorteile angemessener Sicherheit, während Entwickler / Tester ihre eigenen EnvironmentFiles in den Umgebungen dev / qa / test ablegen können.quelle
Aus Entwicklersicht vereinfacht das Speichern von Konfigurationsdaten in Umgebungsvariablen die Bereitstellung in verschiedenen Umgebungen - Entwicklung, Qualitätssicherung und Produktion - und macht es Entwicklern leichter, sich Gedanken über die Bereitstellung der falschen Konfigurationsdatei zu machen.
Azure-Webanwendungen bieten die Möglichkeit, dieses Muster zu verwenden, und es funktioniert sehr gut.
Darüber hinaus werden potenziell sensible Daten außerhalb der Quellcodeverwaltung gehalten. Das Ignorieren dieser Dateien aus der Quellcodeverwaltung ist (zumindest in .NET) nicht wirklich machbar, da in diesen Dateien auch eine Menge der erforderlichen Boilerplate-Konfiguration vorhanden ist.
quelle