

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 在負載平衡的 Elastic Beanstalk 環境中設定端對端加密
<a name="configuring-https-endtoend"></a>

終止負載平衡器的安全連線並於後端使用 HTTP，對您的應用程式而言可能已足夠。即使在相同帳戶中執行， AWS 資源間的網路流量仍無法由不屬於該連線的執行個體接聽。

不過，若正開發的應用程式需要遵循嚴格的外部法規，您可能需要保護所有網路連線。您可使用 Elastic Beanstalk 主控台或[組態檔案](ebextensions.md)，將您 Elastic Beanstalk 環境的負載平衡器安全地連接至後端執行個體，以滿足這些要求。下列程序著重於組態檔案。

首先，[將安全接聽程式新增至您的負載平衡器](configuring-https-elb.md) (若尚未執行)。

您亦必須設定環境中的執行個體，以接聽安全的連接埠並終止 HTTPS 連線。每個組態視平台而有所不同。如需說明，請參閱 [在執行個體設定 HTTPS 終止](https-singleinstance.md)。您的 EC2 執行個體可使用[自我簽署的簽憑](configuring-https-ssl.md)，而不會出現問題。

接著，將接聽程式設定為在您應用程式所用之安全連接埠上使用 HTTPS 來轉送流量。根據您環境中使用的負載平衡器類型，使用以下其中一個組態檔案。

**`.ebextensions/https-reencrypt-clb.config`**

搭配 Classic Load Balancer 使用此組態檔案。除了設定負載平衡器，組態檔案也會變更預設的運作狀態檢查來使用連接埠 443 和 HTTPS，以確保負載平衡器能夠安全地連線。

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

**`.ebextensions/https-reencrypt-alb.config`**

搭配 Application Load Balancer 使用此組態檔案。

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

**`.ebextensions/https-reencrypt-nlb.config`**

搭配 Network Load Balancer 使用此組態檔案。

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

`DefaultProcess` 選項會以此方式命名，是因為 Application Load Balancer 可能在相同連接埠上，針對傳送至特定路徑的流量使用非預設的接聽程式 (詳細資訊請參閱[Application Load Balancer](environments-cfg-alb.md))。以 Network Load Balancer 而言，此選項會指定此接聽程式的唯一目標程序。

在此範例中，我們將程序命名為 `https`，因為它會接聽安全 (HTTPS) 流量。由於 Network Load Balancer 僅能與 TCP 搭配運作，因此接聽程式會使用 TCP 通訊協定，將流量傳送至指定連接埠上的程序。此作法沒問題，因為 HTTP 和 HTTPS 的網路流量實作於 TCP 之上。

**注意**  
EB CLI 和 Elastic Beanstalk 主控台會為前述選項套用建議的數值。若您想要使用組態檔進行相同的設定，您必須移除這些設定。如需詳細資訊，請參閱「[建議值](command-options.md#configuration-options-recommendedvalues)」。

在接下來的任務，您需要修改負載平衡器的安全群組，以允許流量。根據您啟動您環境的 [Amazon Virtual Private Cloud](https://docs.aws.amazon.com/vpc/latest/userguide/) (Amazon VPC)—預設 VPC 或自訂 VPC—負載平衡器的安全群組將會不同。在預設 VPC 中，Elastic Load Balancing 會提供預設安全群組，所有負載平衡器均可加以使用。在您建立的 Amazon VPC 中，Elastic Beanstalk 會針對要使用的負載平衡器建立安全群組。

為了同時滿足這兩種情境，您可建立安全群組，並指示 Elastic Beanstalk 使用該安全群組。下列組態檔案會建立安全群組，並將其連接至負載平衡器。

**`.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
```

將醒目提示的文字取代為您的預設或自訂 VPC ID。先前範例包含連接埠 80 上的進出流量，可允許 HTTP 連線。若您僅允許安全連線，可移除這些屬性。

最後，新增可允許負載平衡器安全群組和執行個體安全群組透過連接埠 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 安全連接至您的後端執行個體。不論您執行個體的憑證為自我簽署或由信任憑證授權單位核發，負載平衡器都會接受任何向其遞交的憑證。

您可新增政策至負載平衡器，指示其僅信任特定憑證，藉此變更此行為。下列組態檔案會建立兩個政策。一個政策指定公有憑證，另一個則指示負載平衡器僅信任該憑證來連接至執行個體連接埠 443。

**`.ebextensions/https-backendauth.config`**

```
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-----
```

將醒目提示的文字取代為您的 EC2 執行個體公有憑證的內容。