Was macht force_ssl in Rails?

83

In einer früheren Frage habe ich herausgefunden, dass ich die Nginx-SSL-Terminierung festlegen und Rails keine verschlüsselten Daten verarbeiten lassen sollte.

Warum gibt es dann folgendes?

config.force_ssl = true

Ich sehe dies in der Produktionskonfigurationsdatei auskommentiert. Aber wenn die Erwartung ist, dass Nginx alle SSL-Dinge erledigt, damit meine Rails-App nicht mit verschlüsselten Daten umgeht, was config.force_ssl = truedann?

Sollte ich es in der Produktion auskommentieren lassen, wenn ich weiß, dass ich immer Nginx verwenden werde?

user782220
quelle

Antworten:

75

Es zwingt Ihren Browser nicht nur , HTTP zu HTTPS umzuleiten. Außerdem werden Ihre Cookies als "sicher" markiert und HSTS aktiviert , von denen jedes einen sehr guten Schutz gegen SSL-Stripping bietet.

Obwohl HTTPS Ihre App unter " https://example.com/yourapp " vor MITM-Angriffen schützt , kann jemand, der sich zwischen Ihrem Client und Ihrem Server befindet, Sie ziemlich leicht dazu bringen, " http://example.com/yourapp " zu besuchen. . Mit keinem der oben genannten Schutzmaßnahmen sendet Ihr Browser das Sitzungscookie gerne an die Person, die das MITM ausführt.

Dan Jameson
quelle
1
Die Quelle von force_ssl enthält keinen Hinweis darauf, dass HSTS durch diese Option aktiviert wird
agios
13
@agios Dies ist eine separate force_sslEigenschaft pro Controller . Die force_sslKonfigurationsvariable, mit der die Rack::SSLMiddleware installiert wird , die standardmäßig HSTS aktiviert .
Brent Royal-Gordon
@agios Sie suchen am falschen Ort: github.com/rails/rails/blob/…
jmera
4
Es klingt so, als ob config.force_ssl = truedies die Standardeinstellung sein sollte. Warum hat das Rails-Team dies als Standard auskommentiert?
Henry Yang
54

Einstellung config.force_sslbeinhaltet ActionDispatch::SSL. In den ActionDispatch::SSLDokumenten wird die Funktionalität wie folgt beschrieben (zur Verdeutlichung wurden Hervorhebungen hinzugefügt):

Siehe die Includes hier und die Dokumente für ActionDispatch :: SSL hier .

DOCS

Diese Middleware wird dem Stack hinzugefügt, wenn config.force_ssl = truedie darin festgelegten Optionen übergeben werden config.ssl_options. Es werden drei Jobs ausgeführt, um sichere HTTP-Anforderungen zu erzwingen:

  1. TLS-Umleitung: Leitet http: // -Anforderungen dauerhaft an https: // mit demselben URL-Host, Pfad usw. weiter. Standardmäßig aktiviert. Legen Sie fest config.ssl_options , dass die Ziel-URL geändert werden soll (z. B. redirect: { host: "secure.widgets.com", port: 8080 }), oder redirect: falsedeaktivieren Sie diese Funktion.

  2. Sichere Cookies: Setzt das secureFlag auf Cookies , um Browsern mitzuteilen, dass sie nicht zusammen mit http: // -Anfragen gesendet werden dürfen. Standardmäßig aktiviert. Stellen Sie config.ssl_optionsmit ein secure_cookies: false, um diese Funktion zu deaktivieren.

  3. HTTP Strict Transport Security (HSTS): Weist den Browser an, sich diese Site als reine TLS-Site zu merken und Nicht-TLS-Anforderungen automatisch umzuleiten . Standardmäßig aktiviert. Konfigurieren Sie config.ssl_optionsmit hsts: false, um zu deaktivieren. Stellen Sie config.ssl_optionsmit ein hsts: { … }, um HSTS zu konfigurieren:

    • expires: Wie lange, in Sekunden, bleiben diese Einstellungen erhalten. Der Standardwert ist 180.days(empfohlen). Das Minimum, das erforderlich ist, um sich für Browser-Preload-Listen zu qualifizieren, ist 18.weeks.
    • subdomains: Aktivieren Sie truediese Option, um den Browser anzuweisen, diese Einstellungen auf alle Subdomains anzuwenden. Dies schützt Ihre Cookies vor dem Abfangen durch eine anfällige Site in einer Subdomain. Der Standardwert ist true.
    • preload: Geben Sie an, dass diese Site möglicherweise in die vorinstallierten HSTS-Listen der Browser aufgenommen wird. HSTS schützt Ihre Site bei jedem Besuch mit Ausnahme des ersten Besuchs, da Ihr HSTS-Header noch nicht angezeigt wurde. Um diese Lücke zu schließen, enthalten Browser-Anbieter eine integrierte Liste von HSTS-fähigen Websites. Gehen Sie zu https://hstspreload.appspot.com , um Ihre Website zur Aufnahme einzureichen. Um HSTS auszuschalten, reicht es nicht aus, den Header wegzulassen. Browser werden sich die ursprüngliche HSTS-Direktive bis zu ihrem Ablauf merken. Verwenden Sie stattdessen den Header, um den Browsern mitzuteilen, dass HSTS sofort ablaufen soll. Die Einstellung hsts: falseist eine Verknüpfung für hsts: { expires: 0 }.

