スキップしてコンテンツを表示

Elastic Beanstalk 環境に HTTPS を設定するにはどうすればよいですか?

所要時間3分
0

ロードバランサーから Amazon Elastic Compute Cloud (Amazon EC2) インスタンスへのデータを暗号化できるように、AWS Elastic Beanstalk 環境に HTTPS を設定したいと考えています。

簡単な説明

Elastic Beanstalk 環境にカスタムドメイン名を設定した場合、HTTPS を使用すると、ユーザーがウェブサイトに安全に接続できるようにすることができます。ドメイン名を所有していない場合は、自己署名証明書を使用すると開発およびテスト目的で HTTPS を使用できます。

単一インスタンス環境では、プライベートキーと証明書をローカルで作成する必要があります。次に、証明書を AWS Identity and Access Management (IAM) にアップロードします。

ロードバランサーと AWS Certificate Manager (ACM) を併用し、サーバー証明書をプログラムによりプロビジョニング、管理、デプロイすることをおすすめします。AWS コマンドラインインターフェイス (AWS CLI) を使用して、サードパーティーまたは自己署名の証明書とプライベートキーを IAM にアップロードすることもできます。ACM がお使いの AWS リージョンで利用できない場合は、AWS CLI を使用してください。

解決策

Elastic Beanstalk 環境を準備する

Elastic Beanstalk 環境にトラフィックをルーティングするには、Amazon Route 53を使用して新しいドメインを登録するか、別のドメインプロバイダーを使用して登録します。

環境の URL にリージョンが含まれている場合は、エイリアス名を作成します。環境の URL にリージョンが含まれていない場合は、CNAME レコードを作成します。

重要: CNAME レコードは、2016 年より前に作成された環境に使用できます。Zone Apex ドメイン (別称「ルートドメイン」または「ネイキッドドメイン」) では、CNAME レコードを使用できません。詳細については、「エイリアスレコードと CNAME レコードの比較」を参照してください。

次に、ACM で証明書を作成するか、サードパーティまたは自己署名の証明書とプライベートキーを IAM にアップロードします。

ロードバランサーにリスナーを追加する

次の手順を実行します。

  1. Elastic Beanstalk コンソールを開きます。
  2. 環境を選択します。
  3. ナビゲーションペインで [構成] を選択します。
  4. [ロードバランサー] カテゴリで [変更] を選択します。
  5. ポート 443 に対するリスナーを追加するには、Elastic Beanstalk 環境で使用するロードバランサーに応じて、次の手順を実行します。
    注: Application Load Balancer または Network Load Balancer の使用をおすすめします。

Application Load Balancer

次の手順を実行します。

  1. [リスナーを追加] を選択します。
  2. [ポート] に受信トラフィックのポートを入力します。(例: 443)。
  3. [プロトコル][HTTPS] を選択します。
  4. [SSL 証明書] で使用する証明書を選択し、ドロップダウンリストから [SSL ポリシー] を選択します。
  5. [追加] を選択し、[適用] を選択します。

Network Load Balancer

次の手順を実行します。

  1. [リスナーを追加] を選択します。
  2. [ポート] に受信トラフィックのポートを入力します。(例: 443)。
  3. [追加] を選択し、[適用] を選択します。

Classic Load Balancer

次の手順を実行します。

  1. [リスナーを追加] を選択します。
  2. [ポート] に受信トラフィックのポートを入力します。(例: 443)。
  3. [プロトコル][HTTPS] を選択します。
  4. [インスタンスポート]80 を入力します。
  5. [インスタンスプロトコル] で**[HTTP]** を選択します。
  6. [SSL 証明書] で使用する証明書を選択し、ドロップダウンリストから [SSL ポリシー] を選択します。
  7. [追加] を選択し、[適用] を選択します。

インスタンスを設定し、HTTPS 接続を停止する

インスタンスを設定して HTTPS 接続を停止するには、.ebextensions 設定ファイルを使用して、インスタンスで実行するソフトウェアを変更します。詳細については、「Linux で .NET Core を実行している Amazon EC2 インスタンスで HTTPS を終了させる」を参照してください。設定ファイルを使用してセキュリティグループを変更しても、安全な接続を許可できます。

