WAF と Lambda@Edge を組み合わせた CloudFront
AWS WAF をアタッチして一般的なウェブ攻撃をブロックし、Lambda@Edge でエッジにおける軽量なリクエストおよびレスポンス変換を実行します。
「WAF と Lambda@Edge を組み合わせた CloudFront」はCoddyKit上の無料AWS Solutions Architectレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはAWS Solutions Architect学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 AWS Solutions Architectコースには全4レッスンが含まれています。
AWS WAF による CloudFront の保護
AWS WAF(Web Application Firewall)は、CloudFront ディストリビューションに到達する HTTP/HTTPS リクエストをフィルタリングおよび監視します。WAF のWeb ACLをディストリビューションに関連付けることで、SQL インジェクション、クロスサイトスクリプティング(XSS)、悪質なボット、OWASP Top 10 攻撃など、一般的な Web 攻撃をオリジンに到達する前にブロックできます。
WAF は CloudFront エッジで動作するため、悪意のあるリクエストは ALB やアプリケーションサーバーに到達することなく、最寄りのエッジロケーションで拒否されます。これによりバックエンドの負荷を軽減し、攻撃者に近い場所で攻撃を阻止できます。
# Associate a WAF Web ACL with a CloudFront distribution
aws wafv2 associate-web-acl \
--web-acl-arn arn:aws:wafv2:us-east-1:123456789:global/webacl/MyACL/12345 \
--resource-arn arn:aws:cloudfront::123456789:distribution/EDFDVBD6EXAMPLEWAF のルールとルールグループ
WAF Web ACL には、リクエスト属性に一致するとアクション(Allow、Block、Count、CAPTCHA)を実行する、順序付けられたルールとルールグループが含まれます。ルールは優先度の順に評価され、最初に一致したルールのアクションが適用されます。
AWS はマネージドルールグループを提供しています。これは AWS および AWS Marketplace の販売者が保守する、あらかじめ構築されたルールセットです。AWS Managed Rules - Core Rule Setは設定なしで OWASP Top 10 に対応します。新たな脅威が出現すると AWS がマネージドルールグループを更新するため、運用上の負担を軽減できます。
# Create a Web ACL with AWS Managed Core Rule Set
aws wafv2 create-web-acl \
--name MyCloudFrontACL \
--scope CLOUDFRONT \
--default-action Allow={} \
--rules '[{
"Name": "CoreRuleSet",
"Priority": 1,
"Statement": {
"ManagedRuleGroupStatement": {
"VendorName": "AWS",
"Name": "AWSManagedRulesCommonRuleSet"
}
},
"OverrideAction": {"None": {}},
"VisibilityConfig": {
"SampledRequestsEnabled": true,
"CloudWatchMetricsEnabled": true,
"MetricName": "CoreRuleSet"
}
}]' \
--visibility-config SampledRequestsEnabled=true,CloudWatchMetricsEnabled=true,MetricName=MyACL \
--region us-east-1WAF のレート制限とボット制御
WAF のレートベースルールは、5 分間のウィンドウで送信元 IP ごとのリクエスト数をカウントします。IP がしきい値(例:5 分間に 2,000 リクエスト)を超えると、レートが低下するまで WAF はその IP からの以降のリクエストをブロックします。レートベースルールは、ブルートフォース攻撃、クレデンシャルスタッフィング、単純な DDoS スクレイピング攻撃への防御に役立ちます。
AWS WAF Bot Controlは、トラフィックを検証済みボット(Googlebot、Bingbot)、スクレイパー、監視ツール、人間のトラフィックなどのカテゴリに分類するマネージドルールグループです。カテゴリごとに異なるアクションを設定できます。たとえば、検索エンジンのボットは許可し、不明なボットには CAPTCHA でチャレンジを実施し、悪意のあるスクレイパーはブロックします。
WAF のスコープ:CLOUDFRONT と REGIONAL
WAF Web ACL のスコープには、CLOUDFRONT(グローバルで、CloudFront とともに使用)とREGIONAL(特定のリージョンの ALB、API Gateway、AppSync、または Cognito User Pools とともに使用)があります。CloudFront スコープの WAF ACL は、トラフィックの発生場所に関係なく、us-east-1 リージョンで作成する必要があります。これは CloudFront がこのリージョンから管理されるためです。
これは試験で注意すべき重要なポイントです。eu-west-1 で WAF Web ACL を作成して CloudFront に関連付けようとすると、関連付けに失敗します。CloudFront 用の WAF ACL は必ず us-east-1 で作成してください。
Lambda@Edge の概要
Lambda@Edgeを使用すると、CloudFront イベントに応じて、CloudFront のエッジロケーションで Node.js または Python の Lambda 関数を実行できます。関数はユーザーのリクエストから数ミリ秒以内に実行され、処理のためにトラフィックを中央のリージョンへ戻す必要がありません。
Lambda@Edge 関数は us-east-1 リージョンにデプロイしますが、CloudFront のすべてのエッジロケーションに自動的に複製されます。これにより、コードを可能な限りユーザーの近くで実行でき、最小限のレイテンシー増加でエッジにおけるパーソナライズ、認証、A/B テストを実現できます。
Lambda@Edge のトリガーポイント
Lambda@Edge 関数は、ライフサイクル内の 4 つのポイントで CloudFront のリクエストとレスポンスをインターセプトできます。
- Viewer Request:CloudFront が閲覧者からリクエストを受信した後、キャッシュを確認する前。認証、リダイレクト、ヘッダー操作に使用します
- Origin Request:キャッシュミスの後、オリジンへ転送する前。URL の書き換えやオリジンへのカスタムヘッダーに使用します
- Origin Response:オリジンからレスポンスを受信した後、キャッシュする前。セキュリティヘッダーの追加やレスポンスの変更に使用します
- Viewer Response:CloudFront が閲覧者へレスポンスを送信する前。レスポンスヘッダーの追加や変更に使用します
Lambda@Edge と CloudFront Functions の比較
AWS は、トレードオフの異なる 2 つのエッジコンピューティングの選択肢を提供しています。
- CloudFront Functions:サブミリ秒の実行、JavaScript のみ、非常に低コスト(約 1/6 の料金)、Viewer Request と Viewer Response イベントのみで実行、コンピューティング時間の制限は 1 ミリ秒、VPC/ネットワークアクセス不可
- Lambda@Edge:実行時間は最大 30 秒(Viewer)/30 秒(Origin)、Node.js または Python、4 つすべてのトリガーポイントに対応、ネットワークリクエストの実行が可能、リクエスト/レスポンスボディにアクセス可能
単純なヘッダー操作、URL の正規化、キャッシュキーの計算には CloudFront Functions を使用します。ネットワーク呼び出し、より長い処理、またはオリジン側の処理が必要な複雑なロジックには Lambda@Edge を使用します。
Lambda@Edge のユースケース
SAA-C03 試験でよく出る Lambda@Edge のパターン:
- エッジでの JWT 検証:Viewer Request 関数が Authorization ヘッダーを検証し、認証されていないリクエストにはオリジンへ到達する前に 401 を返します
- A/B テスト:Viewer Request がユーザーを Cookie によって A または B のグループに割り当て、
/a/page.htmlまたは/b/page.htmlを取得するようリクエストを変更します - URL の書き換え:Origin Request が、わかりやすい URL を S3 内の実際のファイルパスに書き換えます
- 動的な画像リサイズ:Origin Request が画像処理用 Lambda へのリクエストを組み立て、Origin Response がリサイズ後の画像をキャッシュします
- HTTP セキュリティヘッダー:Viewer Response が CSP、HSTS、X-Frame-Options ヘッダーを挿入します
Lambda@Edgeの制限事項
Lambda@Edgeには、標準のLambdaと比べていくつかの制限があります。
- 関数はus-east-1リージョンに配置する必要があります
- VPCはサポートされません(VPC内のリソースにはアクセスできません)
- 環境変数は使用できません(設定を関数コードに埋め込むか、コールドスタート時にParameter Storeから取得します)
- Lambda Layersは使用できません
- ビューワーイベントのタイムアウトは5秒、オリジンイベントのタイムアウトは30秒です
- デプロイパッケージのサイズ上限は1 MB(ビューワーイベント)/50 MB(オリジンイベント)です
これらの制限があるため、Lambda@Edgeは長時間実行する計算、VPCに依存する処理、またはデプロイごとに動的な設定を必要とする関数には適していません。
WAF + Lambda@Edge:多層防御
WAFとLambda@Edgeは異なるセキュリティ上の役割を担い、互いに補完します。
- WAF:シグネチャベースで攻撃をブロックします(SQLインジェクション、XSS、既知の悪意ある攻撃元、レート制限など)。マネージドルールによって一般的な攻撃を自動的に処理できます
- Lambda@Edge:カスタムのビジネスロジックによるセキュリティを提供します(JWTの検証、セッションチェック、アクセストークンの検証など)。柔軟ですが、開発作業が必要です
多層防御アーキテクチャでは、まずWAFが既知の攻撃パターンをブロックし、Lambda@Edgeがビジネスレベルの認証を検証します。CloudFrontの署名付きURL/Cookieでコンテンツへのアクセスを制限し、OACでS3を非公開に保ちます。各層が異なる種類の攻撃を独立して防ぎます。
WAFとLambda@Edgeの監視
次のツールを使用して、エッジのセキュリティレイヤーを監視します。
- WAFログ:リクエストの完全なログをS3、CloudWatch Logs、またはKinesis Firehoseに記録するよう設定すると、どのルールに一致したか、どのトラフィックがブロックされたかを確認できます
- WAFメトリクス:CloudWatchで、ルールごとの
BlockedRequests、AllowedRequests、CountedRequestsを確認できます - Lambda@Edgeログ:関数が実行される各リージョンにCloudWatch Logsのロググループが作成されます。CloudWatch Insightsを使用すると、リージョンをまたいでクエリを実行できます
- CloudFrontリアルタイムログ:アクセスログをKinesisにストリーミングして、すぐに分析できます(数分ごとにまとめて処理される標準アクセスログとは異なります)
クイックチェック
このレッスンで学んだAWS Solutions Architect(SAA-C03)の概念について、理解度を確認します。
レッスンのまとめ
このレッスンでは、AWS WAFがマネージドルールグループとカスタムルールグループを使用して、CloudFrontのエッジで一般的なWeb攻撃をブロックすること、Lambda@EdgeがグローバルにCloudFrontの4つのトリガーポイントでカスタムコードを実行すること、そしてCloudFront Functionsが単純なビューワー側のロジックをサブミリ秒で実行できることを学びました。CloudFront用のWAF ACLはus-east-1で作成する必要があります。次は、Application Load Balancer、Network Load Balancer、Gateway Load Balancerについて学びます。
よくある質問
「WAF と Lambda@Edge を組み合わせた CloudFront」レッスンは無料ですか?
はい。「WAF と Lambda@Edge を組み合わせた CloudFront」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、AWS Solutions Architectコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 AWS Solutions Architectコースには全4レッスンが含まれています。
「WAF と Lambda@Edge を組み合わせた CloudFront」で何を学びますか?
AWS WAF をアタッチして一般的なウェブ攻撃をブロックし、Lambda@Edge でエッジにおける軽量なリクエストおよびレスポンス変換を実行します。 ブラウザで直接実行するハンズオンコードでAWS Solutions Architectを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
AWS Solutions Architectを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのAWS Solutions Architectは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。
「WAF と Lambda@Edge を組み合わせた CloudFront」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このAWS Solutions Architectレッスンでコードを書いて実行できますか?
はい。すべてのAWS Solutions Architectレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- CloudFront ディストリビューションとオリジン
- キャッシュビヘイビアと TTL 設定
- 署名付き URL、署名付き Cookie、地理的制限
- WAF と Lambda@Edge を組み合わせた CloudFront