Для чого використовується 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.