説明
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 を指定します。これだけでバックエンド証明書の検証ポリシーが追加されるわけではないため、必要なサーバー認証も別途確認してください。