Для чого використовується secret_key_base у рейках 4


78

Я новачок у Rails 4, і я не розумію використання secret_key_baseunder config/secrets.ymlу Rails 4. Чи можете ви пояснити цю концепцію?

Крім того , коли я працюю у виробничому середовищі, я пробуджений встановити secret_keyз devise.rb, config.secret_keyі secret_key_base. Однак я можу створити новий секрет за допомогою rake secretкоманди.

У чому різниця між середовищем розробки та виробництва?

Як це узгоджується з новоствореним, secret_keyколи я додаю його з secret_key_baseкожним разом, коли створюю?

Як це захист програми з іншими серверами?


4
Для читачів, які використовують Ruby on Rails 5.2 або новішої версії. secret_key_baseяк і раніше використовується, але зберігається config/credentials.yml.encзамість. Цей файл зашифровано. Ви можете знайти більше інформації про нову систему облікових даних тут або запустити rails credentials:help.
3limin4t0r

Відповіді:


65

secret_token.rb файлу включає довгий рандомізований рядок, який використовується для перевірки цілісності підписаних файлів cookie (наприклад, сеансів користувача, коли люди входять у ваш веб-додаток).

Документація говорить:

Скористайтеся наявною базою secret_key_base з secret_token.rbініціалізатора, щоб встановити змінну середовища SECRET_KEY_BASE для того, хто з користувачів запускає програму Rails у виробничому режимі. Крім того, ви можете просто скопіювати наявний секретний_ключ_бази зsecret_token.rb ініціалізатора в secrets.yml у розділі виробництва, замінивши <%= ENV["SECRET_KEY_BASE"] %>.

Оскільки це важливий файл, і ви не можете помістити його в .gitignore, вважається гарною практикою використовувати змінну env для зберігання secret_key_baseзначення:

створити .env або .powenvфайл і зберегти його як:

export SECRET_TOKEN="9489b3eee4eccf317ed77407553e8adc97baca7c74dc7ee33cd93e4c8b69477eea66eaedeb18af0be2679887c7c69c0a28c0fded0a71ea472a8c4laalal19cb"

А потім в 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

Ця стаття (трохи стара і) довга, але справді повна корисної інформації по темі.


ОНОВЛЕННЯ 04.05.15

Починаючи з Rails 4.2, secret_token.rbфайлу більше немає . За новою конвенцією існуєconfig/secrets.yml файл, призначений для зберігання секретів програми.

Почитайте як оновити існуючу програму до 4.2.x відповідно до інновацій.


Технічно мета secrect_key_base- бути секретним входом для програмиkey_generator методу програми (перевірка Rails.application.key_generator).

Додаток key_generator, а отжеsecret_key_base , використовуються трьома основними функціями в рамках Rails:

  • Виведення ключів для зашифрованих файлів cookie, до яких доступ cookies.encrypted .
  • Виведення ключа для файлів cookie з підписом HMAC, до яких можна отримати доступ cookies.signed .
  • Виведення ключів для всіх названих програм message_verifier екземплярів програми.

Перегляньте більше про кожен із трьох у статті @michaeljcoyne .


Зверніть увагу, що якщо ви використовуєте щось на зразок Ansible або подібне для розгортання, ви можете замінити весь secret.yml під час виробничого розгортання та gitignore, config/secret.ymlякщо хочете.
Kris

Власне, config / secrets.yml представлений з Rails 4.1
Fumisky Wells

Все це означає, що при зміні secret_key_baseкористувачі виходять з системи. Принаймні.
x-yuri

26

secret_key_base використовується для шифрування та підписання сеансу

для безпечного надсилання сеансу вперед і назад у файлах cookie


У Rails 4 ,

  1. якщо викликається ваша програма Hello, та
  2. ви встановили session['a'] = 'b',

ваш файл cookie буде виглядати приблизно так:

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

що перекладається на:

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

Файли cookie встановлюються сервером і зберігаються на стороні клієнта, при цьому браузер повторно надсилає набір файлів cookie на сервер кожного разу, коли ми запитуємо сторінку.

Щоб злі люди не розуміли a=bрядок, він зашифрований .
Щоб злі люди не втручались у файли cookie, використовується цифровий підпис .

В обох випадках використовується значення secret_key_base (для шифрування / дешифрування a = b та для перевірки цифрового підпису).


1. оскільки я знаю, дані сеансу зберігаються на сервері, а файл cookie є session_id. напр. зберігати user_id в сесії, єдиний session_id може бачити браузер, тоді як після входу сервер може знати, який користувач надсилає запит session_id. Тут ви говорите, що session ['a'] = 'b' буде шифрувати дані всередині файлу cookie. Я не впевнений, що ви плутаєтесь між сесією та файлом cookie. 2. як браузер може його розшифрувати, не знаючи secret_key_base і отримати інформацію?
Деймон Юань,

3
вибачте, тепер я знаю, що rails використовує сеанс на основі файлів cookie, що означає, що інформація про сесію зберігається всередині файлів cookie.
Деймон Юань

так, це правильно, сеанси на основі файлів cookie пропонують переносимість сеансів на розподілених серверах додатків та швидкість
хаммаді
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.