Що робить force_ssl у Rails?


84

У попередньому питанні я з'ясував, що я повинен встановлювати припинення nginx ssl, а не Rails обробляти зашифровані дані.

Тоді чому існує наступне?

config.force_ssl = true

Я бачу, що це коментується у виробничому конфігураційному файлі. Але якщо очікується, що nginx буде обробляти всі ssl-матеріали, щоб мій додаток rails не працював із зашифрованими даними, що тоді config.force_ssl = trueробити?

Чи повинен я залишити його зауваженим у виробництві, якщо я знаю, що завжди буду використовувати nginx?

Відповіді:


77

Це не просто змушує ваш браузер перенаправляти HTTP на HTTPS. Він також встановлює, що ваші файли cookie мають позначку "безпечно", і це дозволяє HSTS , кожен з яких є дуже хорошим захистом від зачищення SSL.

Навіть незважаючи на те, що HTTPS захищає ваш додаток на " https://example.com/yourapp " від атак MITM, якщо хтось потрапляє між вашим клієнтом і вашим сервером, він може з легкістю змусити вас відвідати " http://example.com/yourapp " . Не маючи жодного з перерахованих вище засобів захисту, ваш браузер із задоволенням надішле сеансовий файл cookie людині, яка робить MITM.


1
Джерело force_ssl не містить вказівки на те, що цей параметр
увімкнув

13
@agios Це окрема force_sslвластивість для кожного контролера . force_sslЗмінної конфігурації, яка встановлює Rack::SSLпроміжне програмне забезпечення , яка дійсно дозволяє HSTS за замовчуванням .
Brent Royal-Gordon

@agios ви шукаєте не в тому місці: github.com/rails/rails/blob/…
jmera

4
здається, це config.force_ssl = trueмає бути за замовчуванням, чому команда рейок прокоментувала це за замовчуванням?
Henry Yang

55

Налаштування config.force_sslвключає ActionDispatch::SSL. У ActionDispatch::SSLдокументах описують функціональність наступним чином (курсив додано для ясності):

Перегляньте включення тут та документи для ActionDispatch :: SSL тут .

DOCS

Це проміжне програмне забезпечення додається до стеку, коли config.force_ssl = trueпередається параметри, задані в config.ssl_options. Він виконує три завдання для забезпечення захищених запитів HTTP:

  1. Перенаправлення TLS: Постійно перенаправляє http: // запити на https: // з тим самим хостом URL-адреси, шляхом тощо. Увімкнено за замовчуванням. Встановіть config.ssl_options для зміни цільової URL-адреси (наприклад redirect: { host: "secure.widgets.com", port: 8080 }) або redirect: falseвимкніть цю функцію.

  2. Безпечні файли cookie: встановлює secureпрапор на файлах cookie, щоб повідомляти браузерам, що вони не повинні надсилатися разом із запитами http: //. Увімкнено за замовчуванням. Встановити config.ssl_optionsз , secure_cookies: falseщоб відключити цю функцію.

  3. HTTP Strict Transport Security (HSTS): Показує браузеру запам’ятати цей сайт як лише TLS та автоматично перенаправляти запити, що не належать до TLS . Увімкнено за замовчуванням. Налаштування config.ssl_optionsз , hsts: falseщоб відключити. Набір config.ssl_optionsз hsts: { … }для конфігурації HSTS:

    • expires: Як довго, за секунди, ці налаштування залишаться в силі. За замовчуванням 180.days(рекомендовано). Мінімум, необхідний для участі в списках попереднього завантаження браузера, становить 18.weeks.
    • subdomains: Встановіть для trueвказівки браузеру застосовувати ці налаштування до всіх субдоменів. Це захищає ваші файли cookie від перехоплення вразливим сайтом на субдомені. За замовчуванням true.
    • preload: Повідомте, що цей веб-сайт може бути включений до попередньо завантажених списків HSTS браузера. HSTS захищає ваш сайт під час кожного відвідування, крім першого, оскільки він ще не бачив вашого заголовка HSTS. Щоб заповнити цю прогалину, постачальники браузерів включають включений список сайтів із підтримкою HSTS. Перейдіть на https://hstspreload.appspot.com, щоб надіслати свій сайт для включення. Щоб вимкнути HSTS, недостатньо опустити заголовок. Браузери пам’ятатимуть оригінальну директиву HSTS до її закінчення. Натомість використовуйте заголовок, щоб повідомити браузерам негайно закінчити термін дії HSTS. Налаштування hsts: false- це ярлик для hsts: { expires: 0 }.

Запити можуть відмовитись від переадресації за допомогою exclude:

config.ssl_options = { redirect: { exclude: -> request { request.path =~ /healthcheck/ } } }

3
"Запити можуть відмовитись від переадресації за допомогою exclude" - Попередження: ця функція була додана нещодавно лише в Rails 5, тому не буде працювати для тих, хто
користується

1
Я вважаю, що excludeглобальні параметри були доступні задовго до Rails 5, тому це трохи інший синтаксис: config.ssl_options = { exclude: proc { |env| env['PATH_INFO'].start_with?('/healthcheck/') } }- serverfault.com/a/517401
jwadsack

12

Цей параметр змушує HTTPS перенаправляти HTTP-запити на їх аналоги HTTPS. Тож відвідувач браузера http://domain.com/pathбуде перенаправлений на https://domain.com/path.

Якщо залишити коментар налаштуванням, це дозволить обидва протоколи.

Вам все ще потрібно налаштувати веб-сервер для обробки запитів HTTPS.


1
Але якщо ви ввімкнете HTTPS на рівні nginx (перенаправивши все на HTTPS через redirect 301 https:...), чи не ВСЕ буде проходити через https, отже config.force_ssl = true, насправді нічого не робить (оскільки ніколи ніколи не буде http)? Або тут є глибша причина безпеки?
Трістан Тао,

2
@TristanTao так, це спрацювало б так само добре. Але навіть тоді я б залишив config.force_sslувімкненим, на випадок, якщо хтось видалить переспрямування з конфігурації веб-сервера.
Stefan

2
будьте обережні, doh, config.force_ssl трохи відрізняється від force_ssl у контролері з точки зору захисту файлів cookie від викрадення сесії. Докладніше тут: eq8.eu/blogs/…
еквівалент, 8

1
також зауважимо, що наявність обох config.force_sslі add_header Strict-Transport-Security max-age=...;призведе до 2 Strict-Transport-Securityзаголовків
Віктор Іванов

4

Це змушує весь зв’язок із сервером шифруватися та використовувати SSL, тобто через HTTPS.

Коли ви включаєте його в контролер, цей контролер буде приймати лише запити HTTPS.

Корисні Посилання:

  1. http://api.rubyonrails.org/classes/ActionController/ForceSSL/ClassMethods.html
  2. http://rubydoc.info/docs/rails/ActionController/ForceSSL
  3. http://railscasts.com/episodes/270-authentication-in-rails-3-1?view=comments
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.