如何為我的 Elastic Beanstalk 環境設定 HTTPS?

3 分的閱讀內容
0

我想為 AWS Elastic Beanstalk 環境設定 HTTPS,以便加密從負載平衡器至 Amazon Elastic Compute Cloud (Amazon EC2) 執行個體的資料。

簡短描述

如果您為 Elastic Beanstalk 環境設定自訂網域名稱,則可以使用 HTTPS 允許使用者安全地連線到您的網站。如果您並未擁有網域名稱,則可將 HTTPS 與自我簽署憑證搭配使用,以進行開發和測試。

對於單一執行個體環境,您必須在本機建立私有金鑰和憑證。然後,將憑證上傳至 AWS Identity and Access Management (IAM)。

最佳實務是使用 AWS Certificate Manager (ACM) 以程式設計方式佈建、管理和部署伺服器憑證。您也可以使用 AWS Command Line Interface (AWS CLI) 將第三方或自我簽署憑證和私有金鑰上傳至 IAM。如果您的 AWS 區域無法使用 ACM,則請使用 AWS CLI。

**注意:**如果您在執行 AWS Command Line Interface (AWS CLI) 命令時收到錯誤,請參閱疑難排解 AWS CLI 錯誤。此外,請確定您使用的是最新的 AWS CLI 版本

解決方案

準備您的 Elastic Beanstalk 環境

  1. 若要將流量路由到您的 Elastic Beanstalk 環境,可使用 Amazon Route 53 註冊新網域或向其他網域供應商註冊。
  2. 如果您的環境網址包含區域,則請建立別名名稱。如果您的環境網址不包含區域,則請建立 CNAME 記錄。
    **重要:**您可以將 CNAME 記錄用於您在 2016 年之前建立的環境。您無法將 CNAME 記錄與 Zone Apex 網域 (也稱為根網域或裸網域) 搭配使用。如需詳細資訊,請參閱在別名與非別名記錄之間選擇
  3. 在 ACM 中建立憑證,或將第三方或自我簽署憑證和私有金鑰上傳至 IAM

將接聽程式新增至負載平衡器

  1. 開啟 Elastic Beanstalk 主控台,然後選取您的環境。
  2. 在導覽窗格中,選擇組態
  3. 負載平衡器類別中,選擇修改
  4. 若要新增連接埠 443 的接聽程式,請完成 Elastic Beanstalk 環境中有關負載平衡器的步驟。

Classic Load Balancer

完成下列步驟:

  1. 選擇新增接聽程式
  2. 連接埠中,輸入傳入流量連接埠 (通常為 443)。
  3. 通訊協定中,選擇 HTTPS
  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

    前述範例包括透過連接埠 80 傳入和傳出以允許 HTTPS 連線。如只允許安全連線,請在 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 檔案會建立兩項政策。一項政策會指定公有憑證,另一項政策則告知負載平衡器僅信任該公有憑證以連線至連接埠 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. 允許將連接埠 443 上的流量傳入執行 Elastic Beanstalk 應用程式的執行個體。

    下列範例會使用 .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 官方已更新 6 個月前