Elastic Beanstalk Force https


12

AWS Elastic Beanstalkを使用してデプロイしているサイトでHTTPSを強制する問題があります。

EmberJSを使用したフロントエンドアプリケーションです。私は、httpトラフィックをhttpsにリダイレクトする方法を見つけようとして、何日も円を巡回してきました。EC2マシンでAmazon Linux AMIを使用しています。

HTTPSを強制するのはElastic Beanstalk内ではないという結論に達しました(これが正しいかどうかはまだわかりません)。Elastic Beanstalk Load Balancerを介してHTTPとHTTPSの両方を許可し、サーバーでリダイレクトしようとしています。

ここで問題が発生します。ヘッダーにmod_rewrite基づいた書き換えルールに関する多くの答えを見つけX-Forwarded-Protoていますが、検索検索によると、そのファイルはEC2マシン上に存在しません。

また、.ebextensionsディレクトリ内に構成ファイルを作成しようとしましたが、それも機能しませんでした。

私がやろうとしている主なことは、ユーザーがhttpアドレスにアクセスしようとするとhttpsにリダイレクトされるようにすることです。ポインタや提案は大歓迎です、ありがとう!

編集:Python 3.4を実行する64ビットDebian jessie v1.4.1を使用しています(事前構成済み-Docker)


インターネットは、この問題に対する単一の完全で実用的なソリューションに同意できないようです。うまくいけば、ここで私の投稿でいくつかの助けを得ることができます。これを思い付くには、最後にフープを飛び越えなければなりませんでした。
ADTC

回答:


7

環境によって構成が異なるため、使用するElastic Beanstalk環境を指定する必要があると思います(サポートされているプラ​​ットフォームを参照)。

基本的に、カスタマイズする必要があります:

  • エラスティックロードバランサー
    • ポート80でリッスンし、EC2インスタンスのポート80にプロキシします。
    • ポート443でリッスンし、EC2インスタンスのポート443にプロキシします。
  • EC2 Webサーバー/プロキシ
    • ポート80でリッスンし、HTTPSへのリダイレクトで応答します。
    • ポート443でリッスンし、リクエストを処理します。

カスタマイズするには、CLIまたはを使用できます.ebextensions

AWS Elastic BeanstalkでHTTPSおよびHTTPリダイレクト有効にするをチェックできます。Elastic BeanstalkシングルDockerコンテナがHTTPSおよびHTTP(HTTPSにリダイレクト)を提供するように設定する方法を説明します。必要に応じて構成を調整できます。


素晴らしい記事です。私はこれを試しています。
awwester

そのファイル内に証明書を含めない方法のアイデアは、むしろソース管理に保持しませんか?ロードした証明書はすでにどこかで利用可能ですか?ファイルシステムでそれらを見つけることができないようです
-awwester

SSL証明書ファイルをS3に配置できます。Elastic BeanstalkがプライベートS3オブジェクトをダウンロードできるようにするには、これを読むことができます。
エドワードサミュエル

ELB SSL証明書については、AWSドキュメント「Elastic Load BalancingのSSL証明書」に従ってください。次に、SSL証明書リソースをarn:aws:iam::123456789012:server-certificate/YourSSLCertificate形式で取得できます。
エドワードサミュエル

私はSSL証明書を設定しており、00-ロードバランサーに入る実際のUIを持っています(実際にはUIを介してロードバランサーの設定を行っています)が、サーバーに配置する場所を取得できないようです設定ssl_certificate /opt/ssl/default-ssl.crt;証明書の情報を取得すると、「パス」が表示されますが、「/」だけ
です-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コンテナからの複数のポートをサポートしていないため、提案されているようにプロキシレベルでこれを処理する必要があります。ただし、ロードバランサーでSSL接続を終了できるため、EC2インスタンスは証明書について知る必要はありません。

あなたには.ebextensions、ディレクトリ、2つのサーバーのconfigsが含まれている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'

次のようにセットアップするEBロードバランサーとセキュリティグループの2番目の構成を作成します。

  • 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を値に置き換えることを忘れないでください)。

ロードバランサー(HTTP)のポート80のトラフィックは、ECSインスタンスのポート8080にヒットし、HTTPSにリダイレクトされます。ロードバランサー(HTTPS)のポート443のトラフィックは、ドッカープロキシであるEC2インスタンスのポート80で処理されます。


0

Terraformを使用して、ElasticBeanstalkでHTTPからHTTPSへのリダイレクトを有効にします。

追加のリスナールールを追加しました

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 = ["*.*"]
    }
  }
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.