Что делает force_ssl в Rails?

84

В предыдущем вопросе я узнал, что мне нужно установить завершение ssl nginx и не использовать Rails для обработки зашифрованных данных.

Тогда почему существует следующее?

config.force_ssl = true

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

Должен ли я оставить его закомментированным в производственной среде, если я знаю, что всегда буду использовать nginx?

user782220
источник

Ответы:

77

Это не просто заставляет ваш браузер перенаправлять HTTP на HTTPS. Он также устанавливает для ваших файлов cookie отметку «безопасный» и включает HSTS , каждый из которых является очень хорошей защитой от удаления SSL.

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

Дэн Джеймсон
источник
1
Источник force_ssl не содержит указаний на включение HSTS этой опцией
agios
13
@agios Это отдельное force_sslсвойство для каждого контроллера . force_sslПеременной конфигурации, которая устанавливает Rack::SSLпромежуточное программное обеспечение , которая действительно позволяет HSTS по умолчанию .
Брент Роял-Гордон,
@agios, вы ищете не в том месте: github.com/rails/rails/blob/…
jmera
4
похоже, что это config.force_ssl = trueдолжно быть по умолчанию, почему команда rails закомментировала его по умолчанию?
Генри Ян
56

Настройка config.force_sslвключает ActionDispatch::SSL. В ActionDispatch::SSLдокументах описывают функциональность следующим образом (курсив добавлен для ясности):

См. Включения здесь и документацию по ActionDispatch :: SSL здесь .

ДОКУМЕНТЫ

Это промежуточное ПО добавляется в стек, когда 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, поэтому не будет работать для тех из нас, кто использует Rails 4.2 или ниже
jonleighton
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включенным, на всякий случай, если кто-то удалит перенаправление из конфигурации веб-сервера.
Стефан
2
будьте осторожны, doh, config.force_ssl немного отличается от force_ssl в контроллере с точки зрения защиты файлов cookie от перехвата
эквивалент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
Ричард Джордан
источник