railsでssl設定をした場合にしておいた方がいい設定

ssl対応をやってみました。

はてなブログssl対応を行っているし、今となっては当たり前になりましたね。

なぜ、そんなことが起こっているかというと、chromeで安全なサイトではないという警告が出るからですね。

そんなsslですが、let's encryptで行うことが増えているのかなとは思っています。

それについて、後日まとめることができたらまとめます。

今回はsslをした後のrailsの設定を見ていきたいと思います。

cookieにsecure属性をつける

cookieにsecure属性をつけることで、cookieも暗号化されます。 平文だと、万が一盗まれるようなことがあるとまずいので、secure属性をつけるのがいいでしょう。

config/initializers/session_store.rb

Rails.application.config.session_store(secure: Rails.env.production?)

nginxのリバースプロキシにssl通信のheaderをつけてあげる

railsforce_sslを利用しても、httpsと認識してくれません。 その原因は、httpsと認証するheaderがないからです。

https://github.com/rack/rack/blob/rack-1.5/lib/rack/request.rb#L70

    def scheme
      if @env['HTTPS'] == 'on'
        'https'
      elsif @env['HTTP_X_FORWARDED_SSL'] == 'on'
        'https'
      elsif @env['HTTP_X_FORWARDED_SCHEME']
        @env['HTTP_X_FORWARDED_SCHEME']
      elsif @env['HTTP_X_FORWARDED_PROTO']
        @env['HTTP_X_FORWARDED_PROTO'].split(',')[0]
      else
        @env["rack.url_scheme"]
      end
    end

    def ssl?
      scheme == 'https'
    end

こうなっております。

schemeのどれでもいいので、headerとしてリバースプロキシから渡してあげましょう。

    location @app {
      ...
      proxy_set_header X-Forwarded-Proto $scheme;←追加
      ...
    }

ここまで来たらリダイレクト処理をnginx側で行います。 わざわざアプリケーション側でリダイレクト処理をするのは無駄な作業です。

  server {
    listen 80;
    rewrite ^ https://$server_name$request_uri? permanent;
  }

個人的には、rails側の設定もforce_sslで合わせました。 これで誰が見ても、設定がわかると思うので。

config/environments/production.rb

  # Force all access to the app over SSL, use Strict-Transport-Security, and use secure cookies.
  config.force_ssl = true

設定にもcookieにsecure属性をつけた方がいいよって書いてますね。

以上です。

参考

https://qiita.com/masarakki/items/e498d257a2105d055281