Anfragen können die Weiterleitung abbestellen mit exclude:

config.ssl_options = { redirect: { exclude: -> request { request.path =~ /healthcheck/ } } }
Stahl
quelle
3
"Anfragen können die Umleitung mit deaktivieren exclude" - Warnung: Diese Funktion wurde erst kürzlich in Rails 5 hinzugefügt und funktioniert daher nicht für diejenigen von uns auf Rails 4.2 oder
niedriger
1
Ich glaube, die excludeglobalen Optionen waren lange vor Rails 5 verfügbar, daher ist der Syntaxt etwas anders: config.ssl_options = { exclude: proc { |env| env['PATH_INFO'].start_with?('/healthcheck/') } }- serverfault.com/a/517401
jwadsack
12

Diese Einstellung erzwingt HTTPS, indem HTTP-Anforderungen an ihre HTTPS-Gegenstücke umgeleitet werden. Ein Browserbesuch http://domain.com/pathwird also umgeleitet https://domain.com/path.

Wenn Sie die Einstellung auskommentieren, werden beide Protokolle zugelassen.

Sie müssen Ihren Webserver noch für die Verarbeitung von HTTPS-Anforderungen konfigurieren.

Stefan
quelle
1
Aber wenn Sie HTTPS auf Nginx-Ebene aktivieren (indem Sie alles über HTTPS umleiten redirect 301 https:...), würde dann nicht ALLES über https gehen und somit config.force_ssl = truenichts wirklich tun (da nichts jemals http sein wird)? Oder gibt es hier einen tieferen Sicherheitsgrund?
Tristan Tao
2
@TristanTao ja, das würde genauso gut funktionieren. Aber selbst dann würde ich config.force_sslaktiviert lassen, nur für den Fall, dass jemand die Umleitung aus der Konfiguration des Webservers entfernt.
Stefan
2
Seien Sie vorsichtig, config.force_ssl unterscheidet sich in Bezug auf die Sicherung von Cookies gegen Sitzungsentführungen etwas mehr von force_ssl im Controller: eq8.eu/blogs/…
äquivalent8
1
Beachten Sie auch, dass beide config.force_sslund add_header Strict-Transport-Security max-age=...;zu 2 Strict-Transport-SecurityKopfzeilen führen
Victor Ivanov
4

Es erzwingt, dass die gesamte Kommunikation mit dem Server verschlüsselt wird und SSL verwendet wird, dh über HTTPS.

Wenn Sie es in einen Controller aufnehmen, akzeptiert dieser Controller nur HTTPS-Anforderungen.

Hilfreiche Links:

  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
Richard Jordan
quelle