Elastik Beanstalk kuvveti https


12

AWT Elastik Beanstalk aracılığıyla dağıttığım bir site ile HTTPS'yi zorlamakta sorunlar yaşıyorum.

EmberJS kullanan bir ön uç uygulamasıdır. Http trafiğini https'ye nasıl yönlendireceğinizi anlamaya çalışarak günlerdir çevrelerde dolaşıyorum. EC2 makinemde Amazon Linux AMI kullanıyorum.

HTTPS'yi zorladığımın Elastik Beanstalk içinde olmadığı sonucuna vardım (hala doğru olup olmadığından emin değilim). Elastik Beanstalk Yük Dengeleyicim aracılığıyla hem HTTP hem de HTTPS'ye izin veriyorum ve sunucuya yeniden yönlendirmeye çalışıyorum.

Burada sorun yaşıyorum. Başlığa mod_rewritedayalı olmayan yeniden yazma kuralları hakkında birçok yanıt buluyorum X-Forwarded-Proto, ancak bu dosya bir arama aramasına göre EC2 makinemde mevcut değil.

Ayrıca .ebextensionsdizinde bir yapılandırma dosyası oluşturmaya çalıştım , ama bu da işe yaramadı.

Yapmaya çalıştığım en önemli şey, http adresini vurmaya çalışırken kullanıcıların https'ye yönlendirilmeleri. Herhangi bir işaretçi veya öneri çok takdir, teşekkürler!

EDIT: Python 3.4 (önceden yapılandırılmış - Docker) çalışan 64bit Debian jessie v1.4.1 kullanıyorum


Internet'in bu soruna tek, eksiksiz ve çalışan bir çözüm üzerinde anlaşamayacağı anlaşılıyor. Umarım burada yazıma biraz yardım alabilirsiniz . Sonunda bunu bulmak için çemberlerden atlamak zorunda kaldım.
ADTC

Yanıtlar:


7

Hangi Elastik Beanstalk ortamını kullandığınızı belirtmeniz gerektiğini düşünüyorum (bkz: Desteklenen Platformlar ), çünkü farklı ortam farklı konfigürasyona sahiptir.

Temel olarak, özelleştirmeniz gerekir:

  • Elastik Yük Dengeleyici :
    • 80 numaralı bağlantı noktasını dinleyin ve EC2 yönetim ortamı 80 numaralı bağlantı noktasına proxy yapın.
    • 443 numaralı bağlantı noktasını dinleyin ve EC2 yönetim ortamı bağlantı noktası 443 ile proxy yapın.
  • EC2 Web Sunucusu / Proxy :
    • 80 numaralı bağlantı noktasını dinleyin ve HTTPS'ye yönlendirmeyle yanıt verin.
    • 443 numaralı bağlantı noktasını dinleyin ve istekte bulunun.

Özelleştirmek için CLI veya kullanabilirsiniz .ebextensions.

AWS Elastik Beanstalk'ta HTTPS ve HTTP- Yeniden Yönlendirmeyi Etkinleştir seçeneğini işaretleyebilirsiniz . Size Elastik Beanstalk Tek Docker Kapsayıcı HTTPS ve HTTP hizmetini (HTTPS'ye yönlendirmeyi) nasıl yapılandıracağınızı anlatır. Yapılandırmayı ihtiyacınıza göre ayarlayabilirsiniz.


hey, harika bir makale, bunu denemeye devam ediyorum.
awwester

herhangi bir fikrin bu dosyanın içerisine nasıl dahil edilmeyeceğini, bunu kaynak kontrolünde tutmayı tercih etmez misiniz? Yüklediğimiz sertifikalar zaten bir yerde mevcut mu? Onları dosya sisteminde bulamıyorum
awwester

SSL sertifika dosyanızı S3'e koyabilirsiniz. Elastik Beanstalk indir özel S3 nesneyi izin vermek için, okuyabilir bu .
Edward Samuel

ELB SSL sertifikası için AWS belgelerini takip edebilirsiniz: Elastik Yük Dengeleme için SSL Sertifikaları . Daha sonra SSL sertifika kaynağını arn:aws:iam::123456789012:server-certificate/YourSSLCertificatebiçiminde alabilirsiniz.
Edward Samuel

SSL sertifikası ayarladım ve 00-yük dengeleyici (aslında UI üzerinden yük dengeleyici yapılandırması yapıyorum) olacak arn var, ama sunucuya koymak için yer alamıyorum ayarlar ssl_certificate /opt/ssl/default-ssl.crt;ı sertifika bilgileri olsun, "/" bana bir "yol" verir ama sadece bir
awwester

10

X-Forwarded-ProtoELB tarafından ayarlanan başlığı kullanarak yük dengeleyiciye dokunmadan bunu biraz daha kolay yapmak da mümkündür . İşte yaptığım şey:

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;
        }
      }

Şimdiye kadar en kolay çözüm. Sana yeterince teşekkür edemem!
Chris Martin

Evet, çoğu senaryoda bu doğru yoldur.
jlegler

3

Elastik Beanstalk, Tek Docker Konteynerindeki birden fazla bağlantı noktasını desteklemez, bu nedenle bunu önerilen proxy düzeyinde işlemeniz gerekir. Ancak EC2 yönetim ortamınızın sertifikanızı bilmesi gerekmez, çünkü yük dengeleyicisinde SSL bağlantısını sonlandırabilirsiniz.

Senin içinde .ebextensionsdizine, iki sunucu yapılandırmaları içeren nginx proxy için bir yapılandırma oluşturmak; biri proxy http://docker(varsayılan yapılandırma, bağlantı noktası 80) ve diğeri https'ye yönlendirir (bağlantı noktası 8080'i seçtim).

.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'

EB yük dengeleyici ve güvenlik grupları için bunları aşağıdaki gibi ayarlayan ikinci bir yapılandırma oluşturun:

  • EC2 örneği :
    • Yük dengeleyiciden 80/8080 bağlantı noktalarında trafiğe izin ver
    • Bağlantı noktası 22'de her yerden trafiğe izin ver (ssh erişimi için, isteğe bağlı)
  • Yük dengeleyici :
    • Bağlantı noktası 443 HTTPS'yi bağlantı noktası 80 HTTP'ye ilet
    • Bağlantı noktası 80 HTTP'yi bağlantı noktası 8080 HTTP'ye ilet

.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>"
        } ]
    }
  }
}

(Not: SSLCertificateId ve VpcId değerlerini değiştirmeyi unutmayın).

Yük dengeleyicinin (HTTP) 80 numaralı bağlantı noktasındaki tüm trafik EC2 örneğinde HTTPS'ye yönlendiren 8080 numaralı bağlantı noktasına çarpacaktır. Yük dengeleyicideki (HTTPS) 443 numaralı bağlantı noktasındaki trafik, docker proxy'si olan EC2 örneğinde 80 numaralı bağlantı noktası tarafından sunulur.


0

ElastikBeanstalk'ta HTTP'den HTTPS'ye yönlendirmeyi etkinleştirmek için Terraform'u kullanıyorum,

Az önce ek Dinleyici Kuralı ekledim

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 = ["*.*"]
    }
  }
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.