Amazon CloudFront におけるAWS WAFの連携設定手順

このブログシリーズ 「クラウドセキュリティ 実践集」 では、一般的なセキュリティ課題を取り上げ、「なぜ危険なのか?」 というリスクの解説から、「どうやって直すのか?」 という具体的な修復手順(コンソール、AWS CLI、Terraformなど)まで、分かりやすく解説します。
この記事では、「SecurifyHubで検出される[CloudFront.6] CloudFront ディストリビューションでは、WAF を有効にする必要があります」について解説します。

ポリシーの説明
[CloudFront.6] CloudFront ディストリビューションでは、WAF を有効にする必要があります
CloudFront の Security Hub コントロール – AWS Security Hub
このコントロールは、CloudFrontのディストリビューションがAWS WAF ClassicまたはAWS WAFのWeb ACLに関連付けられているかどうかをチェックします。 ディストリビューションが Web ACL に関連付けられていない場合、このコントロールは失敗します。
リスク
AWS CloudFrontディストリビューションは、コンテンツをユーザーに高速かつ安全に配信するためのグローバルなCDNサービスです。このディストリビューションにAWS WAF (Web Application Firewall) が有効になっていない場合、ウェブアプリケーションやAPIはさまざまな種類の攻撃に対して脆弱になり、以下のようなリスクが発生します。
- ウェブ攻撃の被害: SQLインジェクション、クロスサイトスクリプティング (XSS)、悪意のあるボット、DDoS攻撃などの一般的なウェブ攻撃から保護されません。これにより、データ漏洩、サービス停止、ウェブサイトの改ざんといった被害につながる可能性があります。
- コンプライアンス違反: PCI DSS、HIPAA、GDPRなどの多くのセキュリティおよびデータプライバシー規制では、ウェブアプリケーションを保護するためのWAFの使用が推奨または義務付けられています。WAFが有効でない場合、これらのコンプライアンス要件を満たせない可能性があります。
- 過剰なリソース消費とコスト増: 悪意のあるトラフィックがWAFによってブロックされない場合、CloudFrontやオリジンサーバー(EC2、S3など)に直接到達し、不必要なリソースを消費したり、予期せぬコスト増を引き起こしたりする可能性があります。
- 可視性の欠如: WAFは、ブロックされたリクエストや許可されたリクエストに関する詳細なログとメトリクスを提供します。WAFが有効でない場合、ウェブアプリケーションへの攻撃試行に関する重要なセキュリティインサイトが得られず、脅威の分析や対策の立案が困難になります。
- ブランドイメージの損害: ウェブサイトが攻撃を受けてサービスが停止したり、改ざんされたりすると、ユーザーからの信頼を失い、企業のブランドイメージに深刻な損害を与える可能性があります。
対策
CloudFrontディストリビューションにAWS WAFを有効にし、適切なウェブACLを関連付けることは、ウェブアプリケーションとAPIを保護するための不可欠なセキュリティ対策です。
- WAFウェブACLの作成と設定: ウェブアプリケーションの要件と既知の脅威に基づいて、カスタムルールやAWSマネージドルールを含むウェブACLを作成します。一般的なウェブ攻撃からの保護には、AWSマネージドルール(例:
AWSManagedRulesCommonRuleSet
)の利用が推奨されます。 - CloudFrontディストリビューションへの関連付け: 作成したウェブACLを、保護対象のCloudFrontディストリビューションに関連付けます。これにより、WAFがCloudFrontのエッジロケーションで受信トラフィックを検査できるようになります。
- ルールのテストとチューニング: ウェブACLのルールを導入する前に、「カウント」モードでテストし、誤検知がないか確認します。運用開始後も、ログとメトリクスを監視しながら、ルールのチューニングを継続的に行い、新たな脅威に対応します。
- WAFログの有効化と監視: WAFのログを有効にしてAmazon S3に保存し、Amazon AthenaやAmazon QuickSightなどのサービスでログを分析することで、攻撃パターンを特定し、セキュリティインシデントの調査に役立てます。
- DDoS対策との組み合わせ: AWS Shield Standard(デフォルトで有効)またはAWS Shield AdvancedとWAFを組み合わせることで、DDoS攻撃に対する多層的な保護を構築します。
修復方法
AWSコンソールでの修復手順
AWSコンソールを使用して、CloudFrontディストリビューションにAWS WAFウェブACLを関連付けます。
- AWS WAFウェブACLの作成または確認:
- AWSコンソールにログインし、AWS WAFサービスを開きます。
- 左側のナビゲーションペインで「ウェブACL」を選択します。
- 既存のウェブACLがある場合は、その設定を確認します。ない場合は、「ウェブACLを作成」をクリックし、ウェブアプリケーションの要件に合ったルール(例: AWSマネージドルールなど)を設定して作成します。この際、「AWS リソース」として「CloudFront ディストリビューション」が選択されていることを確認します。

