はじめに
目的
この章では、CloudFront(CDN)とAWS WAF(Webアプリケーションファイアウォール)を組み合わせる意義をやさしく説明します。高速な配信とアプリケーション層の防御を同時に実現する理由を理解できます。
背景と期待効果
CloudFrontは画像や動画、ウェブページを世界中のユーザーに速く届けます。WAFは不正なリクエスト(例:SQLインジェクションやクロスサイトスクリプティング)をブロックします。両者を連携すると、配信速度を落とさずに攻撃に備えられます。例えば、静的サイトを世界向けに高速配信しつつ、悪意あるアクセスを先に遮断できます。
この記事で学べること
- CloudFrontとWAFを組み合わせる利点
- 代表的な構成例とトラフィックの流れ
- Terraformによる実践的な設定例
- ALBやAPI Gatewayとの連携方法
- 運用・監視のポイント
想定読者
クラウドやセキュリティの基本は知っているが、実運用への適用方法を学びたいエンジニアや担当者向けです。
AWS CloudFrontとWAFの概要
CloudFrontとは
CloudFrontはAWSのコンテンツ配信サービス(CDN)です。世界中のエッジロケーションにコンテンツを配備して、ユーザーに近い場所から静的・動的なデータを高速に届けます。キャッシュを使うことで負荷を減らし、TLS対応で通信を保護します。
AWS WAFとは
AWS WAFはWebアプリケーションファイアウォールで、悪意のあるアクセスをブロックできます。IP制限、SQLインジェクションやクロスサイトスクリプティングの検出、レート制限などのルールを適用します。カスタムルールを作成して柔軟に防御できます。
組み合わせるメリット
- パフォーマンス向上:CloudFrontのキャッシュで応答が速くなります。
- セキュリティ強化:WAFがアプリケーション層の攻撃を防ぎます。
- コスト効率:不要なトラフィックをエッジで止めてオリジンサーバーの負荷を下げます。
利用のイメージ
静的サイトはCloudFrontで配信し、WAFで不正なリクエストをブロックします。APIではレート制限やIPブロックを掛けて過負荷や不正アクセスを抑止します。これにより、配信の速さと安全性を両立できます。
代表的な構成例とトラフィックの流れ
構成の全体像
一般的な構成は次のようになります。ユーザーがインターネット経由でアクセスすると、まずCloudFront(CDN)に到達します。CloudFrontは静的コンテンツをS3から配信し、動的なAPIリクエストはオリジンとしてALBやAPI Gatewayに転送します。WAFはCloudFrontまたはALB側に適用し、不要なトラフィックを早めに遮断します。
トラフィックの流れ(例)
- ユーザーがブラウザでアクセス→CloudFront
- CloudFrontがキャッシュにあれば応答、なければオリジンへ
- 静的ファイル→S3から配信
- APIリクエスト→CloudFront→ALBまたはAPI Gateway→EC2やコンテナ
- WAFはCloudFrontでブロックすればエッジで防御、ALBで設定すればアプリ層の詳細検査を行います。
ポイントと利点
- CloudFrontで配信すると遅延が減り負荷が下がります。WAFをエッジで効かせると攻撃を早く止められます。ALB側のWAFは細かいルールに向きます。両方を使い分けると防御層が厚くなります。
CloudFrontとWAFの連携方法
概要
CloudFrontディストリビューション作成時に、AWS WAF(Web ACL)を簡単に有効化できます。主に二つのやり方があります。
主な連携方法
- ワンクリック保護(コンソール): CloudFront作成画面で「ワンクリック保護」を選ぶと、必要なWeb ACLを自動作成してディストリビューションに適用します。初めての導入に便利です。
- 既存のWeb ACLを関連付け: 事前にWAFでWeb ACLを作り、CloudFrontの設定から選んで関連付けます。細かいルールをカスタマイズしたい場合に向きます。
推奨設定例
- 管理されたルールパック(推奨): AWSやサードパーティのルールグループを使うと、一般的な脆弱性や悪意のあるボットに対応できます。
- テストモード(Count): 新しいルールはまず「カウント」にして影響を観察します。誤検知のリスクを下げられます。
設定時の注意点
- スコープはCloudFrontに合わせる(グローバル適用)。
- ルールの順序で動作が変わるので、重要なルールは上位に置きます。
- キャッシュやヘッダを考慮する: CloudFrontのキャッシュ設定や送信ヘッダが検査結果に影響します。
これらを踏まえて設定すれば、CloudFront配信の前段で効率よく不正なトラフィックを防げます。
WAFの主な機能とセキュリティ強化ポイント
概要
WAFはHTTP/HTTPSトラフィックをリアルタイムで解析し、攻撃を検知・遮断します。代表的な攻撃としてSQLインジェクションやクロスサイトスクリプティング(XSS)がありますが、IP制御やレート制限、地理的制限など多様なルールで防御します。
主な機能
- シグネチャ/マネージドルール:よくある攻撃パターンを即座に検出・遮断します。
- カスタムルール:URI、ヘッダ、ボディ、クエリ文字列などを条件に細かく制御できます。
- レートベースルール:短時間の大量リクエストをブロックします。
- IPおよび地理的制限:特定IPや国からのアクセスを制限します。
- ボット管理・チャレンジ:自動化された不正アクセスを識別し、CAPTCHAやチャレンジで対処します。
- ロギングとモニタリング:CloudWatchやS3へログを出力して可視化します。
セキュリティ強化のポイント(実践)
- マネージドルールを導入し、まず広くカバーする。
- カスタムルールで業務に不要なHTTPメソッドや公開パスを制限する。
- レート制限は閾値を段階的に設定して誤検知を減らす。
- ログを有効にしてアラートを設定、異常を早期に検知する。
- 変更はステージングで検証し、定期的にルールをチューニングする。
注意点
- 誤検知(false positive)対策としてまず“COUNT”モードで様子を見る。
- リクエストボディサイズや検査対象に制限があるため、API設計と合わせて確認してください。
短いチェックリスト:マネージドルール導入→ログ有効化→段階的レート設定→ステージング検証→定期チューニング。
実践設定例(Terraformによる連携)
概要
TerraformでCloudFrontとWAFを連携する基本手順を、分かりやすく説明します。WAFルールはaws_wafv2_web_aclで定義し、CloudFrontのaws_cloudfront_distributionにweb_acl_idで紐付けます。実運用ではルールのチューニングが重要です。
前提ポイント
- WAFv2でscopeは”CLOUDFRONT”を使用します。
- CloudFrontに紐づけるWAFはus-east-1(グローバル)で作成します。
- 必要なIAM権限を用意してください。
手順(要点)
- aws_wafv2_web_aclを作成し、マネージドルールやIPセット、レートベースルールを定義します。
- aws_cloudfront_distributionのweb_acl_idにWAFのARNを指定して紐付けます。
- Terraform applyで反映し、アクセス確認とログの確認を行います。
サンプル(簡易)
resource "aws_wafv2_web_acl" "example" {
name = "example-waf"
scope = "CLOUDFRONT"
default_action { allow = {} }
visibility_config { sampled_requests_enabled = true metric_name = "example" }
rule { name = "rate_limit" priority = 1 action { block = {} } statement { rate_based_statement { limit = 2000 aggregate_key_type = "IP" } } }
}
resource "aws_cloudfront_distribution" "example" {
# 略: origin 等の設定
web_acl_id = aws_wafv2_web_acl.example.arn
}
運用上の注意
- ルールは段階的に有効化して誤検知を抑えてください。
- ログ(CloudWatch / S3)で効果を確認し、閾値を調整します。
- WAFは万能ではないため、アプリ側の検証も併用してください。
ALBやAPI Gatewayとの連携・補足
概要
CloudFront以外にも、ALB(Application Load Balancer)やAPI GatewayとWAFを組み合わせて利用できます。どちらもWAFを使うことで、背後で動くEC2やLambda、Lightsailなどへの不正アクセスや攻撃を減らせます。
ALBとの連携
ALBにWAFを直接関連付けると、ロードバランサーで受けたリクエストを検査してブロックできます。手順は簡単で、ALBのリスナーやターゲットを変える必要はほとんどありません。コンソールからALBの設定画面でWAFウェブACLを関連付けるだけで保護が始まります。例えば、特定の国からのトラフィック制限や一般的な攻撃シグネチャの防御に有効です。
API Gatewayとの連携
API Gateway(特にリージョナルAPI)にもWAFを適用できます。APIの各ステージやカスタムドメインにウェブACLを関連付けて、悪意あるリクエストや過剰な呼び出しを遮断します。APIを公開する際は、認証とWAFを組み合わせるとより安全になります。
実例(簡単な流れ)
- ALBの場合:クライアント → ALB(WAF検査)→ EC2/Lightsail
- API Gatewayの場合:クライアント → API Gateway(WAF検査)→ Lambda/バックエンド
注意点
- WAFルールの適用順序やログ設定を確認してください。誤って正当なリクエストを遮断するとサービスに影響します。
- CloudFront経由と直接ALB/API Gateway適用では、IPアドレスの見え方やキャッシュの有無が異なります。ログやヘッダを確認して正しく動作しているか検証してください。
運用・監視のポイント
1. 監視とアラート設定
CloudFrontとWAFは可視化と通知を整えることが第一です。CloudWatchやサードパーティの監視ツールでエラー率や異常なリクエスト増加を監視し、閾値超過でメールやSlackに通知を送ると速やかに対応できます。
2. ログの収集と分析
WAFログをS3へ保存し、Athenaやログ解析ツールで検索します。特定IPの繰り返しブロックや誤検知のパターンを拾い、ホワイトリストや除外ルールを検討します。簡単なクエリ例を用意しておくと調査が早くなります。
3. ルールのチューニング
新しいルールはまず検知モードで運用して挙動を確認します。誤検知が多ければルール条件を緩め、必要な保護が不足すればルールを強化します。変更はバージョン管理して差分を追えるようにします。
4. インシデント対応とランブック
発生時の手順(通知、一次対応、ルール変更、原因調査、復旧確認)を文書化します。定期的に演習して手順の実効性を確認します。
5. CSPMや自動検出の活用
CSPMは設定漏れや公開設定のリスクを自動で見つけます。優先度の高い指摘から対応し、改善履歴を残すと監査に役立ちます。
6. 定期レビューとテスト
定期的にログとルールを見直し、トラフィックの変化に応じて調整します。ステージング環境でルール変更を検証してから本番へ反映してください。
まとめ
CloudFront と WAF を連携すると、高速な配信と強固な防御を両立できます。CloudFront が世界中にコンテンツを届け、WAF が悪意あるアクセスをブロックするため、静的ファイルや動的 API どちらにも有効です。
実運用のポイント
- まずは AWS Managed Rules を導入し、必要に応じてカスタムルールで調整します。例:特定の国や IP からの不要なトラフィックを制限します。
- CloudFront に WAF を関連付けることで、エッジでの防御を実現します。これによりオリジンへの無駄な負荷を減らせます。
- ロギングとメトリクスを有効にし、ブロック数や誤検知を定期的に確認します。アラートを設定して問題を早期発見します。
- IaC(例: Terraform)で設定を管理し、変更履歴とレビュープロセスを整えます。
- ステージング環境でルールをテストし、本番への影響を最小に抑えます。
導入のすすめ
早めに導入して運用を改善すれば、攻撃リスクを下げつつ配信品質を保てます。設定は段階的に強化し、ログやアラートを活用して継続的に最適化してください。