重要: 単一インスタンス環境を使用する場合は、次の手順を省略してください。「単一インスタンス環境で、インスタンス上の HTTPS (エンドツーエンド HTTPS) を停止する」セクションの手順を実行します。

インスタンスを設定し、HTTPS 接続を停止するには、次の手順を実行します。

  1. ロードバランサーにセキュアリスナーを追加します。Elastic Beanstalk 環境で使用するロードバランサーのタイプに応じて、次のいずれかの設定ファイルを使用します。
    Classic Load Balancer には、.ebextensions/https-reencrypt-clb.config ファイルを使用します。

    option_settings:
      aws:elb:listener:443:
        InstancePort: 443
        InstanceProtocol: HTTPS
      aws:elasticbeanstalk:application:
        Application Healthcheck URL: HTTPS:443/

    Application Load Balancer には、.ebextensions/https-reencrypt-alb.config ファイルを使用します。

    option_settings:
      aws:elbv2:listener:443:
        DefaultProcess: https
        ListenerEnabled: 'true'
        Protocol: HTTPS
      aws:elasticbeanstalk:environment:process:https:
        Port: '443'
        Protocol: HTTPS

    Network Load Balancer には、.ebextensions/https-reencrypt-nlb.config ファイルを使用します。

    option_settings:
      aws:elbv2:listener:443:
        DefaultProcess: https
        ListenerEnabled: 'true'
      aws:elasticbeanstalk:environment:process:https:
        Port: '443'
  2. ポート 443 でトラフィックを受信するようにロードバランサーを更新します。
    新しいセキュリティグループを作成し、Elastic Beanstalk がそのセキュリティグループを使用してポート 443 でトラフィックを受信できるようにします。たとえば、次の .ebextensions/https-lbsecuritygroup.config ファイルはセキュリティグループを作成し、そのセキュリティグループをロードバランサーにアタッチします。

    option_settings:
      # Use the custom security group for the load balancer
      aws:elb:loadbalancer:
        SecurityGroups: '`{ "Ref" : "loadbalancersg" }`'
        ManagedSecurityGroup: '`{ "Ref" : "loadbalancersg" }`'
    Resources:
      loadbalancersg:
        Type: AWS::EC2::SecurityGroup
        Properties:
          GroupDescription: load balancer security group
          VpcId: vpc-#######
          SecurityGroupIngress:
            - IpProtocol: tcp
              FromPort: 443
              ToPort: 443
              CidrIp: 0.0.0.0/0
            - IpProtocol: tcp
              FromPort: 80
              ToPort: 80
              CidrIp: 0.0.0.0/0
          SecurityGroupEgress:
            - IpProtocol: tcp
              FromPort: 80
              ToPort: 80
              CidrIp: 0.0.0.0/0

    注: VpcId を環境に応じた値に置き換えます。上記の例には、HTTP 接続を許可するためにポート 80 での入出力が含まれています。安全な接続のみを許可するには、SecurityGroupIngress セクションでポート 80 の設定を削除します。

  3. ロードバランサーのセキュリティグループとインスタンスのセキュリティグループ間の、ポート 443 での通信を許可する入力ルールと出力ルールを追加します。
    たとえば、次の .ebextensions/https-backendsecurity.config ファイルを使用します。

    Resources:
    # Add 443-inbound to instance security group (AWSEBSecurityGroup)
    httpsFromLoadBalancerSG:
    Type: AWS::EC2::SecurityGroupIngress
    Properties:
    GroupId: {"Fn::GetAtt" : ["AWSEBSecurityGroup", "GroupId"]}
    IpProtocol: tcp
    ToPort: 443
    FromPort: 443
    SourceSecurityGroupId: {"Fn::GetAtt" : ["loadbalancersg", "GroupId"]}
    balancer security group (loadbalancersg)
      httpsToBackendInstances:
        Type: AWS::EC2::SecurityGroupEgress
        Properties:
          GroupId: {"Fn::GetAtt" : ["loadbalancersg", "GroupId"]}
          IpProtocol: tcp
          ToPort: 443
          FromPort: 443
          DestinationSecurityGroupId: {"Fn::GetAtt" : ["AWSEBSecurityGroup", "GroupId"]}
  4. 次のスニペットを設定ファイルに追加し、.ebextensions ディレクトリに保存します。

    files:
      /etc/pki/tls/certs/server.crt:
        content: |
          -----BEGIN CERTIFICATE-----
          certificate file contents
          -----END CERTIFICATE-----
    
      /etc/pki/tls/certs/server.key:
        content: |      
          -----BEGIN RSA PRIVATE KEY-----
          private key contents
          -----END RSA PRIVATE KEY-----

    注: certificate file contents を実際の証明書ファイルの内容に、private key contents をプライベートキーの内容に置き換えてください。

    HTTPS ターミネーション設定は、ソリューションスタックによって異なります。ソリューションスタックの .ebextensions では、.ebextensions 内のプライベートキーとサーバー証明書の値がハードコーディングされます。Amazon Simple Storage Service (Amazon S3) にファイルのコンテンツをアップロードした後、S3Auth を使用してそのコンテンツを Amazon EC2 にプルすると、これらのファイルの安全性をさらに向上できます。

  5. files キーを使用してインスタンス /etc/pki/tls/certs/server.crt に次のファイルを作成します。

  6. 次の証明書ファイルを使用してインスタンスに証明書ファイルを作成します。

         -----BEGIN CERTIFICATE-----
      certificate file contents
      -----END CERTIFICATE-----
      -----BEGIN CERTIFICATE-----
      first intermediate certificate
      -----END CERTIFICATE-----
      -----BEGIN CERTIFICATE-----
      second intermediate certificate
      -----END CERTIFICATE-----

    注: certificate file contents を使用する証明書の内容に置き換えます。中間証明書がある場合は、サイト証明書の後に配置する server.crt に含めてください。

  7. /etc/pki/tls/certs/server.key を使用してインスタンスにプライベートキーファイルを作成します。
    注: private key contents を証明書リクエストまたは自己署名証明書の作成に使用したプライベートキーの内容に置き換えてください。

  8. インスタンスで実行するプロキシサーバーを設定し、HTTPS を終了させます。すべてのプラットフォームは、同じ方法でプロキシサーバーの設定を開始します。

  9. アプリケーションバンドルのルートにある**.ebextensions** という名前のディレクトリに設定ファイルを追加し、環境に設定ファイルをデプロイします。

  10. これらの設定ファイルが含まれるソースコードをデプロイします。

