2014-05-18 9 views
29

Ich habe kürzlich eine App bereitgestellt und einen internen Serverfehler wegen fehlender Produktion secret_key_base bekommen. Nach Stunden des Testens, konnte ich dieses Problem mit zwei Methoden lösen:Fehlende Produktion secret_key_base in Schienen

Methode 1:

ich ein neues secret_key mit rake secret und ersetzen sie durch <%= ENV["SECRET_KEY_BASE"] %> in secrets.yml erzeugt. Die App wurde erneut bereitgestellt und dieses Mal funktionierte es. Aber ich denke, dass diese Methode falsch ist.

Methode 2:

erzeugt ich eine neue secret_key mit rake secret und hinzugefügt, um es zu environments/production.rb wie config.secret_key_base = 'd1f4810e662acf46a33960e3aa5bd0************************, ohne secrets.yml zu Ändern (Standard ist production: <%= ENV["SECRET_KEY_BASE"] %>). Die App wurde erneut bereitgestellt und es funktioniert einwandfrei.

Meine Fragen:

  1. Welche Methode ist die beste?
  2. Wenn die 2. Methode korrekt ist, warum Rails erzeugt nicht standardmäßig eine secret_key_base in production.rb?
  3. Gibt es eine andere Methode, das zu tun?

Antwort

29

Ich habe endlich die corrent Methode gefunden. Keine der genannten Methoden ist die richtige.

richtige Methode:

Wir selbst sollten einen geheimen Schlüssel generieren (durch rake secret) dann eine Umgebungsvariablen für SECRET_KEY_BASE erstellen, indem Sie folgenden Befehl von Eingabeaufforderung:

rhc set-env SECRET_KEY_BASE=3dc8b0885b3043c0e38aa2e1dc64******************** -a myapp 

nach Ausführung dieses Befehls , verbinden Sie sich mit Ihrem Server über SSH und führen Sie env, so dass Sie Ihr SECRET_KEY_BASE in der Liste sehen sollten.

Jetzt starten Sie Ihre App rhc app-stop myapp und rhc app-start myapp, dann sind Sie gut zu gehen.

+0

Diese rhc-Methode kann nur verwendet werden, wenn Sie auf openshift.redhat.com hosten? –

+0

Sie können die entsprechende Methode für jeden Dienst in seinen Dokumenten finden. Zum Beispiel für Heroku können Sie diese Seite überprüfen: https://devcenter.heroku.com/articles/config-vars – user3631047

+0

Schließlich endete ich damit, ein Geheimnis auf meinem VPS zu harken und es in meine secrets.yml-Datei zu stecken. –

0

Methode 1 ist korrekt. Sie möchten Ihre Geheimnisse nicht im Code speichern.

+0

Warum nicht? Es beantwortet alle 3 Fragen: "Meine Fragen: Welche Methode ist die beste? Wenn die zweite Methode korrekt ist, warum Schienen nicht erzeugt eine secret_key_base in production.rb standardmäßig? Gibt es eine andere Methode, das zu tun? " Außerdem erklärt es warum. –

+0

Sie könnten, wenn Sie nicht den Code auf öffentlichen Repository oder wenn auf öffentlichen Repository, sollte es mit Gitignore –

+0

ignoriert werden. Selbst mit einem privaten Repository ist es ein Sicherheitsrisiko, Produktionsgeheimnisse in der Quellcodeverwaltung zu speichern. Nur die Produktionslaufzeitumgebung muss diese Geheimnisse "kennen", aber mit einem VCS gibt es jetzt zusätzliche Kopien auf allen Hosts, die einen Checkout/Klon des Repos haben, einschließlich Dev-Boxen, CI-Hosts usw. Dies macht es viel schwieriger schützen (oder verstehen) die wahre Expositionsfläche von Produktionsgeheimnissen. –

3

Wenn Sie auf einem normalen Ubuntu-Computer sind, setzen Sie einfach export SECRET_KEY_BASE=" <<< output from rake secret here >>> " in Ihre ~/.bashrc.

Führen Sie source ~/.bashrc aus und starten Sie die App neu.

2

Es gibt noch eine andere Option, die etwas sicherer sein sollte, nämlich die Apache/Nginx-Konfigurationsdatei hinzuzufügen. Ich bin mit Apache und haben gerade verwendet:

SetEnv SECRET_KEY_BASE my_secret

Dann einfach die Geheimnisse lassen.yml Datei auf: Produktion: <% = ENV [ „SECRET_KEY_BASE“]%>

Für einen Produktions Web-Server Ich bin nicht sicher, es gültig ist anzunehmen, dass eine .bashrc-Datei ausgeführt wird und Ihre ENV Variable erhalten Set, aber ich denke, dass dieser Weg es bestimmt ist. Ich bin nicht und Experte so bereit, irgendwelche Risiken oder Gründe zu haben, warum es keine gute Idee ist, auf mich hingewiesen.

Verwandte Themen