
AWSクラウド基盤アーキテクトの松井です。主に、コンテナ、サーバレス、IaC、CI/CD、セキュリティなどに関する様々なAWS最新技術を駆使し、お客様に最適なAWSアーキテクチャを提案・構築しています。
2024年3月に、様々な脅威からWebアプリケーションを保護するマネージドサービス「AWS WAF」のアップデートがありました。このアップデートでは、一部のAWSサービスに対するリクエストボディの検査のサイズ上限が8KBから最大64KBまで緩和されました。CSVやJSONファイルなど大きなテキストファイルの取り込みといった、リクエストボディが多くなりやすい機能を実装される方には朗報だったのではないかと思います。
しかし、特定のAWS Managed Rules for AWS WAFを適用している場合、8KB以上のリクエストサイズ上限のリクエスト制限ルールが適用されてしまい、アップデートされた上限までリクエストボディの検査が行われなくなります。そこで本コラムでは、AWS WAFのリクエストボディ検査の上限緩和に適用した設定方法をご紹介します。前半はAWS WAFの説明がメインとなりますので、設定方法をすぐご覧になりたい方は「設定手順」の項目までスキップしてください。
AWS WAFとは
AWS WAFは、Webアプリケーションへの攻撃を防ぐためのファイアウォールの役割を担います。ルールを設定することで、SQLインジェクションやクロスサイトスクリプティングなどの一般的な攻撃からWebアプリケーションを保護できます。2025年2月時点では、以下のAWSサービスならびにリソースタイプを保護することが可能です。
- Amazon CloudFront distribution:
グローバルコンテンツ配信ネットワークを用いて低レイテンシーかつ高スループットでコンテンツを配信するサービス。 - Amazon API Gateway REST API:
RESTful APIを作成、公開、管理し、サーバレスでスケーラブルなAPIを提供するサービス。 - Application Load Balancer:
トラフィックを複数のEC2インスタンスやコンテナなどに分散し、アプリケーションの可用性とパフォーマンスを向上させるロードバランサー。 - AWS AppSync GraphQL API:
Managed GraphQLサービスを使用して、データのリアルタイム同期やオフラインアクセスが可能なアプリケーションを構築するサービス。 - Amazon Cognito user pools:
アプリケーションのユーザー認証と管理を行い、安全にサインインを実装するためのユーザーディレクトリ。 - AWS App Runnerservice:
コンテナ化されたWebアプリケーションやAPIを手軽にデプロイ・管理できるフルマネージドサービス。 - AWS Verified Access instance:
ゼロトラストアプリケーションアクセスを提供し、ユーザーのアクセスを検証・制御するサービス。

