説明
ELB のセキュリティグループで必要なバックエンド接続やヘルスチェックを許可しないと、リクエスト転送が失敗したり、対象が異常と判断されたりする場合があります。接続された全グループと独立したルールを合わせて確認する必要があります。
CloudFormation で新しいグループの egress ルールを省略すると、デフォルトで全アウトバウンド通信が許可されます。設定の省略を通信遮断とみなさず、実際のルールを確認してください。セキュリティグループはステートフルであり、許可された接続の応答用に逆方向のルールを別途追加する必要はありません。
想定される影響
- 必要なバックエンドポートやヘルスチェック経路が遮断され、サービスに支障が生じる場合があります。
- 障害対応で全宛先を許可すると、不要なアウトバウンドアクセスが残るおそれがあります。
対処方法
ELB の実際の送信ルールを確認し、バックエンドサービスとヘルスチェックに必要な宛先とポートを許可してください。対象インスタンスの受信ルールは、ELB セキュリティグループからの通信を許可するよう設定してください。ほかの接続済みグループの広い許可も確認し、実際のリクエストとヘルスチェックを試験してください。
例
セキュリティグループの関連付けと egress 設定だけを比較します。リスナーと ELB のサブネット設定は省略しています。VpcId には ELB と同じ VPC の実際の識別子を渡してください。
変更前
yaml
Resources:
LoadBalancerSecurityGroup:
Type: AWS::EC2::SecurityGroup
Properties:
GroupDescription: ELB security group
VpcId: !Ref VpcId
MyLoadBalancer:
Type: AWS::ElasticLoadBalancing::LoadBalancer
Properties:
SecurityGroups:
- !GetAtt LoadBalancerSecurityGroup.GroupId
egress を明示しない新しいグループには、全送信を許可するデフォルトルールが追加されます。この抜粋が送信を遮断するわけではありません。
変更後
yaml
Resources:
LoadBalancerSecurityGroup:
Type: AWS::EC2::SecurityGroup
Properties:
GroupDescription: ELB security group
VpcId: !Ref VpcId
SecurityGroupEgress:
- IpProtocol: tcp
FromPort: 80
ToPort: 80
CidrIp: 0.0.0.0/0
MyLoadBalancer:
Type: AWS::ElasticLoadBalancing::LoadBalancer
Properties:
SecurityGroups:
- !GetAtt LoadBalancerSecurityGroup.GroupId
すべての IPv4 宛先に TCP 80 を許可します。実際のバックエンドの CIDR やセキュリティグループに宛先を限定し、ヘルスチェックのポートも確認してください。このルール自体は HTTP データを暗号化しません。