NoUserAgent_HEADERは、HTTPリクエストにUser-Agentヘッダーがない場合に一致するAWS WAFのマネージドルールです。
AWSのCore rule set(AWSManagedRulesCommonRuleSet)に含まれ、既定のルールアクションはBlockです。
ただし、User-Agentがないことだけで攻撃と断定することはできません。
正当なAPIクライアント、Webhook、監視処理なども、実装によっては同じ条件に一致するためです。
導入時はNoUserAgent_HEADERだけをいきなり本番でブロックさせず、Countで一致状況を確認し、正当な通信への影響を調べてから扱いを決めます。
AWS WAFの役割やWeb ACLの基本から確認したい場合は、先に全体像を押さえると設定の位置づけがわかりやすくなります。
NoUserAgent_HEADERが確認する条件
User-Agentは、ブラウザやプログラムなどのクライアントが、自らの種類やバージョンをサーバーへ伝えるために使うHTTPリクエストヘッダーです。
申告値なので、クライアントの身元や安全性を保証する情報ではありません。
| 項目 | 内容 |
|---|---|
| ルールグループ | AWSManagedRulesCommonRuleSet(Core rule set) |
| 確認する条件 | HTTPリクエストにUser-Agentヘッダーがない |
| 既定のアクション | Block |
| 検証時の調整 | 個別ルールのアクションをCountへ変更できる |
このルールが確認するのはヘッダーの有無です。
User-Agentの文字列が信頼できるクライアントを示しているか、リクエストの内容が安全かまでは判定しません。
リクエストがブロックされる流れ
User-AgentヘッダーのないリクエストがWeb ACLへ届きます。- 評価順がNoUserAgent_HEADERまで進むと、ルールの条件に一致します。
- ルールアクションが既定のBlockのままなら、そのリクエストは遮断されます。
AWS WAFのBlockによる既定の応答はHTTP 403ですが、403という結果だけではNoUserAgent_HEADERが原因だと断定できません。
別のWAFルールやアプリケーションも403を返し得るため、AWS WAFのログやサンプルリクエストで一致したルール名を確認します。
User-Agentがない通信を一律に攻撃とみなせない理由
ヘッダーがないことは調査のきっかけになりますが、通信の目的を示す証拠にはなりません。
攻撃用のスクリプトがUser-Agentを省く場合がある一方で、任意の文字列を付けることもできます。
正当な自動通信でも、利用するライブラリや外部サービスの仕様によってヘッダーが送られない場合があります。
特にAPI連携、Webhook、ヘルスチェック、機器からの通信では、ブラウザと同じ前提を置かず、実際のリクエストを確認する必要があります。
判定では、対象パス、送信元、認証の成否、発生頻度、想定している処理との一致を組み合わせます。
User-Agentの有無だけで許可または拒否を決めると、正当な通信の停止と不審な通信の見逃しの両方が起こり得ます。
安全に導入する手順
1. 個別ルールをCountにする
まず、NoUserAgent_HEADERのルールアクションをCountへ上書きします。
Countは一致を記録しますが、その一致だけではリクエストを許可も拒否もせず、Web ACLの後続評価を続けます。
AWS Managed Rulesの種類とCountによる検証方法も、ルールグループ全体の導入を考える際の参考になります。
2. 一致した通信をログで分類する
ログでは、一致したルール名に加えて、どのパスへ、いつ、どの送信元からリクエストが届いたかを確認します。
運用中のAPI、外部連携、監視処理と照合し、正当な通信と調査が必要な通信を分けます。
3. クライアント側で修正できるか確認する
自社が管理するクライアントなら、用途がわかるUser-Agentを明示的に付ける方法が最も影響範囲を絞りやすい対応です。
値に認証情報や個人情報を含めず、クライアント名と管理上必要なバージョンなどにとどめます。
4. 例外の範囲を設計する
クライアントを変更できない場合は、NoUserAgent_HEADERをCountにしたうえで、後続のカスタムルールと条件を組み合わせて扱いを分ける方法を検討します。
特定パスだけを許可したい場合も、広いAllowルールで他の検査まで飛ばさないようにします。
マネージドルールグループのscope-down statementは、NoUserAgent_HEADERだけでなく、そのルールグループが評価するリクエスト範囲を狭めます。
パスを除外する目的で使う場合は、Core rule set内のほかのルールもそのパスを評価しなくなる影響を確認しなければなりません。
| 方法 | 向いている状況 | 確認点 |
|---|---|---|
| クライアントにUser-Agentを追加 | 管理できるAPIクライアントや監視処理 | 値に秘密情報を含めない |
| NoUserAgent_HEADERをCountへ変更 | 導入前の観測、誤検知の調査 | このルールによる遮断は行われない |
| 後続のカスタムルールで条件分岐 | パスなどに応じて扱いを変えたい場合 | ルールの評価順と条件をテストする |
| マネージドルールグループをscope-down | グループ全体の評価対象を絞りたい場合 | ほかのCore rule setルールへの影響も調べる |
curlで有無を比較する方法
curlは通常、curl自身を示すUser-Agentを送信します。
そのため、単にcurlを実行しただけでは「ヘッダーなし」の再現になりません。
管理下の検証用エンドポイントに対して、ヘッダーを除いた場合と明示した場合を比較します。
# User-Agentヘッダーを送らない
curl -I -H "User-Agent:" https://example.com/health
# 管理用のUser-Agentを明示する
curl -I -A "InternalHealthCheck/1.0" https://example.com/health
HTTPステータスだけでなく、同じ時刻帯のAWS WAFログを確認し、どのルールに一致したかを照合します。
第三者のサイトではなく、自社が管理するテスト環境または許可された環境で実施します。
403発生時の確認項目
- AWS WAFログでNoUserAgent_HEADERへの一致を確認したか
- 実際のリクエストに
User-Agentヘッダーが存在するか - その通信元が想定済みのAPI、Webhook、監視処理か
- 個別ルールのアクションがBlockかCountか
- クライアント側でヘッダーを追加できるか
- 例外を設けた場合、対象外にした検査範囲が広すぎないか
- 変更後にログと主要な利用経路を再確認したか
運用で避けたい判断
- 「User-Agentがない通信はすべて攻撃」と決める:正当な自動通信も同じ条件に一致するため、ログとの照合が必要です。
- 「User-Agentがあれば安全」と判断する:値は送信側が設定できるため、安全性の証明にはなりません。
- 「Countなら対策済み」と考える:Countは観測に向くアクションであり、そのルールによる遮断はしません。
- 「特定パスを丸ごとAllowする」:評価順によっては後続の検査を受けなくなるため、必要な条件だけに絞ります。
NoUserAgent_HEADER運用の要点
- NoUserAgent_HEADERは、
User-Agentヘッダーがないリクエストに一致するCore rule setのルールです。 - 既定のBlockを本番で使う前に、個別ルールをCountへ変更して正当な通信への影響を調べます。
- 管理できるクライアントには、用途を識別できる
User-Agentを設定します。 - 例外はパスだけで決めず、認証、送信元、用途、ほかのWAFルールへの影響も含めて設計します。
- 変更後もログを確認し、通信経路や外部連携の変更に合わせて設定を見直します。
この記事に関連する株式会社greedenの取り組み
NoUserAgent_HEADERは、入れるだけでなく通信実態に合わせて検証と調整を続ける運用が必要です。
株式会社greedenは、AWSを含むクラウド環境を見据えたWebシステム開発から、リリース後の保守・運用改善まで支援しています。