シングルインスタンス環境でインスタンスの HTTPS (エンドツーエンド HTTPS) を停止する

.ebextensions ファイルを使用して、Elastic Beanstalk アプリケーションが実行されているインスタンスへの受信トラフィックをポート 443 で許可します。

例:

Resources:
  sslSecurityGroupIngress:
    Type: AWS::EC2::SecurityGroupIngress
    Properties:
      GroupId: {"Fn::GetAtt" : ["AWSEBSecurityGroup", "GroupId"]}
      IpProtocol: tcp
      ToPort: 443
      FromPort: 443
      CidrIp: 0.0.0.0/0

次に、インスタンスで実行するプロキシサーバーを設定し、HTTPS を終了させます。

注: HTTPS ターミネーション設定は、ソリューションスタックによって異なります。ソリューションスタックの .ebextensions では、.ebextensions 内のプライベートキーとサーバー証明書の値がハードコーディングされます。Amazon Simple Storage Service (Amazon S3) にファイルのコンテンツをアップロードし、S3Auth を使用してそのコンテンツを Amazon EC2 にプルすると、これらのファイルの安全性をさらに向上できます。

環境に設定ファイルをデプロイするには、アプリケーションバンドルのルートにある**.ebextensions** という名前のディレクトリに設定ファイルを追加します。その後、これらの設定ファイルが含まれるソースコードをデプロイします。

AWS公式更新しました 6ヶ月前
コメントはありません

関連するコンテンツ