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対策の第一線として必ず設定する。