🛡️

Amplifyでハマった8KBルール:WAFが静かに拒否する大きなリクエスト

に公開

はじめに

こんにちは、ispecでエンジニアをしている堀です!
今回は、弊社がAmplifyを使用している中でハマったポイントについて共有します。

結論から言うと、AmplifyにWAFを設定すると、ボディサイズが8KB以上のリクエストはブロックされ403エラーになるので、しきい値を変更するなどして対応しようね!ということです。

発生した問題

弊社ではNext.jsをAmplifyにデプロイしています。あるとき、この構成で開発を行っているメンバーから、「特定のエンドポイントだけ403で動かない」という相談がありました。

意図的に403を返す実装はしていなかったので、真っ先に疑ったのがファイアウォールです。最近AmplifyにAWS WAFを設定できるようになり、このプロダクトでも導入していたんですよね。

https://dev.classmethod.jp/articles/amplif-waf-integration-preview/
https://qiita.com/har1101/items/7b70f03710636bc96743

原因究明

WAFのログを確認してみると、案の定、該当のエンドポイントがブロックされていました。

ブロック理由は「AWS#AWSManagedRulesCommonRuleSet#SizeRestrictions_BODY」。調べてみると、リクエストのボディサイズがデフォルトの16KBを超過するとブロックされるルールのようです。(このあとの検証で分かったことですが、16KBではなく8KBでブロックされていそうです、、)

実際、問題のエンドポイントは長文データを送信していました。

検証してみた

リクエストのボディサイズを徐々に変えながらテストしていったところ、8KBを下回ったところで通信が成功しました。



WAFの公式ドキュメントには16KBがデフォルト値と書かれており、コンソール上でも16KBに設定されていましが、実際は8KBでブロックされていそうでした。

公式ドキュメントでは8KBがデフォルト値になるサービスもあると書かれていますが、今回は該当していなさそうです。開発者ツールに表示されているcontent-lengthは単位がバイトじゃない?など色々調べましたが、結局分かりませんでした。何か知っている方教えて下さい、、🙏

https://docs.aws.amazon.com/waf/latest/developerguide/web-acl-setting-body-inspection-limit.html

ファイルアップロードも例外ではない

今回は長文のテキストデータでしたが、画像などファイルアップロードでも例外なく、このルールでブロックされるようなので注意が必要です。

https://zenn.dev/aidiot_dev/articles/20231019-aws-waf

解決方法

解決方法はいくつかありそうです。

  • WAF自体をOFFにする
  • リクエストのボディサイズのルールをOFFにする
    • AWS WAFの設定で「Override to Count」にするなど
  • リクエストのボディサイズが、しきい値以下になるように実装を変更する
    • アプリケーション側にバリデーションを追加するなど
  • しきい値をアップする
    • 16KBよりも大きい値に変更すると、追加料金がかかるようなので注意が必要です

各サービスの状況や要件によって対応方法は異なります。
今回我々は、しきい値をアップすることで対応しました。

まとめ

Amplifyは簡単にWAFを追加できる反面、Amplifyの画面では詳細な設定を変更できないため、こういったルールにハマりやすいです。
みなさんも、Amplifyにデプロイしたアプリで、特定のエンドポイントが403になる際は、WAFを疑ってみてください。
この記事が誰かの役に立ったら幸いです!

余談ですが、Amplifyは裏側で動くLambdaに30秒の制限があるなど、使いづらい点もあるので、VercelやCloudflareへの移管も検討しています。

ispec inc.

Discussion