web-dev-qa-db-fra.com

Quelle est l’utilisation de secret_key_base dans Rails 4

Je suis nouveau sur Rails 4 et ne comprends pas l'utilisation de secret_key_base en dessous de config/secrets.yml in Rails 4. Pouvez-vous s'il vous plaît expliquer ce concept?

De plus, lorsque je travaille dans un environnement de production, je suis invité à définir le secret_key avec devise.rb, config.secret_key, et secret_key_base. Cependant, je peux générer un nouveau secret en utilisant le rake secret commande.

Quelle est la différence entre les environnements de développement et de production?

Comment correspond-il au secret_key quand je l’ajoute avec secret_key_base chaque fois que je génère?

Comment sécurise-t-il l'application avec d'autres serveurs?

65
Mani David

Le contenu du fichier secret_token.rb Comprend une longue chaîne aléatoire utilisée pour vérifier l'intégrité des cookies signés (telles que les sessions utilisateur lorsque des utilisateurs sont connectés à votre application Web).

Documentation dit:

Utilisez votre secret_key_base existante à partir de l’initialiseur secret_token.rb Pour définir la variable d’environnement SECRET_KEY_BASE pour les utilisateurs exécutant l’application Rails en mode de production. Vous pouvez également copier la clé secrète existante à partir du secret_token.rb Initialiser à secrets.yml dans la section production, en remplacement de <%= ENV["SECRET_KEY_BASE"] %>.

Puisqu'il s'agit d'un fichier important et que vous ne pouvez pas le placer dans .gitignore, il est considéré comme une bonne pratique d'utiliser la variable env pour stocker la valeur secret_key_base:

créer un fichier .env ou .powenv et le stocker comme suit:

export SECRET_TOKEN="9489b3eee4eccf317ed77407553e8adc97baca7c74dc7ee33cd93e4c8b69477eea66eaedeb18af0be2679887c7c69c0a28c0fded0a71ea472a8c4laalal19cb"

Et puis dans 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

Cet article est (un peu vieux et) long mais vraiment plein d'informations utiles sur le sujet.


MISE À JOUR 04.05.15

À partir de Rails 4.2, le fichier secret_token.rb N'existe plus. Selon la nouvelle convention, il existe un fichier config/secrets.yml Destiné à stocker les secrets de l'application.

Ayez une lecture sur la façon de mettre à jour une application existante à 4.2.x selon les innovations.


Techniquement, le but de secrect_key_base Est d’être l’entrée secrète de la méthode key_generator De l’application (cochez Rails.application.key_generator).

Les key_generator De l’application, et donc secret_key_base, Sont utilisés par trois fonctionnalités principales dans le cadre Rails:

  • Dérivation de clés pour les cookies cryptés accessibles via cookies.encrypted.
  • Dérivation de la clé pour les cookies signés HMAC accessibles via cookies.signed.
  • Dérivation de clés pour toutes les instances nommées de l'application message_verifier .

Découvrez plus sur chacun des trois dans le article de @michaeljcoyne .

55
Andrey Deineko

secret_key_base est utilisé pour chiffrer et signer une session

afin d'envoyer en toute sécurité la session dans les cookies


Dans Rails 4,

  1. si votre application s'appelle Hello, et
  2. vous définissez session['a'] = 'b',

votre cookie ressemblera à quelque chose comme ceci:

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

qui se traduit par:

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

Les cookies sont configurés par serveur et conservés côté client, le navigateur les renvoyant envoyant des cookies au serveur chaque fois que nous demandons une page.

Pour empêcher les méchants de comprendre a=b chaîne, c’est crypté.
Pour empêcher les pervers de falsifier les cookies, signature numérique est utilisé.

Dans les deux cas, secret_key_base la valeur est utilisée (pour chiffrer/déchiffrer a = b et pour valider la signature numérique).

23
lakesare