
#22 AWS CDK(Typescript)でALBへのアクセスをCloudFrontに限定する
AWS CDKを使用し、CloudFront - ALB - ECS(Fargate)の構成を作成することになりました。セキュリティの観点から、ALBへの直接アクセスを制限し、CloudFront経由のアクセスのみを許可するという要件の実現にちょっと手間取ってしまったのでその点を解説します。
結局は1つの設定が漏れていただけでしたが、AWS初心者である私はそんな設定があることも知らず。。。
実装手順
1. ALBセキュリティグループの設定
ALBのセキュリティグループで、CloudFrontのIPアドレス範囲からのインバウンドトラフィックのみを許可します。CloudFrontのIPアドレス範囲はプレフィックスリストとして提供されています。
albSecurityGroup.addIngressRule(
ec2.Peer.prefixList(<CLOUDFRONT_PREFIX_LIST_ID>),
ec2.Port.tcp(443),
);
このコードにより、CloudFrontのIPアドレス範囲からのHTTPS(443)アクセスのみが許可されます。プレフィックスリストIDは、AWS コンソールの「VPC」サービスから「マネージドプレフィックスリスト」で確認できます。
東京リージョンの場合、プレフィックスリスト名「com.amazonaws.global.cloudfront.origin-facing」、プレフィックスリストID「pl-58a04531」で登録されています。このリストにはグローバルに分散されたエッジサーバーのIPアドレス範囲が記載されています。
プレフィックスリストは自分で作成することもできますが、上限があり(申請で拡大可能)、変更があった場合追従する必要があります。マネージドプレフィックスリストはAWS側でメンテナンスされるため、変更されてもユーザー側では気にする必要はありません。
2. ALBリスナーの公開設定の無効化
ALBリスナーのopenプロパティをfalseに設定することで、インターネットからの直接アクセスを制限します。
alb.addListener("AlbListener", {
port: 443,
protocol: elbv2.ApplicationProtocol.HTTPS,
certificates: [{ certificateArn: <certificationArn> }],
defaultTargetGroups: [<targetGroup>],
open: false,
});
このopenプロパティを指定しなかったことが原因でCloudFront以外からのアクセスも可能な状態となっていました。
openプロパティを設定しない状態でセキュリティーグループを確認すると、手順1で設定したCloudFrontからのみ許可するルールに加え、以下のルールが追加されていました。CloudFormationのテンプレートの一部を抜粋します。
"SecurityGroupIngress": [
{
"CidrIp": "0.0.0.0/0",
"Description": "Allow from anyone on port 443",
"FromPort": 443,
"IpProtocol": "tcp",
"ToPort": 443
}
],
注意事項
上記手順だけではALBへのアクセスはCloudFrontからしか受け付けられませんが、すべてのCloudFront経由のアクセスが対象になります。つまり、自分以外のアカウントで作成されたCloudFrontからのアクセスも許可されます。悪意ある第三者がCloudFront経由であなたのALBにアクセスするように設定した場合、何の対策もないと不正アクセスを許してしまいます。
それを防ぐため、カスタムヘッダーを使用する方法が紹介されていました。今回の案件では別途不正アクセスの対策を入れるので、カスタムヘッダーの設定は実施しませんでした。(なので、この記事では割愛します。)
いいなと思ったら応援しよう!
