SJ blog
security
A

信頼度ランク

S 公式ソース確認済み
A 成功実績多数・失敗例少数
B 賛否両論
C 動作未確認・セキュリティリスク高
Z 個人所感

AWS WAF ルール設計 — マネージドルール・カスタムルール・レート制限・ログ分析

AWS WAFのルールグループ、AWSマネージドルールセット、レートベースルール、地理的制限、ボット制御、IPセット管理、CloudFront/ALBとの連携パターンを解説。

一言結論

AWSマネージドルールで土台のOWASP対策を敷いたうえで、レートベースルールとカスタムルールを組み合わせることがWAF設計の基本であり、ログ分析なしにルールを運用し続けると誤検知が積み重なる。

AWS WAFの構成要素

Web ACL(アクセスコントロールリスト)
  └── ルールグループ 1(AWS マネージドルールグループ)
  └── ルールグループ 2(カスタムルールグループ)
  └── 個別ルール(カスタム)
  └── レートベースルール

Web ACLは以下のリソースに適用できる:
  - CloudFront
  - ALB
  - API Gateway
  - AppSync
  - Cognito User Pool

AWSマネージドルールグループ

AWS コアルールセット (CRS):
  OWASP Top 10の一般的な攻撃パターンをブロック
  SQLインジェクション、XSS、コマンドインジェクション等

既知の不正なIP:
  AWSが管理する既知の悪意のあるIPリストでブロック

Amazon IP レピュテーションリスト:
  DDoS攻撃の踏み台として使われたIPをブロック

Anonymous IP:
  Tor、VPN、プロキシ経由のアクセスをブロック

AWSマネージドルール(アプリ固有):
  WordPress向け、PHP向け、Linuxサーバー向け等
  
ボットコントロール:
  スクレーパー、スキャナー、クローラーをブロック/制御
# WAF Web ACLの作成
aws wafv2 create-web-acl \
  --name my-web-acl \
  --scope CLOUDFRONT \
  --default-action Allow={} \
  --rules '[
    {
      "Name": "AWSManagedRulesCoreRuleSet",
      "Priority": 1,
      "OverrideAction": {"None": {}},
      "Statement": {
        "ManagedRuleGroupStatement": {
          "VendorName": "AWS",
          "Name": "AWSManagedRulesCommonRuleSet"
        }
      },
      "VisibilityConfig": {
        "SampledRequestsEnabled": true,
        "CloudWatchMetricsEnabled": true,
        "MetricName": "CommonRuleSet"
      }
    }
  ]' \
  --visibility-config SampledRequestsEnabled=true,CloudWatchMetricsEnabled=true,MetricName=my-acl \
  --region us-east-1  # CloudFrontはus-east-1で管理

レートベースルール

# 同一IPから5分間で1000リクエスト以上でブロック
{
  "Name": "RateLimit",
  "Priority": 5,
  "Action": {"Block": {}},
  "Statement": {
    "RateBasedStatement": {
      "Limit": 1000,
      "AggregateKeyType": "IP",
      "EvaluationWindowSec": 300
    }
  }
}

集計キーのオプション:

  • IP: 送信元IPアドレス
  • FORWARDED_IP: X-Forwarded-ForヘッダーのIP(プロキシ経由の場合)
  • CUSTOM_KEYS: HTTPヘッダー、クエリパラメータ等の組み合わせ

カスタムルールの例

// ヘッダーベースのブロック(不審なUser-Agent)
{
  "Name": "BlockBadUserAgents",
  "Statement": {
    "ByteMatchStatement": {
      "SearchString": "python-requests",
      "FieldToMatch": {"SingleHeader": {"Name": "user-agent"}},
      "TextTransformations": [{"Priority": 1, "Type": "LOWERCASE"}],
      "PositionalConstraint": "CONTAINS"
    }
  },
  "Action": {"Block": {}}
}

// 特定パスへのアクセスを国で制限
{
  "Name": "JapanOnlyAdminPath",
  "Statement": {
    "AndStatement": {
      "Statements": [
        {
          "ByteMatchStatement": {
            "SearchString": "/admin",
            "FieldToMatch": {"UriPath": {}},
            "TextTransformations": [{"Priority": 1, "Type": "LOWERCASE"}],
            "PositionalConstraint": "STARTS_WITH"
          }
        },
        {
          "NotStatement": {
            "Statement": {
              "GeoMatchStatement": {
                "CountryCodes": ["JP"]
              }
            }
          }
        }
      ]
    }
  },
  "Action": {"Block": {}}
}

WAFログの設定と分析

# WAFログをKinesis Firehose経由でS3に送信
aws wafv2 put-logging-configuration \
  --logging-configuration '{
    "ResourceArn": "arn:aws:wafv2:us-east-1:123456789012:global/webacl/my-web-acl/xxx",
    "LogDestinationConfigs": [
      "arn:aws:firehose:us-east-1:123456789012:deliverystream/aws-waf-logs-my-stream"
    ],
    "RedactedFields": [
      {"SingleHeader": {"Name": "authorization"}}
    ]
  }'
-- AthenaでWAFログを分析(ブロックされたリクエストの分析)
SELECT
  httprequest.clientip,
  count(*) as blocked_count,
  array_join(array_agg(DISTINCT terminatingruleid), ', ') as triggered_rules
FROM waf_logs
WHERE action = 'BLOCK'
  AND from_unixtime(timestamp/1000) > NOW() - INTERVAL '24' HOUR
GROUP BY httprequest.clientip
HAVING blocked_count > 100
ORDER BY blocked_count DESC
LIMIT 20;

WAFとShieldの関係

AWS Shield Standard(無料):
  インフラ層のDDoS防御(L3/L4)
  すべてのAWSリソースに自動適用

AWS WAF:
  アプリケーション層(L7)の防御
  別途設定が必要

AWS Shield Advanced:
  Shield Standard + 高度なDDoS対応
  WAFと組み合わせて包括的なDDoS対策
  SRT(DDoS対応チーム)サポート付き

試験頻出ポイント

シナリオ回答
SQLインジェクション・XSSを防ぐAWSマネージドルールCRS
特定IPからの大量リクエストをブロックレートベースルール
日本からのみAPIアクセスを許可地理的制限ルール
CloudFrontへのWAF適用us-east-1でWebACLを作成
ボットのスクレイピングを防ぐボットコントロールマネージドルール
WAFのデフォルトアクションBlock または Allow(設定による)

まとめ

WAFはマネージドルールを基本として、カスタムルールでアプリ固有の要件に対応するレイヤー構成が効果的だ。CloudFrontへの適用はus-east-1でのWeb ACL作成が必要な点に注意。レートベースルールはDDoS対策の第一線として必ず設定する。