Che cosa fa force_ssl in Rails?

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

Allora perché esistono le seguenti?

config.force_ssl = true 

Vedo questo commentato nel file di configurazione di produzione. Ma se l’aspettativa è che nginx gestirà tutte le cose di ssl in modo che la mia app per i binari non si occupi di dati crittografati, allora cosa farà config.force_ssl = true ?

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

Non costringe semplicemente il tuo browser a redirect HTTP a HTTPS. Imposta anche i tuoi cookie per essere contrassegnati come “sicuri” e abilita HSTS , ognuna delle quali è un’ottima protezione contro lo stripping SSL.

Anche se HTTPS protegge la tua app da ” https://example.com/yourapp ” contro gli attacchi MITM, se qualcuno si intromette tra il tuo client e il tuo server, può facilmente farti visitare ” http://example.com/yourapp ” . Con nessuna delle suddette protezioni, il browser invierà felicemente il cookie di sessione alla persona che esegue il MITM.

Impostazione config.force_ssl include ActionDispatch::SSL . I documenti ActionDispatch::SSL descrivono la funzionalità come segue (enfasi aggiunta per chiarezza):

Vedi qui e i documenti 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 . Fa tre lavori per far rispettare le richieste HTTP sicure:

  1. Reindirizzamento TLS: reindirizza in modo permanente le richieste http: // a https: // con lo stesso URL host, percorso, ecc. Abilitato per impostazione predefinita. Impostare config.ssl_options per modificare l’URL di destinazione (ad es. redirect: { host: "secure.widgets.com", port: 8080 } ), o impostare redirect: false per disabilitare questa funzione.

  2. Cookie sicuri: imposta il flag di secure sui cookie per indicare ai browser che non devono essere inviati insieme alle richieste http: //. Abilitato di default. secure_cookies: false con secure_cookies: false per disabilitare questa funzione.

  3. HTTP Strict Transport Security (HSTS): indica al browser di ricordare questo sito come solo TLS e reindirizza automaticamente le richieste non TLS . Abilitato di default. Configura config.ssl_options con hsts: false per disabilitare. hsts: { … } con hsts: { … } per configurare HSTS:

    • expires : per quanto tempo, in secondi, queste impostazioni si attaccheranno. Il valore predefinito è 180.days (consigliato). Il minimo richiesto per qualificarsi per gli elenchi di preload del browser è di 18.weeks .
    • subdomains : impostare su true per dire al browser di applicare queste impostazioni a tutti i sottodomini. Questo protegge i cookie dall’intercettazione da parte di un sito vulnerabile su un sottodominio. Il valore predefinito è true .
    • preload : annuncia che questo sito può essere incluso negli elenchi HSTS precaricati dei browser. HSTS protegge il tuo sito ad ogni visita tranne la prima visita poiché non ha ancora visto la tua intestazione HSTS. Per colmare questa lacuna, i fornitori di browser includono un elenco di siti abilitati per HSTS. Vai a https://hstspreload.appspot.com per inviare il tuo sito per l’inclusione. Per distriggersre HSTS, omettere l’intestazione non è sufficiente. I browser ricorderanno la direttiva HSTS originale fino alla sua scadenza. Invece, usa l’intestazione per dire ai browser di far scadere immediatamente l’HST. Impostazione hsts: false è una scorciatoia per hsts: { expires: 0 } .

Le richieste possono essere cancellate dal reindirizzamento con l’ exclude :

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

Questa impostazione impone HTTPS reindirizzando le richieste HTTP alle rispettive controparti HTTPS. Quindi un browser che visita http://domain.com/path verrà reindirizzato su https://domain.com/path .

Lasciare l’impostazione commentata consentirebbe entrambi i protocolli.

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

Costringe tutte le comunicazioni con il server a essere crittografate e utilizzare SSL, ovvero tramite HTTPS.

Quando lo includi in un controller, quel controller accetterà solo le richieste HTTPS.

Collegamenti utili:

  1. http://api.rubyonrails.org/classs/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