如何使用Rails通过HTTP强制安全cookie

时间:2015-03-25 02:38:09

标签: ruby-on-rails security ssl cookies nginx

我正在使用位于反向代理服务器(Nginx)后面的Rails应用程序,我需要将Rails应用程序的会话cookie标记为Secure。但是,当我设置如下时,

Application.config.session_store :cookie_store, :key => '_app_session', :secure => true

Rails停止发送_app_session cookie。

我知道Rails正在阻止它,因为我正在使用curl -v直接攻击Rails,当我省略_app_session时,我可以看到:secure => true cookie。

如何强制Rails通过HTTP连接发送安全cookie?

注意:在这种特定情况下,通过HTTP发送安全cookie是可以的。这种流量发生在一个被认为是安全的区域,然后被包装在SSL中并发送到世界各地。此外,“terminating SSL upstream is quite common”,所以我不是第一个有这样设置的人。

替代品(什么不起作用)

以下是我已经尝试过的内容:

我在Lua中编写了一个脚本,将Secure添加到cookie中。它起作用了,但是我的老板说我们不能在Nginx中拥有Lua。

我无法弄清楚如何在Nginx中使用以下指令来实现我想要的目标:

  • $ HTTP_HEADER
  • proxy_set_header
  • more_set_headers
  • $ cookie_COOKIE

我尝试按照建议here添加set_proxy_headeradd_header,但它不起作用,我怀疑我们的设置可能会造成一些特殊原因。

最后,假设我可以为Nginx编写一个C模块,但我不打算这样做。

2 个答案:

答案 0 :(得分:5)

我将以下内容添加到我的Nginx配置文件中的相关location块中:

proxy_set_header X-Forwarded-Proto https;

之前没有用,因为我在问题链接的建议中使用了X-Forwarded-Proto $scheme。我不知道为什么这不起作用,而是在做

$ curl -v -H "X-Forwarded-Proto: https" http://localhost:95/app-path

会返回预期的_app_session Cookie,并设置Secure标记,因此很明显RoR只需要知道安全cookie最终会通过https结束。

更新(2015年6月)

我遇到此问题的原因是因为我们的服务器代理httphttps传递了X-Forwarded-Proto个请求,而不是先设置X-Forwarded-Proto $scheme。一旦我更好地理解了拓扑结构,我就可以在第一次代理传递之前执行{{1}}。这是正确的解决方案。

答案 1 :(得分:0)

你应该看看rack-ssl-enforcer gem。从rails中移除问题,并且它可根据您的需求进行高度配置。