本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
在负载均衡的 Elastic Beanstalk 环境中配置 end-to-end加密
终止负载均衡器的安全连接并在后端上使用 HTTP 可能对应用程序已经足够。即使在同一账户下运行, Amazon 资源之间的网络流量也不会被不属于连接的实例侦听。
但是,如果您正在开发需要遵守严格外部规定的应用程序,则可能需要保护所有网络连接。您可以使用 Elastic Beanstalk 控制台或配置文件,将 Elastic Beanstalk 环境的负载均衡器安全地连接到后端实例以满足这些要求。以下过程将重点放在配置文件上。
首先,在负载均衡器中添加一个安全侦听器(如果尚未添加)。
您还必须配置环境中的实例,以侦听安全端口并终止 HTTPS 连接。此配置根据不同平台而有所变化。有关说明,请参阅在实例上配置 HTTPS 终止:您可以毫无问题地为 EC2 实例使用自签名证书。
接下来,配置侦听器在应用程序使用的端口上使用 HTTPS 转发流量。根据您的环境使用的负载均衡器类型,使用以下配置文件之一。
.ebextensions/https-reencrypt-clb.config
将此配置文件与经典负载均衡器配合使用。除了配置负载均衡器以外,该配置文件还更改默认运行状况检查以使用端口 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,它可能在同一端口上具有非默认侦听器,以用于侦听到特定路径的流量(如需详细信息,请参阅 应用程序负载均衡器)。对于 Network Load Balancer,该选项为该侦听器指定唯一的目标进程。
在此示例中,我们将进程命名为 https,因为它侦听安全 (HTTPS) 流量。由于 Network Load Balancer 只能使用 TCP,因此该侦听器使用 TCP 协议将流量发送到指定端口上的进程。由于 HTTP 和 HTTPS 网络流量是在 TCP 上实施的,因此,可以这样做。
注意
EB CLI 和 Elastic Beanstalk 控制台会对前面的选项应用建议的值。如果您需要使用配置文件来配置相同的项,则必须删除这些设置。有关更多信息,请参阅 建议值。
在下一个任务中,您需要将负载均衡器的安全组修改为允许流量。根据您启动环境所在的 Amazon Virtual Private Cloud (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 实例的公共证书的内容。