web-dev-qa-db-ger.com

Separate secret_key_base in Rails 5.2?

Ich habe gerade ein Upgrade von 5.1 auf 5.2 durchgeführt und bin ziemlich verwirrt über diese "bessere" Methode, um Geheimnisse zu speichern ...

Vielleicht verstehe ich das nicht, aber es scheint, als wären Entwicklung und Produktion nun in einen SINGLE SECRET_KEY_BASE sowie master.key eingearbeitet.

Wenn nicht, wie verwende ich einen separaten Hauptschlüssel und SECRET_KEY_BASE in der Entwicklung?

Was ist, wenn mir Entwickler helfen, die nicht meinen Master-Schlüssel (oder meine Geheimnisse) kennen, die ich in der Produktion verwende?

8
Tallboy

Rails 5.2 hat das ein bisschen geändert. Für Entwicklungs- und Testumgebungen wird die secret_key_base automatisch generiert. Sie können sie also einfach aus secrets.yml entfernen oder wo immer Sie sie eingestellt haben.

Für die Produktion gibt es die Berechtigungsnachweisdatei, die Sie mit Rails credentials:edit erstellen und bearbeiten können. Dadurch wird auch der Hauptschlüssel in config/master.key erstellt, der nur zum Ver- und Entschlüsseln dieser Datei verwendet wird. Fügen Sie dies zu gitignore hinzu, damit es nicht an andere Personen weitergegeben wird, die sich darum kümmern sollten, es mit anderen Entwicklern zu teilen.

Wenn sich das alles etwas langweilig anhört und es sich anhört, können Sie es einfach ignorieren und die secret_key_base in ENV angeben. Rails prüft, ob es in ENV["SECRET_KEY_BASE"] vorhanden ist, bevor es sich beschwert. 

5
tomca32

Es gibt zwei Möglichkeiten, auf secret_key_base zuzugreifen:

  1. Rails.application.credentials.secret_key_base
  2. Rails.application.secrets.secret_key_base

Rails 5 hat den ersten Weg standardmäßig gewählt.

sie können Rails.application.credentials.secret_key_base durch Rails credentials:edit ändern. Denken Sie bei allen anderen Umgebungen daran, die Umgebungsvariable Rails_MASTER_KEY auf denselben Inhalt von config/master.key einzustellen. Der master.key wird standardmäßig ignoriert. Auf diese Weise wird für alle Umgebungen derselbe geheime Schlüssel verwendet. Wenn Sie andere Schlüssel verwenden möchten, müssen Sie Namespaces selbst steuern.

Wenn Sie den zweiten Weg Rails.application.secrets.secret_key_base bevorzugen. Sie müssen config/secrets.yml erstellen:

development:
  secret_key_base: ...
test:
  secret_key_base: ...
production:
  secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>

denken Sie daran, die Umgebungsvariable SECRET_KEY_BASE bei der Produktion festzulegen. Wenn die config/secrets.yml-Datei geheim genug ist, können Sie <%= ENV["SECRET_KEY_BASE"] %> in Klartext ändern.

rake secret kann einen zufälligen geheimen Schlüssel für Sie generieren.

Ich ziehe den zweiten Weg vor, wegen des einfachen.

4
Yi Feng Xie

Ich habe dieses Juwel verwendet, als ich den Produktionsmaster.key nicht mit meinen Freund-Entwicklern teilen wollte, was meiner Meinung nach genau das gleiche Ziel wie das OP ist.

https://github.com/sinsoku/Rails-env-credentials

Sie können einen Master-Schlüssel für jede Umgebung wie folgt verwenden, sodass Sie frei entscheiden können, welchen Schlüssel Sie mit welchen Entwicklern/Bereitstellern teilen möchten.

config/credentials-development.yml.enc
config/credentials-test.yml.enc
config/credentials.yml.enc
master-development.key
master-test.key
master.key

Jeder Schlüssel wird generiert, wenn Sie zum ersten Mal etwas ausführen:

Rails env_credentials: edit -e Entwicklung

Wenn Sie von einem master.key-Setup zu diesem wechseln, wird ein Fehler in Verbindung mit config/database.yml auftreten, in dem Rails versucht, alle Umgebungsinformationen auszuwerten, unabhängig davon, in welcher Umgebung Sie sich befinden. (Auch wenn Sie Kommentieren Sie sie aus, Rails versucht immer noch, die Erbteile zu bewerten.)

1
untidyhair