AWS WAFは2015年10月に正式にサービスが開始され、2019年11月に「AWS WAF v2」としてさらに進化した機能が提供されています旧サービス名はAWS WAF ClassicまたはAWS WAF v1と呼ばれています。AWS WAF v2では、「AWS Managed Rules for AWS WAF」と呼ばれる、AWSが提供する事前構築されたセキュリティルールセットを利用できるため、ユーザーは迅速にセキュリティを強化し、ルール作成の手間を省くことができます。
AWS Managed Rules for AWS WAFの種類
本コラムでは無償かつ汎用性の高いルールセットを一部ご紹介しますので、その他のルールセットは公式ドキュメントをご確認ください。
- コアルールセット (CRS) マネージドルールグループ(AWSManagedRulesCommonRuleSet)
一般的なWeb攻撃を防ぐための基本的なルールセットであり、OWASP Top 10 などのOWASP出版物に記載されている高リスクの脆弱性や一般的に発生する脆弱性など幅広い脆弱性をブロックするためのルールセット。 - 管理者保護マネージドルールグループ(AWSManagedRulesAdminProtectionRuleSet)
管理ポータルや管理機能への不正アクセスをブロックするためのルールセット。 - 既知の不正な入力マネージドルールグループ(AWSManagedRulesKnownBadInputsRuleSet)
悪用可能なウェブアプリケーションパスや、 XMLオブジェクトを盗み出すことのできるHTTPメソッドの利用など、よく知られた悪意ある入力パターンをブロックするためのルールセット。 - Amazon IP 評価リストマネージドルールグループ(AWSManagedRulesAmazonIpReputationList)
Amazon内部の脅威インテリジェンスに基づき、悪意のあるIPアドレスからのトラフィックをブロックするためのルールセット。 - SQL データベースマネージドルールグループ(AWSManagedRulesSQLiRuleSet)
SQLインジェクション攻撃など、SQLデータベースの悪用に関連するリクエストパターンをブロックするルールセット。
AWS WAFの検査サイズの上限について
AWS WAFにはリクエストに対する検査サイズの上限が定められており、アップデート前までは全サービス一律8KBまでの制約がありましたが、現在は各AWSサービスならびにリソースタイプによって Body/JSON BodyとHeaders/Cookiの仕様になっています。
なお、検査サイズの上限を超えた場合、デフォルトの設定ではサイズ制限内にあるリクエストのみ適用したルールセットに従って検査されます。
デフォルトの設定では超過したリクエスト内容は検査されず、超過したリクエスト内に攻撃が含まれていたとしてもリクエストを素通りしてしまう恐れがある(*)ため、検査サイズの上限を超えたリクエストへの対策が必要になります。
⠀ ⠀
(*) 例:AWS WAFにSQLデータベースマネージドルールグループのみを適用した場合、先頭から8KBまでのリクエストボディに攻撃が含まれていればリクエストをブロックできるが、8KBを超えたリクエストボディに攻撃が含まれていた場合はリクエストを通してしまう、など。
Body/JSON Body
AWSサービス | デフォルト上限 | 上限緩和可否 |
AWS AppSync GraphQL API Application Load Balancer |
8 KB | 不可 |
Amazon CloudFront distribution Amazon API Gateway REST API Amazon Cognito user pools AWS App Runner service AWS Verified Access instance |
16 KB | 可能 ※有償オプションとして32 KB、48 KB、64 KB まで緩和可能 |
Headers/Cookie
リクエストヘッダーまたはCookieの最初の 8 KB まで、および最初の 200 個のヘッダー/Cookieまで検査 (全サービス共通)
AWS Managed Rules for AWS WAFによるリクエストボディサイズの制限
AWS Managed Rules for AWS WAFの中には、リクエストボディサイズの検査項目が含まれているものがあります。
それが、「AWS Managed Rules for AWS WAFの種類」の章でご紹介した「コアルールセット (CRS) マネージドルールグループ」です。
本ルールセットは一般的なWeb攻撃や脆弱性からの保護に適応しているため、多くのユーザーが利用されていると思いますが、ルールセット内にはリクエストボディサイズの検査項目が含まれており、8KBを超えるリクエストボディは検査に引っかかります(ルール名は、「SizeRestrictions_BODY」です)。
そのため、ルールセットを適用しつつ、リクエストボディサイズを8KB以上にするには、「SizeRestrictions_BODY」の検査を除外し、リクエストボディサイズの検査項目を別途追加する必要があります。
<AWS WAFのリクエストボディ検査改善ルールイメージ>

設定手順
動作確認環境(初期状態)
API Gateway REST APIとAWS LambdaでREST APIの環境を構築し、コアルールセット (CRS) マネージドルールグループが適用されたAWS WAFをアタッチした状態で開始します。
REST APIにボディサイズが8KB(8,192Byte)以上のリクエストを送信すると、AWS WAFによってブロックされます。
#8KB未満のリクエスト送信
~$ base64 /dev/urandom | head -c 8298 > request_body.txt
:~$ curl -X POST -d @request_body.txt https://yqy02v6k53.execute-api.ap-northeast-1.amazonaws.com/Prod
{"request_body_size": 8191}
# 8KB以上のリクエスト送信
~$ base64 /dev/urandom | head -c 8299 > request_body.txt
~$ curl -X POST -d @request_body.txt https://yqy02v6k53.execute-api.ap-northeast-1.amazonaws.com/Prod
{"message":"Forbidden"}
※動作確認では、Linux環境上で乱数生成コマンド(/dev/urandom)と、指定したバイト数を出力するコマンド(head -c)を利用してリクエストボディを作成し、対象のAPIに対してリクエストを送信しています。私の環境だとコマンドで指定したバイト数通りにリクエストボディが生成されなかったため、多少バイト数を微調整しています。APIのレスポンスでは、リクエストボディで受け取ったバイト数を出力するようにAWS Lambdaのアプリケーションを実装しています。
設定変更①SizeRestrictions_BODYのブロック無効化
AWS WAFの管理画面から対象のWeb ACLの詳細画面を表示し、[Rules]タブから[Aws-AWSManagedRulesCommonRuleSet](コアルールセット (CRS) マネージドルールグループ)を選択した状態で、[Edit]をクリックします。

