ELB の転送時の暗号化設定の確認

クライアント接続とバックエンド接続の暗号化をそれぞれ確認してください。

説明

Classic ELB が HTTP で通信すると、その区間の認証情報や機密リクエストデータが平文で送信される場合があります。クライアントと ELB の間、ELB とバックエンドの間の保護をそれぞれ確認する必要があります。

ポート 443 だけでは暗号化は有効になりません。一方、TCP リスナーを通して TLS をそのまま転送する構成もあるため、実際に暗号化が終端される場所を確認してください。

想定される影響

  • 平文区間を監視・改ざんできる攻撃者に、データやセッション情報が漏えいするおそれがあります。
  • 証明書やバックエンドプロトコルの変更を誤ると、接続に障害が生じる場合があります。

対処方法

ELB で TLS を終端する場合は、Protocol に HTTPS または SSL を指定し、有効なサーバー証明書と適切な TLS ポリシーを関連付けてください。バックエンドも暗号化する場合は、サーバーが対応する InstanceProtocol とポートを設定してください。バックエンド証明書の検証が必要なら、別途バックエンド認証ポリシーも構成し、両方の接続を試験してください。

例

リスナーの設定抜粋で、ネットワークと TLS ポリシーは省略しています。証明書 ARN を実際の値に置き換えてください。変更後の例では、バックエンドがポート 80 で HTTPS を提供する必要があります。

変更前

yaml
Resources:
  MyLoadBalancer:
    Type: AWS::ElasticLoadBalancing::LoadBalancer
    Properties:
      Listeners:
        - InstancePort: "80"
          InstanceProtocol: HTTP
          LoadBalancerPort: "443"
          Protocol: HTTP

クライアント側のポートが 443 でも、Protocol と InstanceProtocol が HTTP のため、両区間とも平文の HTTP 通信になります。

変更後

yaml
Resources:
  MyLoadBalancer:
    Type: AWS::ElasticLoadBalancing::LoadBalancer
    Properties:
      Listeners:
        - InstancePort: "80"
          InstanceProtocol: HTTPS
          LoadBalancerPort: "443"
          Protocol: HTTPS
          SSLCertificateId: arn:aws:iam::123456789012:server-certificate/my-server-certificate

両方の接続に HTTPS を指定します。これだけでバックエンド証明書の検証ポリシーが追加されるわけではないため、必要なサーバー認証も別途確認してください。

参考資料