Elastic Beanstalk força https

10

Estou tendo problemas ao forçar o HTTPS com um site que estou implantando por meio do AWS Elastic Beanstalk.

É uma aplicação frontend usando o EmberJS. Eu tenho andado em círculos por muitos dias tentando descobrir como redirecionar o tráfego http para https. Estou usando o Amazon Linux AMI na minha máquina EC2.

Cheguei à conclusão (ainda não tenho certeza se isso está correto) que não é dentro do Elastic Beanstalk que forço o HTTPS. Estou permitindo HTTP e HTTPS através do meu Elastic Beanstalk Load Balancer e estou tentando redirecionar no servidor.

É aqui que estou com problemas. Eu estou encontrando muitas respostas sobre reescrever regras sem mod_rewrite que são baseadas em torno do X-Forwarded-Proto Header, mas esse arquivo não existe na minha máquina EC2 de acordo com uma pesquisa de localização.

Eu também tentei criar um arquivo de configuração dentro do diretório .ebextensions , mas isso também não funcionou.

A principal coisa que estou tentando fazer é direcionar os usuários para https quando tentarem acessar o endereço http. Quaisquer sugestões ou sugestões são muito apreciadas, obrigado!

EDIT: Eu estou usando o Debian jessie v1.4.1 de 64 bits executando o Python 3.4 (Preconfigured - Docker)

    
por awwester 14.07.2015 / 18:25

3 respostas

7

Eu acho que você precisa especificar o ambiente do Elastic Beanstalk que você usa (veja: Suportado Plataformas ), porque ambiente diferente tem configuração diferente.

Basicamente, você precisa personalizar:

  • Elastic Load Balancer :
    • Ouça na porta 80 e faça proxy para a porta 80 da instância do EC2.
    • Ouça na porta 443 e faça proxy para a porta 443 da instância do EC2.
  • Servidor Web / Proxy EC2 :
    • Ouça na porta 80 e responda com redirecionamento para HTTPS.
    • Ouça na porta 443 e atenda ao pedido.

Para personalizá-lo, você pode usar o CLI ou .ebextensions .

Você pode verificar em Ativar HTTPS e HTTP-Redirect no AWS Elastic Beanstalk . Ele informa como configurar o Contêiner de Estivador Único do Elastic Beanstalk para servir HTTPS e HTTP (redirecionamento para HTTPS). Você pode ajustar a configuração conforme sua necessidade.

    
por 17.07.2015 / 19:02
8

Também é possível fazer isso com mais facilidade, sem tocar no balanceador de carga, usando o cabeçalho X-Forwarded-Proto definido pelo ELB. Aqui está o que acabei fazendo:

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;
        }
      }
    
por 11.08.2016 / 14:58
2

O Elastic Beanstalk não suporta várias portas de um Contêiner de Docker Único, portanto, você precisa lidar com isso no nível do proxy, conforme sugerido. No entanto, sua instância do EC2 não precisa saber sobre seu certificado, porque você pode encerrar a conexão SSL no balanceador de carga.

No diretório .ebextensions , crie uma configuração para o proxy nginx que contém duas configurações de servidor; um que proxies http://docker (a configuração padrão, porta 80) e um que redireciona para https (eu escolhi a porta 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'

Crie uma segunda configuração para o balanceador de carga e grupos de segurança do EB que os configura da seguinte maneira:

  • instância do EC2 :
    • Permitir tráfego nas portas 80/8080 do balanceador de carga
    • Permitir tráfego na porta 22 de qualquer lugar (para acesso ssh, opcional)
  • Balanceador de carga :
    • Encaminhar a porta 443 HTTPS para a porta 80 HTTP
    • Encaminhar a porta 80 HTTP para a porta 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>"
        } ]
    }
  }
}

(Nota: não se esqueça de substituir o SSLCertificateId e o VpcId pelos seus valores).

Qualquer tráfego na porta 80 do balanceador de carga (HTTP) atingirá a porta 8080 na instância do EC2, que é redirecionada para HTTPS. O tráfego na porta 443 no balanceador de carga (HTTPS) será exibido pela porta 80 na instância do EC2, que é o proxy do docker.

    
por 13.04.2016 / 03:55