Еластичний Beanstalk force https


12

У мене виникають проблеми з примусом HTTPS до сайту, який я розгортаю через AWS Elastic Beanstalk.

Це додатки для фронтенів, що використовують EmberJS. Я багато днів ходив по колах, намагаючись зрозуміти, як перенаправити http-трафік на https. Я використовую Amazon Linux AMI на своїй машині EC2.

Я прийшов до висновку (досі не впевнений, чи правильно це), що я не змушую HTTPS не в межах Elastic Beanstalk. Я дозволяю і HTTP, і HTTPS через мій балансир завантаження Elastic Beanstalk, і я намагаюся переадресувати на сервер.

Тут я стикаюся з проблемами. Я знаходжу багато відповідей щодо правил перезапису, без mod_rewriteяких базується навколо X-Forwarded-Protoзаголовка, але цей файл не існує на моїй машині EC2 відповідно до пошуку пошуку.

Я також спробував створити конфігураційний файл у .ebextensionsкаталозі, але це не працювало.

Головне, що я намагаюся зробити - це користувачі, спрямовані на https, коли намагаються потрапити на http-адресу. Будь-які вказівки чи пропозиції дуже вдячні, дякую!

EDIT: Я використовую 64-розрядний Debian jessie v1.4.1 під керуванням Python 3.4 (попередньо налаштований - Docker)


Схоже, Інтернет не може домовитися про єдине, повне і діюче рішення цієї проблеми. Сподіваюся, ви можете отримати допомогу тут, у моєму дописі . Мені довелося стрибати через обручі, щоб придумати це, нарешті.
ADTC

Відповіді:


7

Я думаю, вам потрібно вказати, яке середовище Elastic Beanstalk ви використовуєте (див .: Підтримувані платформи ), оскільки різні середовища мають різну конфігурацію.

В основному вам потрібно налаштувати:

  • Еластичний балансир навантаження :
    • Слухайте на порту 80 і проксі-сервер на порт 80 екземпляра EC2.
    • Слухайте на порту 443 і проксі-сервер до порту 443 примірника EC2.
  • Веб-сервер / проксі EC2 :
    • Слухайте на порту 80 і відповідь з перенаправленням на HTTPS.
    • Слухайте на порту 443 та обслуговуйте запит.

Щоб налаштувати його, ви можете використовувати CLI або .ebextensions.

Ви можете перевірити ввімкнути HTTPS та HTTP-перенаправлення на AWS Elastic Beanstalk . Він розповідає, як налаштувати Elastic Beanstalk Single Docker Container, що обслуговує HTTPS та HTTP (переадресація на HTTPS). Ви можете налаштувати конфігурацію як свою потребу.


Ей, чудова стаття, я зараз намагаюся це спробувати.
австер

будь-які ідеї, як не включити серти до цього файлу, скоріше не зберегли б це у контролі джерела? Серти, які ми завантажили, вже є десь? Я не можу їх знайти у файловій системі
awwester

Ви можете помістити свій файл сертифікатів SSL в S3. Щоб дозволити Elastic Beanstalk завантажувати приватний об'єкт S3, ви можете прочитати це .
Едвард Самуель

Для сертифікату ELB SSL ви можете дотримуватися документації AWS: Сертифікати SSL для еластичного балансування навантаження . Потім ви можете отримати ресурс сертифіката SSL у arn:aws:iam::123456789012:server-certificate/YourSSLCertificateформаті.
Едвард Самуель

У мене встановлений сервер SSL, і у мене є арн, який би перейшов у 00-load-balancer (я фактично роблю налаштування балансира навантаження через користувальницький інтерфейс), але я не можу отримати місце для розміщення на сервері налаштування ssl_certificate /opt/ssl/default-ssl.crt;Коли я отримую інформацію для cert, вона дає мені "шлях", але це просто "/"
awwester

10

Це також можна зробити дещо легше, не торкаючись балансира навантаження, використовуючи X-Forwarded-Protoзаголовок, встановлений ELB. Ось що я закінчив:

files:
  "/etc/nginx/sites-available/elasticbeanstalk-nginx-docker-proxy.conf":
    mode: "00644"
    owner: root
    group: root
    content: |
      map $http_upgrade $connection_upgrade {
        default        "upgrade";
        ""            "";
      }

      server {
        listen 80;

        gzip on;
        gzip_comp_level 4;
        gzip_types text/html text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;

        access_log    /var/log/nginx/access.log;

        location / {
          proxy_pass            http://docker;
          proxy_http_version    1.1;

          proxy_set_header      Connection      $connection_upgrade;
          proxy_set_header      Upgrade         $http_upgrade;
          proxy_set_header      Host            $host;
          proxy_set_header      X-Real-IP       $remote_addr;
          proxy_set_header      X-Forwarded-For $proxy_add_x_forwarded_for;
        }

        if ($http_x_forwarded_proto = 'http') {
          return 301 https://$host$request_uri;
        }
      }

На сьогодні найпростіше рішення. Не можу вам подякувати достатньо!
Кріс Мартін

Так, це правильний шлях у більшості сценаріїв.
jlegler

3

Elastic Beanstalk не підтримує декілька портів з одного контейнера Docker, тому вам потрібно обробити це на рівні проксі, як пропонується. Однак вашому екземпляру EC2 не потрібно знати про ваш сертифікат, оскільки ви можете розірвати з'єднання SSL на балансирі навантаження.