- CloudFrontディストリビューションへの関連付け:
- AWSコンソールでCloudFrontサービスを開きます。
- 左側のナビゲーションペインで「ディストリビューション」を選択します。
- AWS WAFを有効にしたいCloudFrontディストリビューションを選択し、「ディストリビューションの設定」または「一般」タブの「編集」をクリックします。
- 「設定」セクションの「AWS WAF ウェブ ACL」ドロップダウンメニューから、関連付けたいウェブACLを選択します。
- 変更を保存するために「変更を保存」をクリックします。
- CloudFrontディストリビューションのステータスが「Deploying」になるので、完了するまで待ちます。

Terraformでの修復手順
TerraformでCloudFrontディストリビューションにAWS WAFウェブACLを関連付けるには、aws_cloudfront_distribution
リソースの web_acl_id
パラメータを設定します。事前に aws_wafv2_web_acl
リソースでウェブACLを定義しておく必要があります。
# AWS WAFv2 ウェブACLの定義
resource "aws_wafv2_web_acl" "example_web_acl" {
name = "my-cloudfront-web-acl"
scope = "CLOUDFRONT" # CloudFrontに適用するためには 'CLOUDFRONT' を指定
description = "Web ACL for CloudFront distribution"
default_action {
allow {}
}
visibility_config {
cloudwatch_metrics_enabled = true
metric_name = "myCloudFrontWebAcl"
sampled_requests_enabled = true
}
# 例: AWSマネージドルールを追加
rule {
name = "AWS-Managed-CommonRuleSet"
priority = 1
action {
block {}
}
statement {
managed_rule_group_statement {
name = "AWSManagedRulesCommonRuleSet"
vendor_name = "AWS"
}
}
visibility_config {
cloudwatch_metrics_enabled = true
metric_name = "AWSManagedRulesCommonRuleSet"
sampled_requests_enabled = true
}
}
# 必要に応じてカスタムルールなどを追加
}
# CloudFrontディストリビューションの定義
resource "aws_cloudfront_distribution" "example_distribution" {
# ... 他のディストリビューション設定 ...
origin {
domain_name = "mybucket.s3.amazonaws.com" # オリジンとなるS3バケットまたはELB/EC2のドメイン
origin_id = "myS3Origin"
# ... その他のオリジン設定 ...
}
enabled = true
is_ipv6_enabled = true
comment = "My CloudFront distribution with WAF"
default_root_object = "index.html"
default_cache_behavior {
allowed_methods = ["GET", "HEAD", "OPTIONS"]
cached_methods = ["GET", "HEAD", "OPTIONS"]
target_origin_id = "myS3Origin"
viewer_protocol_policy = "redirect-to-https"
min_ttl = 0
default_ttl = 86400
max_ttl = 31536000
forwarded_values {
query_string = false
cookies {
forward = "none"
}
}
}
restrictions {
geo_restriction {
restriction_type = "none"
}
}
viewer_certificate {
cloudfront_default_certificate = true
}
# ここでウェブACLを関連付ける
web_acl_id = aws_wafv2_web_acl.example_web_acl.arn
# ... その他のディストリビューション設定 ...
}
上記の例では、aws_wafv2_web_acl
リソースでWAFウェブACLを定義し、そのARN (aws_wafv2_web_acl.example_web_acl.arn
) を aws_cloudfront_distribution
リソースの web_acl_id
パラメータに設定することで、CloudFrontディストリビューションにWAFを関連付けています。
ウェブACLのルールやCloudFrontディストリビューションのその他の設定は、あなたのユースケースに合わせて適切に調整してください。
最後に
この記事では、CloudFrontディストリビューションにAWS WAFが有効になっていない状態について、リスクと対策を解説しました。AWS WAFを有効にすることは、ウェブアプリケーションを多様なサイバー攻撃から保護し、セキュリティとコンプライアンスのレベルを向上させるために非常に重要です。適切なWAFルールを設定し、多層防御の一環として活用しましょう。
この問題の検出は弊社が提供するSecurifyのCSPM機能で簡単に検出及び管理する事が可能です。
運用が非常に楽に出来る製品になっていますので、ぜひ興味がある方はお問い合わせお待ちしております。
最後までお読みいただきありがとうございました。この記事が皆さんの役に立てば幸いです。