Безопасный сеанс Rails и куки не работают с CDN - PullRequest
0 голосов
/ 25 июня 2018

Мои настройки выглядят следующим образом: CDN CloudFront только с https и http-только для Instnace EC2 Instnace (все запросы, сделанные к 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"
    }
  }
}

Ответы [ 2 ]

0 голосов
/ 21 августа 2018

Оказывается, 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.

0 голосов
/ 25 июня 2018

Хранилище cookie делает именно то, что должно делать, Rails получает cookie в незашифрованном сеансе, CF в EC2 в незашифрованном виде.

У вас есть несколько вариантов.

  1. Шифровать трафик между ec2 и cf, если вы хотите установить для secure: true. И перенаправление силы-ssl также.
  2. Сохранить в безопасности: ложь, поскольку вы уже доверяете соединению между CF и EC2.

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

Защищенный файл cookie сеанса не установлен

...