mazyu36の日記

某SIer所属のクラウドエンジニアのブログ

AWS WAFのマネージドルールでありがちな予期せぬブロック

はじめに

AWS WAFのマネージドルールについて、観測範囲における誤検知あるある事象をまとめておく。

  • 概要とよくとる対処方法を記載している。ただし対処についてはサービスの要件等を踏まえ、どこまでのリスクを許容するかを判断して設定する必要がある。
  • 緩和する際もいきなりAllowにするのではなく、Countモードを活用し想定通りの挙動となるか確認した方が良い。以下参考リンク。

blog.denet.co.jp

リクエストボディ8kb越えによるブロック(SizeRestrictions_BODY

※2024/3/13追記 AWSのアップデートにより以下のように改善されました。

  • チェックの閾値を最大64KBまでに変更可能
  • デフォルトの閾値が8KB→16KBに変更

aws.amazon.com

概要

AWSManagedRulesCommonRuleSetSizeRestrictions_BODYが該当する。

観測範囲では最も見る事象。

リクエストボディが8kbを超過する場合はブロックするというものであり、例えばファイルのアップロード機能やリストの送信機能等がある場合は高確率で引っかかる。

SizeRestrictions_BODY

Inspects for request bodies that are over 8 KB (8,192 bytes).

docs.aws.amazon.com

対処方法

以下のような対処をすることが多い。

  • リクエストボディが8kbを超過するURIを特定できる場合は、スコープダウンステートメントを使用してWAFの検査対象外とする。CDKで行う場合の例としては以下。

mazyu36.hatenablog.com

  • URIを特定できない場合(サイズ超過のパスが大量にある等)の場合は、SizeRestrictions_BODYを除外することを検討する。

ファイルのアップロードがブロックされる(複数ルール)

概要

ファイルのアップロード機能がある場合、いろいろなルールに引っかかりやすい。AWS公式のknowledge-centerにも掲載されている。

aws.amazon.com

該当するルールは以下であり、ファイルのランダムな文字列に反応し、攻撃と誤検知してしまうケースがある。

  • CrossSiteScripting_BODY
  • SQLi_BODY
  • WindowsShellCommands_BODY
  • GenericLFI_BODY
  • SizeRestrictions_BODY ※これは前述のリクエストボディのサイズ制限

対処方法

XSSSQLインジェクションのルールは除外を避けたいので、ヘッダーやURIを元にスコープダウンステートメントを使用して、特定のリクエストのみWAFの検査対象外とすることが多い。

なお上記によらず、ファイルのマルウェア対策は検討が必要。

クラウドプロバイダー経由のアクセスによるブロック(HostingProviderIPList

概要

AWSManagedRulesAnonymousIpListHostingProviderIPListが該当する。

クラウドプロバイダーからのアクセスなどエンドユーザーからのトラフィックの可能性が低いものをブロックするというものである。

HostingProviderIPList

Inspects for a list of IP addresses from hosting and cloud providers, which are less likely to source end-user traffic. The IP list does not include AWS IP addresses.

docs.aws.amazon.com

よく見るケースとしては以下のようなものがある。

  • パブリッククラウド経由でアクセスを行う際にブロックされる。プロキシを使っている場合にブロックされたというのはありがち。
  • AWS外のサービス(監視サービス等)からの通信がブロックされる。

対処方法

以下のようにすることが多い。

  • 広く一般的に公開するサービスの場合はHostingProviderIPListを除外する(過去の事例では誤検知がかなり多く、邪魔でしかなかったケースあり)。
  • クローズドに公開するサービスの場合は、スコープダウンステートメントにおいてIPを元に地道に除外設定をする。

認可リクエストがSQLインジェクションと判断されてブロック(AWSManagedRulesSQLiRuleSet

概要

AWSManagedRulesSQLiRuleSet全般が該当するが、特にクエリパラメータに関するルールが該当(SQLi_QUERYARGUMENTS, SQLiExtendedPatterns_QUERYARGUMENTS)。

docs.aws.amazon.com

OAuthやOIDCにおける、認可リクエスト(認可エンドポイントへのリクエスト)がSQLインジェクションと判断されやすい。

特にクエリパラメータには様々な値を入れるため引っかかりやすい(経験があるのはKeycloakなど)。

qiita.com

対処方法

SQLインジェクションのためルール自体の除外は避け、ヘッダーやURIを元にスコープダウンステートメントを使用して、特定のリクエストのみWAFの検査対象外とすることが多い。

ALB-Cognito連携におけるブロック(複数ルール)

概要

ALBとCognitoで連携し、コード変更なしでマネージドなユーザー認証の仕組みを作る手段がある。

docs.aws.amazon.com

フローは上記参考資料から抜粋。

一方CognitoでWAFサポートが行われ、Hosted UIの保護などを目的としてCognitoに対してWAFを適用することがある。

aws.amazon.com

※ALB-Cognito連携している状態で、ALBとCognitoにWAFを付与しても2重になるだけで意味ないのでは?と少し思ったが、直接Auth Endpointにアクセスしてきた場合などはCognitoに付与していないと防げない認識。違ってたらこっそり教えてください。

この時以下のリクエストがブロックされる。

  • /oauth2/authoraize :認可エンドポイントへのリクエスト。AWSManagedRulesSQLiRuleSetによりブロックされる。1つ前の事象と同様のもの。
  • /oauth2/tokenトークンエンドポイントへのリクエスト。AWSManagedRulesCommonRuleSetNoUserAgent_HEADERによりブロック。ヘッダーにUser-Agentが存在しないことで検知される。

対処方法

パスが特定できているため、スコープダウンステートメントを元にWAFの検査対象外とする。