implementing-cloud-waf-rules について
ウェブアプリや API 向けに、クラウド WAF ルールを導入・調整するチーム向けのスキルです。マネージドルール、レート制限、誤検知への対応を扱い、Count モードで検証してから Block モードへ切り替えます。
主な機能
- 01マネージドルールセットの導入
- 02レート制限ルールの設定
- 03地域と IP レピュテーションによるブロック
- 04ログ分析と誤検知の調整
- 05検証後のブロックモードへの切り替え
活用シーン
- 01新規アプリへの OWASP 防御の導入
- 02ログインエンドポイントへの認証情報詰め込み攻撃の緩和
- 03正規リクエストの誤ブロック削減
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ mukul975/ anthropic-cybersecurity-skills --skill implementing-cloud-waf-rulesインストール後、Claude Code で/implementing-cloud-waf-rulesを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
LICENSEreferences/api-reference.mdscripts/agent.py詳細
クラウド WAF ルールの実装
使用する場面
- OWASP 保護が必要なクラウドロードバランサーの背後に、新しい Web アプリケーションや API をデプロイするとき
- アプリケーションの侵入テストで、SQL インジェクション、XSS、その他のインジェクション脆弱性が見つかったとき
- 認証エンドポイントがブルートフォース攻撃、クレデンシャルスタッフィング攻撃、ボット攻撃を受けているとき
- PCI-DSS などの規格への準拠要件で、WAF が義務付けられているとき
- 正当なアプリケーショントラフィックをブロックする誤検知を減らすため、WAF ルールを調整するとき
次の用途には使用しないでください。ネットワークレベルの DDoS 保護(AWS Shield または Azure DDoS Protection を使用してください)、API 認証の設計(managing-cloud-identity-with-okta を参照してください)、アプリケーションコードレベルのセキュリティ修正(WAF は補完的な制御であり、安全なコードの代替ではありません)。
前提条件
- AWS ALB/CloudFront、Azure Application Gateway、または Cloudflare がアプリケーションのエントリーポイントとして設定されていること
- WAF のデプロイ前にベースライン分析を行うための、アプリケーショントラフィックログ
- 本番環境で適用する前に WAF ルールを検証するためのテスト環境
- 誤検知を最小限に抑えるための、アプリケーションのリクエストパターンに関する理解
ワークフロー
ステップ 1:マネージドルールセットをデプロイする
OWASP Top 10 の脆弱性をカバーする、クラウドプロバイダーのマネージドルールセットを有効にします。Block(防止)モードに切り替える前に、Count(検出)モードから始めます。
# AWS WAF: Create Web ACL with AWS Managed Rules
aws wafv2 create-web-acl \
--name production-waf \
--scope REGIONAL \
--default-action '{"Allow": {}}' \
--visibility-config '{
"SampledRequestsEnabled": true,
"CloudWatchMetricsEnabled": true,
"MetricName": "production-waf"
}' \
--rules '[
{
"Name": "AWSManagedRulesCommonRuleSet",
"Priority": 1,
"Statement": {
"ManagedRuleGroupStatement": {
"VendorName": "AWS",
"Name": "AWSManagedRulesCommonRuleSet"
}
},
"OverrideAction": {"Count": {}},
"VisibilityConfig": {
"SampledRequestsEnabled": true,
"CloudWatchMetricsEnabled": true,
"MetricName": "CommonRuleSet"
}
},
{
"Name": "AWSManagedRulesSQLiRuleSet",
"Priority": 2,
"Statement": {
"ManagedRuleGroupStatement": {
"VendorName": "AWS",
"Name": "AWSManagedRulesSQLiRuleSet"
}
},
"OverrideAction": {"Count": {}},
"VisibilityConfig": {
"SampledRequestsEnabled": true,
"CloudWatchMetricsEnabled": true,
"MetricName": "SQLiRuleSet"
}
},
{
"Name": "AWSManagedRulesKnownBadInputsRuleSet",
"Priority": 3,
"Statement": {
"ManagedRuleGroupStatement": {
"VendorName": "AWS",
"Name": "AWSManagedRulesKnownBadInputsRuleSet"
}
},
"OverrideAction": {"Count": {}},
"VisibilityConfig": {
"SampledRequestsEnabled": true,
"CloudWatchMetricsEnabled": true,
"MetricName": "KnownBadInputs"
}
}
]'
ステップ 2:カスタムレート制限ルールを作成する
ブルートフォース攻撃やクレデンシャルスタッフィング攻撃からログインエンドポイントを保護するため、レートベースのルールをデプロイします。
# Rate limiting rule for login endpoint (100 requests per 5 minutes per IP)
aws wafv2 update-web-acl \
--name production-waf \
--scope REGIONAL \
--id <web-acl-id> \
--lock-token <lock-token> \
--default-action '{"Allow": {}}' \
--rules '[
{
"Name": "RateLimitLogin",
"Priority": 0,
"Statement": {
"RateBasedStatement": {
"Limit": 100,
"AggregateKeyType": "IP",
"ScopeDownStatement": {
"ByteMatchStatement": {
"FieldToMatch": {"UriPath": {}},
"PositionalConstraint": "STARTS_WITH",
"SearchString": "/api/auth/login",
"TextTransformations": [{"Priority": 0, "Type": "LOWERCASE"}]
}
}
}
},
"Action": {"Block": {"CustomResponse": {"ResponseCode": 429}}},
"VisibilityConfig": {
"SampledRequestsEnabled": true,
"CloudWatchMetricsEnabled": true,
"MetricName": "RateLimitLogin"
}
}
]'
ステップ 3:ジオブロッキングと IP レピュテーションを設定する
正当なユーザーがいない国からのトラフィックをブロックし、IP レピュテーションリストを活用して、既知の悪意ある送信元をブロックします。
# AWS WAF: Geo-blocking rule
# Block countries not in the allowed list
aws wafv2 create-ip-set \
--name blocked-ips \
--scope REGIONAL \
--ip-address-version IPV4 \
--addresses "198.51.100.0/24" "203.0.113.0/24"
# Add Amazon IP Reputation rule
# AWSManagedRulesAmazonIpReputationList blocks IPs flagged by AWS threat intelligence
ステップ 4:誤検知を減らすためにルールを調整する
Count モードの WAF ログを分析し、フラグが付けられた正当なリクエストを特定します。特定の URI パスやリクエストパターンに対するルール例外を作成します。
# Enable WAF logging to S3
aws wafv2 put-logging-configuration \
--logging-configuration '{
"ResourceArn": "arn:aws:wafv2:us-east-1:123456789012:regional/webacl/production-waf/id",
"LogDestinationConfigs": ["arn:aws:s3:::waf-logs-bucket"],
"RedactedFields": [{"SingleHeader": {"Name": "authorization"}}]
}'
# Query WAF logs with Athena to find false positives
# Find rules triggered most frequently for legitimate traffic
cat << 'EOF' > waf-analysis.sql
SELECT
terminatingRuleId,
httpRequest.uri,
httpRequest.httpMethod,
COUNT(*) as block_count
FROM waf_logs
WHERE action = 'BLOCK'
AND timestamp > date_add('day', -7, now())
GROUP BY terminatingRuleId, httpRequest.uri, httpRequest.httpMethod
ORDER BY block_count DESC
LIMIT 20
EOF
# Exclude specific rule from managed rule set that causes false positives
# Example: Exclude SizeRestrictions_BODY for file upload endpoint
aws wafv2 update-web-acl \
--name production-waf \
--scope REGIONAL \
--id <web-acl-id> \
--lock-token <lock-token> \
--rules '[{
"Name": "AWSManagedRulesCommonRuleSet",
"Priority": 1,
"Statement": {
"ManagedRuleGroupStatement": {
"VendorName": "AWS",
"Name": "AWSManagedRulesCommonRuleSet",
"ExcludedRules": [{"Name": "SizeRestrictions_BODY"}]
}
},
"OverrideAction": {"None": {}},
"VisibilityConfig": {
"SampledRequestsEnabled": true,
"CloudWatchMetricsEnabled": true,
"MetricName": "CommonRuleSet"
}
}]'
ステップ 5:検証後に Block モードへ切り替える
誤検知率が許容範囲内であることを確認しながら、Count モードを 7~14 日間運用した後、アクティブな保護のためにマネージドルールを Block モードに切り替えます。
# Change OverrideAction from Count to None (use rule group's default Block action)
# Update each managed rule group from {"Count": {}} to {"None": {}}
# Monitor CloudWatch metrics for sudden changes in blocked request volume
主な概念
| 用語 | 定義 |
|---|---|
| Web ACL | 保護対象リソースへのすべての HTTP リクエストに対して評価されるルールセットを定義する Web Access Control List |
| マネージドルールグループ | 一般的な攻撃パターンをカバーする、クラウドプロバイダーまたはサードパーティーベンダーが管理する事前設定済みのルールセット |
| レートベースのルール | IP アドレスごとのリクエストレートを追跡し、時間枠内にしきい値を超えた IP をブロックする WAF ルール |
| Count モード | 一致したリクエストをブロックせずにログに記録する WAF アクション。適用前のルール検証に使用します |
| ルールの優先順位 | どのルールを先に評価するかを決める数値順。数値が小さいほど優先順位が高くなります |
| カスタムレスポンス | リクエストをブロックするときに、特定の HTTP ステータスコードとヘッダーを返す WAF の機能 |
| スコープダウンステートメント | レートベースのルールを特定の URI パス、メソッド、またはヘッダーに絞り込む条件 |
| 誤検知 | WAF ルールによって誤ってブロックされた正当なリクエスト。ルールの調整または除外が必要です |
ツールとシステム
- AWS WAF:ALB、CloudFront、API Gateway、AppSync と統合されたクラウドネイティブな WAF
- Azure WAF:OWASP CRS ルールセットを備えた Application Gateway または Front Door 上の Web アプリケーションファイアウォール
- AWS Firewall Manager:Organization 内の複数の AWS アカウントにわたる、WAF ポリシーの一元管理
- WAF Security Automations:ログ分析に基づき、Lambda を利用した WAF ルールの自動更新をデプロイする AWS ソリューション
- CloudWatch Metrics:WAF ルールの一致率、ブロック数、許可されたリクエストを追跡するモニタリングダッシュボード
よくあるシナリオ
シナリオ:認証 API に対するクレデンシャルスタッフィング攻撃
コンテキスト:ある E コマースアプリケーションで、盗まれた認証情報リストを使用するボットネットから、1 時間あたり 50,000 件のログイン試行が発生しています。攻撃者は、単純な IP ベースのブロックを回避するため、数分ごとに送信元 IP を切り替えています。
アプローチ:
- IP ごとに 5 分間あたり 10 件までログインエンドポイントへのリクエストを制限する、レートベースのルールをデプロイします
- IP のローテーションを超えて自動化されたリクエストパターンを検出するため、AWS WAF Bot Control マネージドルールグループを有効にします
- 失敗回数が 5 回を超えたログインリクエストに有効な CAPTCHA トークンを必須とするカスタムルールを追加します
- AWSManagedRulesAmazonIpReputationList を使用して、IP レピュテーションに基づくブロックを実装します
- クレデンシャルスタッフィングツールによく見られる User-Agent パターンに一致するカスタムルールを作成します
- ブロックされたリクエストのメトリクスを監視し、正規のトラフィックパターンに基づいてしきい値を調整します
落とし穴:レート制限を厳しく設定しすぎると、共有 NAT IP を使う正規のユーザーまでブロックされます。User-Agent のみでブロックしても、エージェント文字列を切り替えるだけで簡単に回避されます。
出力形式
Cloud WAF Configuration Report
================================
Web ACL: production-waf
Scope: Regional (us-east-1)
Protected Resources: ALB (arn:aws:elasticloadbalancing:...)
Report Date: 2025-02-23
RULE CONFIGURATION:
[P0] RateLimitLogin - BLOCK (100 req/5min/IP)
[P1] AWSManagedRulesCommon - BLOCK (1 exclusion: SizeRestrictions_BODY)
[P2] AWSManagedRulesSQLi - BLOCK
[P3] AWSManagedRulesKnownBad - BLOCK
[P4] AWSManagedRulesBotControl - COUNT (evaluation phase)
[P5] GeoBlockRule - BLOCK (12 countries blocked)
TRAFFIC ANALYSIS (Last 7 Days):
Total Requests: 2,847,293
Allowed: 2,791,456 (98.0%)
Blocked: 51,234 (1.8%)
Counted: 4,603 (0.2%)
TOP BLOCKED RULES:
RateLimitLogin: 23,456 blocks (45.8%)
SQLi Detection: 8,234 blocks (16.1%)
CommonRuleSet (XSS): 7,891 blocks (15.4%)
GeoBlockRule: 6,543 blocks (12.8%)
KnownBadInputs: 5,110 blocks (10.0%)
FALSE POSITIVE ANALYSIS:
Reported False Positives: 3
Confirmed False Positives: 1 (SizeRestrictions_BODY for /api/upload)
Action Taken: Rule exclusion applied