Wie geht man mit sensiblen Daten um, wenn man Github und Heroku verwendet?

49

Ich bin noch nicht mit der Arbeitsweise von Git vertraut (und frage mich, ob jemand außer Linus ist;)).

Wenn Sie Heroku zum Hosten Ihrer Anwendung verwenden, müssen Sie Ihren Code in einem Git-Repo überprüfen lassen. Wenn Sie an einem Open-Source-Projekt arbeiten, werden Sie dieses Repo mit größerer Wahrscheinlichkeit auf Github oder anderen Git-Hosts freigeben.

Einige Dinge sollten nicht im öffentlichen Repo überprüft werden; Datenbankkennwörter, API-Schlüssel, Zertifikate usw. Diese Dinge müssen jedoch immer noch Teil des Git-Repos sein, da Sie damit Ihren Code an Heroku senden.

Wie arbeite ich mit diesem Anwendungsfall?

Hinweis: Ich weiß, dass Heroku oder PHPFog Servervariablen verwenden können, um dieses Problem zu umgehen. Meine Frage ist mehr darüber, wie man Teile des Codes "versteckt".

Jonas
quelle
3
Ich würde mit einem privaten Repo beginnen. Je nachdem, wie sehr ich dem vertraue, kann ich dann meine Konfigurationsdateien, die die vertraulichen Daten enthalten, als .gitignore speichern und nur lokal versionieren. (Lokal ist ein nicht externer zentraler Ort, der ein Server im Haus sein kann oder wer weiß)
Rig

Antworten:

30

Die bevorzugte Methode, Passwörter / API-Schlüssel in Heroku geheim zu halten, besteht darin, Konfigurationswerte über die Heroku-Befehlszeilenanwendung festzulegen. Das folgende Beispiel stammt aus einem Artikel in der Heroku-Entwicklungsabteilung

(Das folgende Beispiel und meine gesamte Antwort beziehen sich auf Rails-Apps.)

$ cd myapp
$ heroku config:add S3_KEY=8N029N81 S3_SECRET=9s83109d3+583493190
Adding config vars and restarting myapp... done, v14
S3_KEY:     8N029N81
S3_SECRET:  9s83109d3+583493190

Verweisen Sie dann mit der Variablen ENV [] auf diese Konfigurationswerte in Ihrem Code

AWS::S3::Base.establish_connection!(
  :access_key_id     => ENV['S3_KEY'],
  :secret_access_key => ENV['S3_SECRET']
)

