Sollte der server/Datenbank-config-Dateien, einschließlich Kennwörter, gespeichert in source control?
Ich freue mich zu hören, einige best practices...
Unter der Annahme einer web-Anwendung für die Interaktion mit ein paar verschiedenen Produktions-Servern (Datenbanken, etc.)... sollte die Konfigurations-Dateien enthalten Datenbank-Passwörter gespeichert werden, die in der Quellcodeverwaltung (z.B. git, svn)?
Wenn nicht, was ist der beste Weg, um zu verfolgen server-Datenbank (oder andere Verwandte) Kennwörter, die Ihre Anwendung zugreifen muss, um?
Edit: Hinzugefügt ein Kopfgeld zu ermutigen, mehr Diskussion und zu hören, was Leute denken, die beste Praxis.
- Datenbank-Authentifizierung ist babyish. In einem secure lock-down, gibt es keine Notwendigkeit für DB-Passwort.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es nicht nur eine "silver bullet" Antwort hier, und es würde alles stark davon abhängen details.
Erste von allen, halte ich für die beste Praxis zu trennen, alle source Codes von der Konfiguration in separaten repository. Also, der Quellcode bleibt source code, aber die installation oder Bereitstellung (mit Konfiguration, Passwörter, etc) ist das was ganz anderes. Auf diese Weise werden Sie fest separaten Entwickler zu den Aufgaben von Systemadministratoren' Aufgaben können und letztlich bauen 2 verschiedene teams dabei, was Sie gut sind.
Wenn man getrennte source-code-repository + Bereitstellung repository am besten, als Nächstes Wetten, erwägt Optionen für die Bereitstellung. Am besten so wie ich das sehe ist hier, mithilfe der Bereitstellungs-Verfahren typisch für eine gewählte Betriebssystem (d.h. Gebäude der autonomen Pakete für eine gewählte OS die Art und Weise, dass OS die Betreuer tun).
Zum Beispiel, Red Hat-oder Debian-packaging-Verfahren bedeuten in der Regel greifen einen tarball von software von externen Seite (das wäre dann exportieren von Quellen aus Ihrem source-code VCS), Auspacken, zusammenstellen und vorbereiten der Pakete für die Bereitstellung bereit. Bereitstellung selbst sollte im Idealfall bedeuten, nur tun, eine schnelle & einfache Befehl, der die Pakete installieren, wie
rpm -U package.rpm
,dpkg --install package.deb
oderapt-get dist-upgrade
(gegeben, dass Ihr Paket gehen, um ein repository, in dem apt-get wäre in der Lage, Sie zu finden).Offensichtlich, um es zu bekommen auf diese Weise arbeiten, werden Sie zu liefern haben alle Konfigurations-Dateien für alle Komponenten einer Anlage in einem voll funktionsfähigen Zustand, inklusive aller Adressen und Anmeldeinformationen.
Bekommen, kurz, wir betrachten eine typische "kleine service" - situation: eine PHP-Anwendung bereitgestellt, über n Anwendungsservern mit apache /mod_php, Zugriff auf m MySQL-Server. Alle diese Server (oder virtuelle Container, das spielt eigentlich keine Rolle) befinden sich in einem geschützten privaten Netzwerk. Um dieses Beispiel zu vereinfachen, nehmen wir an, dass alle echten internet-Konnektivität wird angeführt von einem cluster von k http-Beschleuniger /reverse proxies (wie nginx /lighttpd /apache), die sehr leichte Konfiguration (nur interne IPs weiterleiten zu können).
Was haben wir mit Ihnen verbunden zu sein und voll arbeiten?
Beachten Sie, dass es 2 verschiedene "Arten" von Informationen hier: IPs/Hostnamen ist etwas fester, würden Sie wahrscheinlich wollen, weisen Sie Sie ein für alle mal. Anmeldungen & Passwörter (und sogar Datenbank-Namen), auf der anderen Seite, sind nur für connectivity-Zwecke hier - um sicherzustellen, dass für MySQL, dass es wirklich unsere PHP-Anwendung eine Verbindung zu es. Also, meine Empfehlungen hier wären-splitting-diese 2 "Arten":
Den letzten und schwierigsten Frage bleibt hier: erstellen von deployment packages? Es sind mehrere Techniken verfügbar, die 2 wichtigsten Arten sind:
Für ein Beispiel vor, ich würde erstellen Sie Pakete wie:
my-application-php
- das würde davon abhängen, mod_php, apache und würden generierten Datei wie/etc/my-php-application/config.inc.php
, die auch die MySQL-Datenbank IPs/Hostnamen und login /Passwort generiert, wiemd5(current source code revision + salt)
. Dieses Paket installiert werden würde, auf jeden n application Server. Idealerweise sollte es in der Lage sein, die Installation auf einem sauber installierten Betriebssystem und stellen Sie eine voll funktionsfähige Anwendung, die cluster-Knoten ohne manuelle Tätigkeit.my-application-mysql
- das würde davon abhängen, MySQL-server und umfassen würde, die post-install-Skript, dass:/etc/my-php-application/config.inc.php
mit md5-Algorithmus)Schließlich sollte es bringen, den nutzen eines Upgrades für Ihre Bereitstellung Verwendung von einfachen Befehl wie
generate-packages && ssh-all apt-get dist-upgrade
. Auch müssen Sie nicht speichern, inter-Anwendungen, die Passwörter überall und Sie regeneriert bei jedem update.Dieses relativ einfache Beispiel zeigt eine Menge von Methoden, die Sie einsetzen können, hier, aber, schließlich, es ' s bis zu Ihnen zu entscheiden, welche Lösung besser ist hier und das ist overkill. Wenn Sie weitere Informationen hier oder als eine separate Frage, ich werde gerne versuchen, in details zu erhalten.
Abgesehen von dem Punkt, dass Passwörter sollten nie im Klartext gespeichert überall (andere als jemand, der Schädel oder einem verschlossenen Gewölbe zugänglich nur für den CEO, CFO und CIO (und müssen alle drei Tasten auf einmal), speichern Sie alles in die source-control, die erforderlich ist, um bauen Ihr Produkt.
Das bedeutet, dass nicht nur Ihre Quelle, sondern auch die Spezifikationen für die Maschinen bauen, compiler-Optionen, Compiler selbst und so weiter.
Wenn wir einen Weg finden könnten, um zu überprüfen, die in die physische hardware, wir würden das auch tun 🙂
Alles, was reproduziert werden kann, die durch den build-Prozess selbst, oder etwas für läuft eher als der Aufbau der software (wie z.B. Ihre Passwörter) in der Regel nicht gehören, unter Kontrolle der Quellcodeverwaltung, aber einige Läden machen das für Ihre ausführbaren Dateien, generiert docs und so weiter, nur so, dass Sie schnell zu bekommen eine spezielle Version für die installation.
Passwörter sollten nicht gespeichert werden, in die Quellcodeverwaltung ein. An alle. Je. Sehen Wie Sie zu halten Geheimnisse geheim
Passwörter, Servernamen passiert, etc. sind Teil des deployment-Konfiguration erfolgt durch den server-administrator. Es ist wichtig zu dokumentieren, dieses Verfahren und legen Sie die dokumentierte Prozedur unter Kontrolle.
Alternativ können Sie die deployment-Konfiguration kann durchgeführt werden, indem ein Skript, dass die sysadmin-würde Sie ausführen, um die Konfiguration durchgeführt, und während der script-Ausführung, so fragt der sysadmin die erforderlichen Informationen zu geben. Wieder dieses Skript gehalten werden muss, um in der Versionskontrolle.
Alles andere, abgesehen von server-Konfigurations - muss werden in der Quellcodeverwaltung.
Speicherung der server-Konfiguration im source-control ist allgemein eine schlechte Idee, weil es wird in der Weise von Bereitstellungen und kann dazu führen, kleine Katastrophen (z.B. wenn jemand nicht bewusst ist, dass Ihre test-version, bereitgestellt von der Quelle Kontrolle ist die Kommunikation mit einem live-Dienst).
Immer diese Konfigurations-Dateien außerhalb des webroot-Verzeichnisses.
Vertrauenswürdige verbindungen kann eine option sein, so dass bekannte IP-Adressen eine Verbindung zu services durch Konfiguration des Dienstes..
Im Allgemeinen, ich Stimme mit paxdiablo: legen Sie alles, was Sie möglicherweise können, unter Kontrolle der Quellcodeverwaltung. Das schließt die Produktion von Konfigurationsdateien mit Datenbank-Anmeldeinformationen.
Denken Sie über die situation, wo der server abstürzt, werden die sicherungen erweisen sich schlecht, und Sie brauchen, um zu bekommen, dass der server wieder up. Ich denke, Sie und Ihren Kunden (oder Ihrem Chef) würde definitiv Zustimmen, dass alles, was benötigt wird, um die Bereitstellung der Website im source-control ist ein großes plus.
Wenn Sie bauen wollen, einfach einsetzbar Pakete von Ihren Quellen mit continuous integration (ein weiteres best-practice) haben Sie, um die Konfigurations-Dateien unter Quellcodeverwaltung.
Berücksichtigen, dass in den meisten Fällen die devs, dass mit source-control-Zugang keinen Zugriff auf die produktiv-Datenbank-server direkt. Die Produktion Passwörter sind nutzlos für Sie.
Wenn die falschen Leute Zugang zu Ihren Quellen, die Sie noch benötigen, Zugang zu den Produktions-server um den Schaden mit den Passwörtern. Also, wenn Sie Ihre Produktionsumgebung ordnungsgemäß geschützt, die security-Risiken von Passwörtern im source-control sind sehr begrenzt.
Ich denke, diese Frage ist mehr über die Informationen, die Eigenverantwortung, Vertrauen und Organisation. Sollten Sie sich Fragen, was Teil Ihres Unternehmens würden Sie Vertrauen, um halten Sie Ihre system-Passwörter sicher vor Offenlegung und Missbrauch?
Ich habe in Organisationen, in denen Sie gehalten wurden durch die Verantwortlichen für das business. In anderen haben Sie delegiert wurde, an das operations-team, das auch im Besitz der Prozesse rund um die Erstellung und Nutzung usw.
Das wichtigste ist, dass es klar definiert ist, die in Ihrer Organisation, die Zugriff auf system-Passwörter. Danach können Sie entscheiden, auf entsprechende technische Lösungen für den Schutz der Passwörter.
Nicht. Produktion Passwort sollte so konfiguriert werden direkt auf dem server. Erstellen Sie eine deployment-Anweisungen für das deployment team/person zu ändern, der rechten properties-Datei während der Bereitstellung.
In meinem Subversion-repos für die PHP-Konfigurations-Dateien, die enthalten Passwörter werden überprüft, in wie
config.php.sample
mit hinweisen auf das, was bereitgestellt werden muss und Skripte angewiesen erfordern eineconfig.php
an der gleichen Stelle.Repository konfiguriert ist, zu ignorieren
config.php
für das Verzeichnis zu vermeiden, "zufälligen", fügt oder check-ins.Beispiel-Konfigurationen-Datei, sicher, ich würde Sie unter Versionskontrolle. Aber in der Regel nicht mit realworld access-Daten wie server-Adressen oder Passwörter. Mehr somethinglike
Probleme mit Passwörtern im Quellcode:
Was ich gefunden habe funktioniert am besten mit einem config überprüft, die verwendet Mischung sane defaults und Platzhalter für die Bereitstellung bestimmter Daten. Unsere apps immer nach einem system-config die es erlaubt das überschreiben von Variablen. Dies ermöglicht die Herstellung der Maschine zu haben, eine config-geeignet für es-Bereitstellung.
Hinweis: Wenn ich die Funktion als admin-ich Schaffe es immer configs getrennt von code (aus gutem Grund).
Ich würde immer ausschließen vital config-Dateien durch, die Passwörter oder andere Zugangsdaten (etwa für Datenbanken), es ist eine Reine best-practice. Plus auf der Oberseite der source - und version-control dient in der Regel mehr als einen Benutzer, und nicht alle von Ihnen arbeiten mit der gleichen Datenbank-Daten oder sogar mit dem gleichen server config (domains etc) und zu diesem Zweck die config-Dateien sollten bleiben ausgeschlossen fromt er ganze Menge.
Ohne eine richtige build-Prozess, ich bin mit dieser Strategie (für PHP-apps):
/etc/companyname
In es, Platz zwei Dateien:
Machen beide Dateien lesbar nur durch Ihre PHP-Prozess
Nun Ihre app config-Datei wird so etwas wie:
In diesem Ort, die Umgebung definiert die Anmeldeinformationen verwendet, und Sie können verschieben von code zwischen vorkonfigurierte Umgebungen (und die Kontrolle über einige Optionen, mit
$env
). Dies, natürlich, kann man mit server-Umgebungs-Variablen, aber das a) ist einfacher, um das setup und b) nicht aussetzen Anmeldeinformationen zu jedem Skript auf dem server (wird nicht zeigen, bis in eine streunende debugging-junk wiephpinfo()
).Für das Lesen zu vereinfachen, die außerhalb von PHP können Sie den credential-Dateien, JSON-oder etwas, und nur die kleinen Leistungseinbruch (APC wird nicht cache lassen).
Bevorzuge ich eine local_settings - Datei neben dem Haupt - Einstellungen - Datei. Diese local_settings sollte nicht zum repository Hinzugefügt werden, aber ich will hinzufügen, einen Probe.local_setting dem repository, zeigen die Struktur dieser Datei.
In der Laufzeit, wenn ein local_settings vorhanden ist, deren Werte überschreiben die Werte, die der Haupt-Einstellungen-Datei.
Zum Beispiel in python:
settings.py:
local_settings.py: