Lực đàn hồi Beanstalk https


12

Tôi đang gặp sự cố khi buộc HTTPS với một trang web mà tôi đang triển khai thông qua AWS Elastic Beanstalk.

Đây là một ứng dụng lối vào sử dụng EmberJS. Tôi đã đi lòng vòng trong nhiều ngày để cố gắng tìm cách chuyển hướng lưu lượng truy cập http sang https. Tôi đang sử dụng Amazon Linux AMI trên máy EC2 của mình.

Tôi đã đi đến kết luận (vẫn không chắc liệu điều này có đúng không) rằng nó không nằm trong Elastic Beanstalk mà tôi buộc HTTPS. Tôi đang cho phép cả HTTP và HTTPS thông qua Bộ cân bằng tải Beanstalk đàn hồi của mình và đang cố gắng chuyển hướng trên máy chủ.

Đây là lúc tôi gặp vấn đề. Tôi đang tìm thấy nhiều câu trả lời về các quy tắc viết lại mà không mod_rewritecó dựa trên X-Forwarded-ProtoTiêu đề, nhưng tệp đó không tồn tại trên máy EC2 của tôi theo tìm kiếm tìm kiếm.

Tôi cũng đã thử tạo một tệp cấu hình trong .ebextensionsthư mục, nhưng nó cũng không hoạt động.

Điều chính tôi đang cố gắng làm là có người dùng hướng đến https khi cố gắng truy cập địa chỉ http. Bất kỳ con trỏ hoặc đề nghị được nhiều đánh giá cao, cảm ơn!

EDIT: Tôi đang sử dụng Debian 64 bit jessie v1.4.1 chạy Python 3.4 (Cấu hình sẵn - Docker)


Dường như Internet không thể đồng ý về một giải pháp duy nhất, đầy đủ và hiệu quả cho vấn đề này. Hy vọng bạn có thể nhận được một số trợ giúp ở đây trong bài viết của tôi . Cuối cùng tôi đã phải nhảy qua vòng để tìm ra thứ này.
ADTC

Câu trả lời:


7

Tôi nghĩ bạn cần chỉ định môi trường đàn hồi nào mà bạn sử dụng (xem: Nền tảng được hỗ trợ ), vì môi trường khác nhau có cấu hình khác nhau.

Về cơ bản, bạn cần tùy chỉnh:

  • Cân bằng tải đàn hồi :
    • Nghe trên cổng 80 và ủy quyền cho cổng 80 của EC2.
    • Nghe trên cổng 443 và ủy quyền cho cổng 443 của EC2.
  • Máy chủ web EC2 / Proxy :
    • Nghe trên cổng 80 và phản hồi với chuyển hướng đến HTTPS.
    • Nghe trên cổng 443 và phục vụ yêu cầu.

Để tùy chỉnh nó, bạn có thể sử dụng CLI hoặc .ebextensions.

Bạn có thể kiểm tra Bật Bật HTTPS và Chuyển hướng HTTP trên Beanstalk AWS . Nó cho bạn biết cách định cấu hình Container Docker đàn hồi duy nhất phục vụ HTTPS và HTTP (chuyển hướng đến HTTPS). Bạn có thể điều chỉnh cấu hình theo nhu cầu của bạn.


này, bài viết tuyệt vời, tôi đang trong quá trình thử nó
awwester

Bất kỳ ý tưởng làm thế nào để không bao gồm các certs trong tập tin đó, thà không giữ điều đó trong kiểm soát nguồn? Là certs chúng tôi đã tải đã có sẵn ở đâu đó? Tôi dường như không thể tìm thấy chúng trên hệ thống tập tin
awwester

Bạn có thể đặt tệp chứng chỉ SSL của mình trong S3. Để cho phép Elastic Beanstalk tải xuống đối tượng S3 riêng tư, bạn có thể đọc phần này .
Edward Samuel

Đối với chứng chỉ SSL ELB, bạn có thể làm theo tài liệu AWS: Chứng chỉ SSL cho Cân bằng tải đàn hồi . Sau đó, bạn có thể nhận được tài nguyên chứng chỉ SSL ở arn:aws:iam::123456789012:server-certificate/YourSSLCertificateđịnh dạng.
Edward Samuel

Tôi đã thiết lập chứng chỉ SSL và tôi có arn sẽ đi trong bộ cân bằng tải 00 (tôi thực sự đang thực hiện cấu hình cân bằng tải thông qua giao diện người dùng), nhưng dường như không thể có được vị trí để đặt vào máy chủ cài đặt ssl_certificate /opt/ssl/default-ssl.crt;Khi tôi nhận được thông tin cho chứng chỉ, nó sẽ cho tôi một "đường dẫn" nhưng nó chỉ là "/"
awwester

10

Cũng có thể thực hiện việc đó dễ dàng hơn một chút, mà không cần chạm vào bộ cân bằng tải, bằng cách sử dụng X-Forwarded-Prototiêu đề do ELB đặt. Đây là những gì tôi đã làm:

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

Cho đến nay các giải pháp dễ dàng nhất. Không thể cảm ơn đủ!
Chris Martin

Đúng, đây là cách đúng trong hầu hết các kịch bản.
kẻ lừa đảo

3

Elastic Beanstalk không hỗ trợ nhiều cổng từ Container Docker đơn, vì vậy bạn cần xử lý việc này ở cấp proxy như đề xuất. Tuy nhiên, phiên bản EC2 của bạn không cần biết về chứng chỉ của bạn, bởi vì bạn có thể chấm dứt kết nối SSL tại bộ cân bằng tải.

Trong .ebextensionsthư mục của bạn , tạo cấu hình cho proxy nginx chứa hai cấu hình máy chủ; một proxy http://docker(cấu hình mặc định, cổng 80) và một proxy chuyển hướng sang https (Tôi đã chọn cổng 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'

Tạo cấu hình thứ hai cho bộ cân bằng tải EB và các nhóm bảo mật thiết lập chúng như sau:

  • Ví dụ EC2 :
    • Cho phép lưu lượng truy cập trên các cổng 80/8080 từ bộ cân bằng tải
    • Cho phép lưu lượng truy cập trên cổng 22 từ bất cứ đâu (để truy cập ssh, tùy chọn)
  • Cân bằng tải :
    • Chuyển tiếp cổng 443 HTTPS sang cổng 80 HTTP
    • Chuyển tiếp cổng 80 HTTP sang cổng 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>"
        } ]
    }
  }
}

(Lưu ý: đừng quên thay thế SSLCertertId và VpcId bằng các giá trị của bạn).

Bất kỳ lưu lượng truy cập nào trên cổng 80 của bộ cân bằng tải (HTTP) sẽ chạm vào cổng 8080 trên phiên bản EC2, chuyển hướng đến HTTPS. Lưu lượng truy cập trên cổng 443 trên bộ cân bằng tải (HTTPS) cuối cùng sẽ được phục vụ bởi cổng 80 trên phiên bản EC2, đó là proxy docker.


0

Tôi sử dụng Terraform để bật chuyển hướng HTTP sang HTTPS trên ElasticBeanstalk,

Tôi vừa thêm Quy tắc người nghe bổ sung

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 = ["*.*"]
    }
  }
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.