Auf diese Weise werden Ihre sensiblen Passwörter nicht im Git-Repository gespeichert. (Hinweis: Wenn Sie die App lokal ausführen, legen Sie diese Werte in Ihrer .bashrcDatei fest

Ich bin mir auch nicht sicher, welche Art von Anwendung Sie ausführen, aber in Rails verwendet heroku nicht Ihre database.yml-Datei, sondern legt einfach Ihren Datenbank-Benutzernamen / Ihr Kennwort gemäß Ihren App-Einstellungen fest. So können Sie vermeiden, diese Anmeldeinformationen in Git zu speichern

Wenn Sie eine eigene Anwendung ausführen und diese privat bleiben möchten, ist bitbucket eine großartige Alternative zu github, die kostenlose private Repositorys bietet.

Mike Vormwald
quelle
17

Mehrere Ideen ... Die Kryptographie mit öffentlichen Schlüsseln ist die flexibelste Antwort.

Verschleierung (nur für Code)

Können Sie die Teile des Codes, die Sie ausblenden möchten, in ein anderes Projekt einfügen, kompilieren und nur den kompilierten Code und nicht den Quellcode einchecken? Dies ist keine Verschlüsselung und nicht zum Verschlüsseln von Passwörtern oder Schlüsseln geeignet. Die Leute können Ihren kompilierten Code immer noch zurückentwickeln, aber sie bekommen nicht die Quelle.

Privates GIT-Repository

Muss es ein öffentliches Git-Repository sein?

Serverspeicher

Können Sie diese Informationen in einer geschützten Datei im Home-Verzeichnis des Benutzerkontos speichern, unter dem die Anwendung ausgeführt wird? Ich würde die Vorgehensweise von ssh mit ~ / .ssh / id_rsa und einem chmod von 600 kopieren. Andernfalls könnte eine Umgebungsvariable verwendet werden. Sie müssen irgendwo auf dem Server einen Schlüssel speichern, sonst können Sie nichts schützen.

Symmetrische Kryptographie (nur für Sie)

Wenn Sie der einzige Entwickler sind, können Sie einen Schlüssel auf den Server legen und denselben Schlüssel auf Ihrem Computer haben und ein symmetrisches Verschlüsselungsschema verwenden, um einige Daten wie ein Kennwort oder ein Zertifikat zu schützen. Das Teilen eines symmetrischen Schlüssels mit Freunden wird chaotisch.

Asymmetrische Kryptographie (für mehrere Entwickler)

Wenn andere Entwickler geheime Dinge in ein öffentliches Git-Repository einchecken müssen, wurde für diese Art von Dingen eine Kryptografie mit öffentlichem Schlüssel / privatem Schlüssel (asymmetrisch) erstellt. Installieren Sie einen privaten Schlüssel auf Ihrem Server (checken Sie ihn nicht in die Quellcodeverwaltung ein!) Und generieren Sie daraus einen öffentlichen Schlüssel. Verschlüsseln Sie Ihre geheimen Daten mit dem öffentlichen Schlüssel des Servers. Nur der Server kann diese Daten mit seinem privaten Schlüssel entschlüsseln. Sie können den öffentlichen Schlüssel sogar in die Quellcodeverwaltung einchecken, sodass andere Personen Daten mit demselben öffentlichen Schlüssel verschlüsseln können und nur der Server sie entschlüsseln kann.

Werkzeug

Openssl ist wahrscheinlich das einzige Kryptografietool, das Sie jemals benötigen werden. Schreiben Sie nicht Ihren eigenen Kryptografiealgorithmus oder Ihre eigene Implementierung eines veröffentlichten Algorithmus.

Gedanken schließen

Wenn der "Server" ein Webserver ist, der https verwendet, sollten Sie bereits einen sicheren Schlüsselspeicher auf dem Server haben, in dem der private Schlüssel gespeichert wird diese. Vielleicht haben sie ein paar Tipps, wie andere die Herausforderung lösen, vor der Sie stehen?

GlenPeterson
quelle
Um hinzuzufügen, WRT zum serverseitigen Speicher - Ich weiß nicht, ob Sie dies mit Heroku tun können, aber ich habe Setups gesehen, bei denen ein Skript vom Post-Receive-Hook und / oder so etwas wie Capistrano auf dem Deployment-Server abgefeuert wird Kopieren Sie die Bereitstellungsdatenbankdatei an den richtigen Speicherort. Auf diese Weise können Sie die Datenbankdatei vollständig aus dem Repository entfernen und automatisch sicherstellen, dass diese Informationen noch vorhanden sind.
Shauna
Auch private GIT-Repos sollten sensible Daten schützen. Nur für den Fall, dass es versehentlich für eine Weile an die Öffentlichkeit geht. Ich denke auch, dass asymmetrische Krypto immer verwendet werden sollte, anstatt symmetrisch. Ich sehe keinen Nachteil, nur diesen: Sie können APIs sogar irgendwo belassen, um die Verschlüsselung neuer sensibler, fest zu codierender Daten zu vereinfachen.
Tiberiu-Ionuț Stan
7

Wenn du deinen Code auf Heroku ausführen willst, musst du ihn ihnen geben - du kannst ihn nicht vor deinem Hosting-Provider "geheim" halten.

In Bezug auf öffentliche Git-Repositorys müssten Sie zum Zweck der Bereitstellung einen privaten Zweig Ihres Projekts pflegen, wenn Ihr Projekt Open Source ist, Sie jedoch keine Hosting-Details freigeben möchten.

Richard Nichols
quelle
1
Danke, aber wie sieht der Workflow dafür aus?
Jonas
6

Sie sollten keine Teile des Codes verstecken. Die Sicherheit Ihres Systems sollte nicht von der Geheimhaltung des Codes abhängen. Das ist als "Sicherheit durch Dunkelheit" bekannt, was von Sicherheitsexperten verpönt wird, weil es sehr schlecht funktioniert.

Stattdessen sollten Passwörter, Kryptoschlüssel usw. vom Code getrennt werden. Speichern Sie sie in einer separaten Konfigurationsdatei oder einem separaten Konfigurationswert, der vom Code gelesen wird. Sie müssen sie nicht in Git aufbewahren.

Wichtig: Codieren Sie niemals kryptografische Schlüssel, Passwörter oder andere Geheimnisse in Ihrem Quellcode fest! Das ist eine sehr schlechte Praxis.

Siehe auch:

Plug: IT Security.SE ist ein großartiger Ort, um Fragen zur Sicherheit zu stellen!

DW
quelle