リクエストボディの検査項目である[SizeRestrictions_BODY]のみアクションを[Override to COUNT]に変更し、[Save rule]をクリックします。

次の遷移画面では何も設定せず[Save]をクリックします。
これで[SizeRestrictions_BODY]に関する検査の無効化は完了です。

この状態でAWS WAFを適用したAPIに8KB以上のリクエストを送信すると、リクエストが通るようになります。
# 8KB以上のリクエスト送信
~$ curl -X POST -d @request_body.txt https://yqy02v6k53.execute-api.ap-northeast-1.amazonaws.com/Prod
{"request_body_size": 8192}
AWS WAFのサンプリング画面を確認したところ、リクエストが[BLOCK]から[COUNT]に変化していることが確認できました。

設定変更②リクエストボディサイズの検査条件追加
再度AWS WAFの管理画面から対象のWeb ACLsの詳細画面を表示し、[Rules」タブから[Add rules]のプルダウンを選択し、[Add my own rules and rule groups]をクリックします。

[Rule builder]を選択して任意のルール名を入力し、[Statement]の[Inspect]で[Body]を選択します。さらに、[Match type]で[Size granter than](超過)を選択した上で、[Size in bytes]で16KB(16,384Byte)を入力し、[Add rule]をクリックします。

次の遷移画面では、ルールの検査順序を指定できますが、今回はこのまま[Save]をクリックします。
順序を入れ替えても問題ありません。

この状態でAWS WAFを適用したAPIに16KB以下のリクエストを送信すると、そのリクエストは許容され、16KBを超えるリクエストを送信するとリクエストが拒否されました。
# 16KB以下のリクエストを送信
~$base64 /dev/urandom | head -c 16599 > request_body
$ curl -X POST -d @request_body.txt https://yqy02v6k53.execute-api.ap-northeast-1.amazonaws.com/Prod
{"request_body_size": 16384}
# 16KBを超過するリクエストを送信
~$ base64 /dev/urandom | head -c 16600 > request_body.txtrtheast-1.amazonaws.com/Prod
~$ curl -X POST -d @request_body.txt https://yqy02v6k53.execute-api.ap-northeast-1.amazonaws.com/Prod
{"message":"Forbidden"}
AWS WAFのサンプリング画面を確認したところ、追加したリクエストボディサイズのルールによってリクエストが[BLOCK]されている形跡を確認できました。

補足:検査するリクエストボディサイズの緩和方法
Web ACLsの「Associated AWS resources」タブを開くと[Web request body inspection]の項目にて[Body size limit]を変更できます。ただし、デフォルト値から16 KB ごとに、100 万件のリクエストあたり 0.30 USD の請求が発生しますので、本設定で追加されるセキュリティのコストが妥当であるかを事前に検討してから適用することをお勧めします。

さいごに
AWS WAFはアプリケーション保護を手軽に適用できる有力なサービスです。最新のアップデートを最大限に取り入れながら、様々なアプリケーションに適用していきましょう。
画像ファイルのように64KBを超えてしまうようなリクエストを送信したい場合、対象のリクエストを取り扱うAPIのパスのみをリクエストボディの検査ルールから除外する方法があります。また、AWS WAFを利用せずに、別の経路やサービスを利用してセキュリティリスクを抑えるといった対策をとることも可能です。
上記の内容は、また別のコラムでご紹介できればと思いますので、ぜひまたFUJISOFT Technical Reportをご覧いただければ幸いです。
富士ソフトのAWS関連サービスについて、詳しくはこちら
アマゾンウェブサービス(AWS)