【问题标题】:Rails secure session and cookies are not working with a CDNRails 安全会话和 cookie 不适用于 CDN
【发布时间】:2018-12-04 06:00:09
【问题描述】:

我的设置如下所示:CloudFront CDN with https only 和 EC2 Instnace orign http-only(对 CloudFront 的所有请求都是 https,从 CloudFront 到 ec2 的所有请求都是 http)

如果我在我的应用程序中将安全设置为 true会话和 cookie 将不再保存在任何浏览器中。如果我将其设置为 false,它可以在大多数浏览器中使用,但 在 Safari 中不起作用

Rails.application.config.session_store :cookie_store, key: '_K_session', secure: true

我的目标是让会话适用于所有浏览器。我真的不需要安全会话设置。

这是我简化的 Terraform 设置:

resource "aws_cloudfront_distribution" "main_rails_app" {
  origin {
    domain_name = "${aws_elastic_beanstalk_environment.main_rails_app.cname}"
    origin_id   = "${var.cf_main_rails_app_origin_id}"

    custom_origin_config {
      http_port              = "80"
      https_port             = "443"
      origin_protocol_policy = "http-only"
      origin_ssl_protocols   = ["TLSv1.1"]
    }
  }
  default_cache_behavior {
    allowed_methods  = ["DELETE", "GET", "HEAD", "OPTIONS", "PATCH", "POST", "PUT"]
    cached_methods   = ["GET", "HEAD", "OPTIONS"]
    target_origin_id = "${var.cf_main_rails_app_origin_id}"

    forwarded_values {
      query_string = true
      headers      = ["*"]

      cookies {
        forward = "all"
      }
    }

    min_ttl                = 0
    default_ttl            = 0
    max_ttl                = 0
    compress               = true
    viewer_protocol_policy = "redirect-to-https"
  }
  viewer_certificate {
    # cloudfront_default_certificate = true
    acm_certificate_arn      = "${data.aws_acm_certificate.some_domain.arn}"
    minimum_protocol_version = "TLSv1.1_2016"
    ssl_support_method       = "sni-only"
  }
  restrictions {
    geo_restriction {
      restriction_type = "none"
    }
  }
}

【问题讨论】:

    标签: ruby-on-rails amazon-web-services session cookies session-cookies


    【解决方案1】:

    事实证明 Safari 确实会发送 Location 标头,即使表单托管在同一个域上,而其他一些浏览器则没有。位置标头值(cdn url)将与应用程序 url(ec2 url)不匹配,请求将在 rails 中标记为无效。我有protect_from_forgery 而不是protect_from_forgery with: :exception,我花了很长时间才看到这个,因为我没有收到任何明显的错误。我的解决方案是禁用此设置:

    Rails.application.config.action_controller.forgery_protection_origin_check = false
    

    此设置的默认状态在 Rails 5 中被翻转。

    【讨论】:

      【解决方案2】:

      cookie 存储正在做它应该做的事情,Rails 在未加密的会话上收到一个 cookie,CF 到 EC2 是未加密的。

      您有多种选择。

      1. Encrypt traffic between ec2 and cf if you want to set to secure: true. And force-ssl redirect as well.
      2. 保持安全:false,因为您已经信任 CF 和 EC2 之间的连接。

      http://guides.rubyonrails.org/v5.0/security.html

      Secure session cookie is not set

      【讨论】:

      • 抱歉我的误导性问题,我想保持安全:false,但它在 safari 中不起作用
      • 什么版本的 Safari 和 MacOS?
      • 10.13.5 macOS 和 11.1.1 safari
      • High sierra 和 safari 11 的 cookie 管理方式似乎发生了重大变化。我认为您必须进行一些偏好更改以允许使用 cookie。 blog.macsales.com/…
      • 谢谢,但禁用“使用 ITP 防止跨站点跟踪”没有帮助
      猜你喜欢
      • 2018-10-10
      • 2023-01-29
      • 2013-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-02
      • 2017-03-03
      相关资源
      最近更新 更多