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

所要時間3分
0

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

簡単な説明

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

シングルインスタンス環境では、プライベートキーと証明書をローカルで作成する必要があります。次に、証明書を AWS ID およびアクセス管理 (IAM) にアップロードします。

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

注: AWS コマンドラインインターフェイス (AWS CLI) コマンドの実行中にエラーが発生した場合は、「AWS CLI エラーのトラブルシューティング」を参照してください。また、AWS CLI の最新バージョンを使用していることを確認してください。

解決策

Elastic Beanstalk 環境を準備する

  1. Elastic Beanstalk 環境にトラフィックをルーティングするには、Amazon Route 53を使用して新しいドメインを登録するか、または別のドメインプロバイダーを使用して登録します。
  2. 環境の URL にリージョンが含まれている場合は、エイリアス名を作成します。環境の URL にリージョンが含まれていない場合は、CNAME レコードを作成します。
    重要: CNAME レコードは、2016 年より前に作成された環境に使用できます。Zone Apex ドメイン (ルートドメインまたはネイキッドドメインとも呼ばれる) で CNAME レコードを使用することはできません。詳細については、「エイリアスレコードと非エイリアスレコードの選択」を参照してください。
  3. ACM で証明書を作成するか、サードパーティまたは自己署名の証明書とプライベートキーを IAM にアップロードします。

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

  1. Elastic Beanstalk コンソールを開き、環境を選択します。
  2. ナビゲーションペインで、[構成] を選択します。
  3. [ロードバランサー] カテゴリーで、[変更] を選択します。
  4. ポート 443 のリスナーを追加するには、Elastic Beanstalk 環境内のロードバランサーに基づいて、次の手順を実行します。

Classic Load Balancer

次の手順を実行します。

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

Application Load Balancer

次の手順を実行します。

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

Network Load Balancer

次の手順を実行します。

  1. [リスナーを追加] を選択します。
  2. [ポート] には、着信トラフィックポート (通常は 443) を入力します。
  3. [追加] を選択してから、[適用] を選択します。

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:
    
  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 をご使用の環境の値に置き換えます。

    上記の例には、HTTPS 接続を許可するためのポート 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"]}
      # Add 443-outbound to load 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"]}

    これで、ロードバランサーが HTTPS を使用してバックエンドインスタンスに安全に接続するようになりました。ロードバランサーは、証明書が自己署名証明書であるか、信頼できる認証局から発行されたものであるかを問わず、インスタンスからのすべての証明書を受け入れます。

    注: ロードバランサーには、特定の証明書のみを信頼するようにロードバランサーに指示するポリシーを追加できます。たとえば、次の .ebextensions/https-backendauth.config ファイルは 2 つのポリシーを作成します。1 つのポリシーではパブリック証明書を指定し、もう 1 つのポリシーではポート 443 への接続にはパブリック証明書のみを信頼するようにロードバランサーに指示します。

    option_settings:
      # Backend Encryption Policy
      aws:elb:policies:backendencryption:
        PublicKeyPolicyNames: backendkey
        InstancePorts:  443
      # Public Key Policy
      aws:elb:policies:backendkey:
        PublicKey: |
          -----BEGIN CERTIFICATE-----
          ################################################################
          ################################################################
          ################################################################
          ################################################################
          ################################################
          -----END CERTIFICATE-----
  4. インスタンスで実行されるプロキシサーバーを設定して、HTTPS を終了します。

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

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

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

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

    次の例では、.ebextensions を使用してポート 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
  2. インスタンスで実行されるプロキシサーバーを設定して、HTTPS を終了します。

    注: 設定はソリューションスタックに応じて異なります。ソリューションスタックの .ebextensions は、.ebextensions にプライベートキーとサーバー証明書の値をハードコーディングします。これらのファイルのセキュリティをさらに高めるには、Amazon S3 にコンテンツをアップロードし、S3Auth を使用してそれらを Amazon EC2 にプルすることができます。

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

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

関連するコンテンツ