Was ist die Verwendung von secret_key_base in Schienen 4

77

Ich bin neu in Rails 4 und verstehe die Verwendung von secret_key_baseunder config/secrets.ymlin Rails 4 nicht. Können Sie dieses Konzept bitte erläutern?

Auch, wenn ich in der Produktionsumgebung arbeite, bin ich aufgefordert , die setzen secret_keymit devise.rb, config.secret_keyund secret_key_base. Mit dem rake secretBefehl kann ich jedoch ein neues Geheimnis generieren .

Was ist der Unterschied zwischen Entwicklungs- und Produktionsumgebungen?

Wie secret_keystimmt es mit dem neu generierten überein, wenn ich es bei secret_key_basejedem Generieren hinzufüge ?

Wie wird die Anwendung mit anderen Servern gesichert?

Mani David
quelle
4
Für Leser, die Ruby on Rails 5.2 oder höher verwenden. secret_key_basewird weiterhin verwendet, aber config/credentials.yml.encstattdessen gespeichert . Diese Datei ist verschlüsselt. Weitere Informationen zum neuen Anmeldeinformationssystem finden Sie hier oder führen Sie es aus rails credentials:help.
3limin4t0r

Antworten:

65

Der secret_token.rbInhalt der Datei enthält eine lange, zufällige Zeichenfolge, mit der die Integrität signierter Cookies überprüft wird (z. B. Benutzersitzungen, wenn Personen in Ihrer Web-App angemeldet sind).

Die Dokumentation sagt:

Verwenden Sie Ihre vorhandene secret_key_base aus dem secret_token.rbInitialisierer, um die Umgebungsvariable SECRET_KEY_BASE für alle Benutzer festzulegen, die die Rails-App im Produktionsmodus ausführen. Alternativ können Sie einfach die vorhandene secret_key_base vom secret_token.rbInitialisierer in die Datei secret.yml im Produktionsabschnitt kopieren und ersetzen <%= ENV["SECRET_KEY_BASE"] %>.

Da es sich um eine wichtige Datei handelt und Sie sie nicht in .gitignore ablegen können, wird empfohlen, die env-Variable zum Speichern des secret_key_baseWerts zu verwenden:

erstellen .envoder .powenvarchivieren und speichern als:

export SECRET_TOKEN="9489b3eee4eccf317ed77407553e8adc97baca7c74dc7ee33cd93e4c8b69477eea66eaedeb18af0be2679887c7c69c0a28c0fded0a71ea472a8c4laalal19cb"

Und dann rein config/initializers/secret_token.rb

YourAppName::Application.config.secret_key_base = if Rails.env.development? or Rails.env.test? # generate simple key for test and development environments
  ('a' * 30) # should be at least 30 chars long
else
  ENV['SECRET_TOKEN']
end

Dieser Artikel ist (ein bisschen alt und) lang, aber voller nützlicher Informationen zum Thema.


UPDATE 04.05.15

Ab Rails 4.2 gibt es keine secret_token.rbDatei mehr . Nach neuer Konvention gibt es eine config/secrets.ymlDatei, in der die Geheimnisse der Anwendung gespeichert werden sollen.

Lesen Sie, wie Sie eine vorhandene App entsprechend den Innovationen auf 4.2.x aktualisieren können.


Technisch gesehen besteht der Zweck secrect_key_basedarin, die geheime Eingabe für die key_generatorMethode der Anwendung zu sein (Prüfung Rails.application.key_generator).

Die Anwendung ist key_generator, und somit secret_key_baseverwendet werden, um drei Kerne innerhalb des Rails - Framework verfügen über :

  • Ableiten von Schlüsseln für verschlüsselte Cookies, auf die über zugegriffen werden kann cookies.encrypted.
  • Ableiten des Schlüssels für von HMAC signierte Cookies, auf die über zugegriffen werden kann cookies.signed.
  • Ableiten von Schlüsseln für alle benannten message_verifierInstanzen der Anwendung .

Weitere Informationen zu den drei Themen finden Sie im Artikel von @michaeljcoyne .

Andrey Deineko
quelle
Hinweis: Wenn Sie für die Bereitstellung etwas wie Ansible oder ähnliches verwenden, können Sie die gesamte secret.yml während der Produktionsbereitstellung und gitignore ersetzen, config/secret.ymlwenn Sie dies bevorzugen.
Kris
Tatsächlich wird config / Secrets.yml seit Rails 4.1
Fumisky Wells
All dies bedeutet secret_key_base, dass Ihre Benutzer beim Ändern abgemeldet werden. Wenigstens.
X-Yuri
24

secret_key_base wird zum Verschlüsseln und Signieren der Sitzung verwendet

um die Sitzung sicher in Cookies hin und her zu senden


In Schienen 4 ,

  1. wenn Ihre App aufgerufen wird Hello, und
  2. Sie setzen session['a'] = 'b',

Ihr Cookie sieht ungefähr so ​​aus:

_Hello_session=BAh7B0kiD3%3D%3D--dc40a55cd52fe32bb3b84ae0608956dfb5824689

was übersetzt in:

_Hello_session=<encrypted a=b>--<digital signature>

Cookies werden vom Server gesetzt und clientseitig gespeichert. Der Browser sendet gesetzte Cookies jedes Mal erneut an den Server, wenn wir eine Seite anfordern.

Um zu verhindern, dass böse Menschen a=bZeichenfolgen verstehen , werden diese verschlüsselt .
Um zu verhindern, dass böse Menschen Cookies manipulieren, wird eine digitale Signatur verwendet.

In beiden Fällen wird der Wert secret_key_base verwendet (um a = b zu verschlüsseln / zu entschlüsseln und die digitale Signatur zu validieren).

Seen sind
quelle
1. Wie ich weiß, werden Sitzungsdaten auf dem Server gespeichert und es gibt eine Sitzungs-ID im Cookie. z.B. Speichern Sie die Benutzer-ID in einer Sitzung. Die einzige Sitzungs-ID kann vom Browser angezeigt werden, während der Server nach der Anmeldung weiß, welcher Benutzer die Anforderung per Sitzungs-ID sendet. Hier sagen Sie, dass session ['a'] = 'b' die Daten im Cookie verschlüsselt. Ich bin mir nicht sicher, ob Sie zwischen Sitzung und Cookie verwechselt werden. 2. Wie kann ein Browser es entschlüsseln, ohne die secret_key_base zu kennen und die Informationen zu erhalten?
Damon Yuan
3
Entschuldigung, jetzt weiß ich, dass Rails eine Cookie-basierte Sitzung verwendet, was bedeutet, dass die Sitzungsinformationen in Cookies gespeichert sind.
Damon Yuan
Ja, das ist richtig. Cookie-basierte Sitzungen bieten Portabilität für Sitzungen auf verteilten App-Servern und Geschwindigkeit
hammady