force_sslはRailsで何をしますか?


84

前の質問で、nginx sslターミネーションを設定し、Railsに暗号化されたデータを処理させないようにする必要があることがわかりました。

では、なぜ次のものが存在するのでしょうか。

config.force_ssl = true

これは本番構成ファイルでコメントアウトされています。しかし、私のrailsアプリが暗号化されたデータを処理しないように、nginxがすべてのSSLを処理することが期待されている場合、どうしconfig.force_ssl = trueますか?

常にnginxを使用することがわかっている場合は、本番環境でコメントアウトしたままにしておく必要がありますか?

回答:


77

ブラウザにHTTPをHTTPSにリダイレクトさせるだけではありません。また、Cookieを「安全」とマークするように設定し、HSTSを有効にします。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インストールのconfig変数、Rack::SSLミドルウェア、デフォルトでHSTSを有効にしを
ブレントロイヤル-ゴードン

間違った場所で探している@agiosgithub.com/rails/rails/blob/…
jmera

4
それconfig.force_ssl = trueはデフォルトであるべきだと思われますが、なぜレールチームはそれをデフォルトとしてコメントアウトしたのですか?
ヘンリーヤン

55

設定にconfig.force_sslはが含まれActionDispatch::SSLます。ActionDispatch::SSL(強調は、明確にするために追加された)次のようにドキュメントの機能について説明します。

含みを参照してくださいこことActionDispatch :: SSLのためのドキュメントここに

ドキュメント

このミドルウェアは、のときconfig.force_ssl = trueにスタックに追加され、で設定されたオプションが渡されconfig.ssl_optionsます。安全なHTTPリクエストを実施するために3つのジョブを実行します。

  1. TLSリダイレクト: 同じURLホスト、パスなどを使用してhttp://リクエストをhttps://に永続的にリダイレクトします。デフォルトで有効になっています。config.ssl_options 宛先URL(例redirect: { host: "secure.widgets.com", port: 8080 })を変更するように設定するか、redirect: falseこの機能を無効にするように設定 します。

  2. 安全なCookie: secure Cookieフラグを設定して、http://リクエストと一緒に送信してはならないことをブラウザに通知します。デフォルトで有効になっています。この機能を無効にするにはconfig.ssl_optionssecure_cookies: falseを設定 します。

  3. HTTP Strict Transport Security(HSTS):このサイトをTLSのみとして記憶し、TLS以外の要求を自動的にリダイレクトするようにブラウザーに指示します。デフォルトで有効になっています。で構成config.ssl_optionshsts: falseて無効にします。で設定config.ssl_optionshsts: { … }てHSTSを構成します。

    • expires:これらの設定が保持される時間(秒単位)。デフォルトは 180.days(推奨)です。ブラウザのプリロードリストの資格を得るために必要な最小値は18.weeksです。
    • subdomainstrueこれらの設定をすべてのサブドメインに適用するようにブラウザに指示するには、に設定します。これにより、サブドメイン上の脆弱なサイトによるCookieの傍受から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 2016年

1
私は信じてexcludeそれがわずかに異なるsyntaxtですので、グローバルオプションは、Railsの5長い時間前に利用可能であった:config.ssl_options = { exclude: proc { |env| env['PATH_INFO'].start_with?('/healthcheck/') } }- serverfault.com/a/517401
jwadsa​​ck

12

この設定は、HTTPリクエストを対応するHTTPSにリダイレクトすることでHTTPSを強制します。したがって、訪問しているブラウザhttp://domain.com/pathはにリダイレクトされますhttps://domain.com/pathます。

設定をコメントアウトしたままにすると、両方のプロトコルが許可されます。

HTTPS要求を処理するようにWebサーバーを構成する必要があります。


1
しかし、nginxレベルでHTTPSを有効にすると(を介してすべてをHTTPSにリダイレクトすることによりredirect 301 https:...)、すべてがhttpsを経由するconfig.force_ssl = trueわけではないため、実際には何も実行されません(httpになるものはないため)。それとも、ここにもっと深いセキュリティ上の理由がありますか?
トリスタンタオ

2
@TristanTaoはい、それも同様に機能します。しかし、それでも、config.force_ssl誰かがWebサーバーの構成からリダイレクトを削除する場合に備えて、有効のままにしておきます。
ステファン

2
注意してください。config.force_sslは、セッションハイジャックからCookieを保護するという点で、コントローラーのforce_sslとは少し異なります。eq8.eu
同等

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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.