У своєму .ebextensionsкаталозі створіть конфігурацію для проксі-сервера nginx, який містить дві конфігурації сервера; той, який проксі http://docker(конфігурація за замовчуванням, порт 80), і той, який перенаправляє на https (я вибрав порт 8080).

.ebextensions/01-nginx-proxy.config:

files:
  "/etc/nginx/sites-available/000-default.conf":
    mode: "000644"
    owner: root
    group: root
    content: |
      map $http_upgrade $connection_upgrade {
          default        "upgrade";
          ""            "";
      }

      server {
          listen 80;

          gzip on;
          gzip_comp_level 4;
          gzip_types text/html text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;

          access_log    /var/log/nginx/access.log;

          location / {
              proxy_pass            http://docker;
              proxy_http_version    1.1;

              proxy_set_header    Connection            $connection_upgrade;
              proxy_set_header    Upgrade                $http_upgrade;
              proxy_set_header    Host                $host;
              proxy_set_header    X-Real-IP            $remote_addr;
              proxy_set_header    X-Forwarded-For        $proxy_add_x_forwarded_for;
          }
      }

      server {
          listen 8080;

          location / {
              return 301 https://$host$request_uri;
          }
      }

commands:
   00_enable_site:
    command: 'rm -f /etc/nginx/sites-enabled/* && ln -s /etc/nginx/sites-available/000-default.conf /etc/nginx/sites-enabled/000-default.conf'

Створіть другу конфігурацію для балансира навантаження та груп безпеки, яка встановлює їх наступним чином:

  • Екземпляр EC2 :
    • Дозволити рух через порти 80/8080 від балансира навантаження
    • Дозволити трафік на порт 22 з будь-якого місця (для доступу ssh, необов’язково)
  • Балансир завантаження :
    • Порт пересилання 443 HTTPS на порт 80 HTTP
    • Переадресаційний порт 80 HTTP на порт 8080 HTTP

.ebextensions/02-load-balancer.config:

"Resources" : {
  "AWSEBSecurityGroup": {
    "Type" : "AWS::EC2::SecurityGroup",
    "Properties" : {
      "GroupDescription" : "Instance security group (22/80/8080 in)",
      "SecurityGroupIngress" : [ {
          "IpProtocol" : "tcp",
          "FromPort" : "80",
          "ToPort" : "80",
          "SourceSecurityGroupId" : { "Ref" : "AWSEBLoadBalancerSecurityGroup" }
        }, {
          "IpProtocol" : "tcp",
          "FromPort" : "8080",
          "ToPort" : "8080",
          "SourceSecurityGroupId" : { "Ref" : "AWSEBLoadBalancerSecurityGroup" }
        }, {
          "IpProtocol" : "tcp",
          "FromPort" : "22",
          "ToPort" : "22",
          "CidrIp" : "0.0.0.0/0"
        } ]
    }
  },
  "AWSEBLoadBalancerSecurityGroup": {
    "Type" : "AWS::EC2::SecurityGroup",
    "Properties" : {
      "GroupDescription" : "Load balancer security group (80/443 in, 80/8080 out)",
      "VpcId" : "<vpc_id>",
      "SecurityGroupIngress" : [ {
          "IpProtocol" : "tcp",
          "FromPort" : "80",
          "ToPort" : "80",
          "CidrIp" : "0.0.0.0/0"
        }, {
          "IpProtocol" : "tcp",
          "FromPort" : "443",
          "ToPort" : "443",
          "CidrIp" : "0.0.0.0/0"
        } ],
      "SecurityGroupEgress": [ {
          "IpProtocol" : "tcp",
          "FromPort" : "80",
          "ToPort" : "80",
          "CidrIp" : "0.0.0.0/0"
        }, {
          "IpProtocol" : "tcp",
          "FromPort" : "8080",
          "ToPort" : "8080",
          "CidrIp" : "0.0.0.0/0"
        } ]
    }
  },
  "AWSEBLoadBalancer" : {
    "Type" : "AWS::ElasticLoadBalancing::LoadBalancer",
    "Properties" : {
      "Listeners" : [ {
          "LoadBalancerPort" : "80",
          "InstancePort" : "8080",
          "Protocol" : "HTTP"
        }, {
          "LoadBalancerPort" : "443",
          "InstancePort" : "80",
          "Protocol" : "HTTPS",
          "SSLCertificateId" : "arn:aws:iam::<certificate_id>:<certificate_path>"
        } ]
    }
  }
}

(Примітка: не забудьте замінити SSLCertificateId і VpcId вашими значеннями).

Будь-який трафік на порт 80 балансира навантаження (HTTP) буде потрапляти на порт 8080 на екземплярі EC2, який перенаправляє на HTTPS. Трафік на порт 443 балансира навантаження (HTTPS) в кінцевому підсумку обслуговується портом 80 в екземплярі EC2, який є проксі-докером.


0

Я використовую Terraform для включення перенаправлення HTTP на HTTPS на ElasticBeanstalk,

Я щойно додав додаткове правило слухача

data "aws_alb_listener" "http" { //Get ARN of Listener on Port-80
  load_balancer_arn = aws_elastic_beanstalk_environment.myapp.load_balancers[0]
  port              = 80
}


resource "aws_alb_listener_rule" "redirect_http_to_https" {
  listener_arn = data.aws_alb_listener.http.arn
  action {
    type = "redirect"
    redirect {
      port        = "443"
      protocol    = "HTTPS"
      status_code = "HTTP_301"
    }
  }
  condition {
    host_header {
      values = ["*.*"]
    }
  }
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.