Cosa fa force_ssl in Rails?


84

In una domanda precedente ho scoperto che avrei dovuto impostare la terminazione ssl di nginx e non avere Rails per elaborare i dati crittografati.

Allora perché esiste quanto segue?

config.force_ssl = true

Lo vedo commentato nel file di configurazione della produzione. Ma se l'aspettativa è che nginx gestirà tutte le cose ssl in modo che la mia app rails non gestisca i dati crittografati, allora cosa fa config.force_ssl = true?

Devo lasciarlo commentato in produzione se so che userò sempre nginx?

Risposte:


77

Non si limita a forzare il browser a reindirizzare da HTTP a HTTPS. Inoltre imposta i cookie in modo che siano contrassegnati come "sicuri" e abilita HSTS , ognuno dei quali è un'ottima protezione contro lo stripping SSL.

Anche se HTTPS protegge la tua app su " https://example.com/yourapp " dagli attacchi MITM, se qualcuno si intromette tra il tuo client e il tuo server può farti visitare facilmente " http://example.com/yourapp " . Senza nessuna delle protezioni di cui sopra, il tuo browser invierà felicemente il cookie di sessione alla persona che esegue il MITM.


1
La fonte di force_ssl non contiene alcuna indicazione che l'HSTS sia abilitato da questa opzione
agios

13
@agios Questa è una proprietà separata per controller force_ssl. La force_sslvariabile di configurazione, che installa il Rack::SSLmiddleware, che abilita HSTS per impostazione predefinita .
Brent Royal-Gordon,

@agios stai cercando nel posto sbagliato: github.com/rails/rails/blob/…
jmera

4
sembra che config.force_ssl = truedovrebbe essere l'impostazione predefinita, perché il team di rails l'ha commentata come predefinita?
Henry Yang

56

Ambientazione config.force_ssl include ActionDispatch::SSL. I ActionDispatch::SSLdocumenti descrivono la funzionalità come segue (enfasi aggiunti per chiarezza):

Vedi le include qui e la documentazione per ActionDispatch :: SSL qui .

DOCS

Questo middleware viene aggiunto allo stack quando config.force_ssl = true e vengono passate le opzioni impostate in config.ssl_options. Esegue tre lavori per applicare richieste HTTP sicure:

  1. Reindirizzamento TLS: reindirizza permanentemente le richieste http: // a https: // con lo stesso host URL, percorso, ecc. Abilitato per impostazione predefinita. Imposta config.ssl_options per modificare l'URL di destinazione (esredirect: { host: "secure.widgets.com", port: 8080 } ) O impostare redirect: falseper disabilitare questa funzione.

  2. Cookie protetti: imposta il secureflag sui cookie per indicare ai browser che non devono essere inviati insieme alle richieste http: //. Abilitato per impostazione predefinita. Impostato config.ssl_options con secure_cookies: falseper disabilitare questa funzione.

  3. HTTP Strict Transport Security (HSTS): indica al browser di ricordare questo sito come solo TLS e di reindirizzare automaticamente le richieste non TLS . Abilitato per impostazione predefinita. Configura config.ssl_optionscon hsts: falseper disabilitare. Impostato config.ssl_optionscon hsts: { … }per configurare HSTS:

    • expires: Quanto tempo, in secondi, queste impostazioni rimarranno. Il valore predefinito è 180.days(consigliato). Il minimo richiesto per qualificarsi per gli elenchi di precaricamento del browser è 18.weeks.
    • subdomains: Impostare su trueper indicare al browser di applicare queste impostazioni a tutti i sottodomini. Questo protegge i tuoi cookie dall'intercettazione da parte di un sito vulnerabile su un sottodominio. Il valore predefinito è true.
    • preload: Annuncia che questo sito potrebbe essere incluso negli elenchi HSTS precaricati dei browser. HSTS protegge il tuo sito a ogni visita tranne la prima, poiché non ha ancora visto l'intestazione HSTS. Per colmare questa lacuna, i fornitori di browser includono un elenco integrato di siti abilitati per HSTS. Vai a https://hstspreload.appspot.com per inviare il tuo sito per l'inclusione. Per disattivare HSTS, omettere l'intestazione non è sufficiente. I browser ricorderanno la direttiva HSTS originale fino alla scadenza. Utilizza invece l'intestazione per dire ai browser di far scadere immediatamente l'HSTS. L'impostazione hsts: falseè una scorciatoia perhsts: { expires: 0 } .

Le richieste possono disattivare il reindirizzamento con exclude:

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

3
"Le richieste possono disattivare il reindirizzamento con exclude" - Attenzione: questa funzione è stata aggiunta solo di recente in Rails 5, quindi non funzionerà per quelli di noi su Rails 4.2 o precedenti
jonleighton

1
Credo che le excludeopzioni globali fossero disponibili molto tempo prima di Rails 5, quindi la sintassi è leggermente diversa: config.ssl_options = { exclude: proc { |env| env['PATH_INFO'].start_with?('/healthcheck/') } }- serverfault.com/a/517401
jwadsack

12

Questa impostazione forza HTTPS reindirizzando le richieste HTTP alle controparti HTTPS. Quindi una visita del browser http://domain.com/pathverrà reindirizzata a https://domain.com/path.

Lasciare l'impostazione commentata consentirebbe entrambi i protocolli.

Devi ancora configurare il tuo server web per gestire le richieste HTTPS.


1
Ma se abiliti HTTPS a livello di nginx (reindirizzando tutto su HTTPS tramite redirect 301 https:...), TUTTO non passerebbe attraverso https, quindi config.force_ssl = truenon fa davvero nulla (poiché niente sarà mai http)? O c'è un motivo di sicurezza più profondo qui?
Tristan Tao,

2
@TristanTao sì, funzionerebbe altrettanto bene. Ma anche allora, lascerei config.force_sslabilitato, nel caso qualcuno stia rimuovendo il reindirizzamento dalla configurazione del server web.
Stefan

2
fai attenzione, config.force_ssl è leggermente diverso da force_ssl nel controller in termini di protezione dei cookie contro il dirottamento della sessione più qui: eq8.eu/blogs/…
equivalente8

1
Nota anche che avere entrambi config.force_ssle add_header Strict-Transport-Security max-age=...;si tradurrà in 2 Strict-Transport-Securitycolpi di testa
Victor Ivanov

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.