Amplifyでハマった8KBルール:WAFが静かに拒否する大きなリクエスト
はじめに
こんにちは、ispecでエンジニアをしている堀です!
今回は、弊社がAmplifyを使用している中でハマったポイントについて共有します。
結論から言うと、AmplifyにWAFを設定すると、ボディサイズが8KB以上のリクエストはブロックされ403エラーになるので、しきい値を変更するなどして対応しようね!ということです。
発生した問題
弊社ではNext.jsをAmplifyにデプロイしています。あるとき、この構成で開発を行っているメンバーから、「特定のエンドポイントだけ403で動かない」という相談がありました。
意図的に403を返す実装はしていなかったので、真っ先に疑ったのがファイアウォールです。最近AmplifyにAWS WAFを設定できるようになり、このプロダクトでも導入していたんですよね。
原因究明
WAFのログを確認してみると、案の定、該当のエンドポイントがブロックされていました。
ブロック理由は「AWS#AWSManagedRulesCommonRuleSet#SizeRestrictions_BODY」。調べてみると、リクエストのボディサイズがデフォルトの16KBを超過するとブロックされるルールのようです。(このあとの検証で分かったことですが、16KBではなく8KBでブロックされていそうです、、)
実際、問題のエンドポイントは長文データを送信していました。
検証してみた
リクエストのボディサイズを徐々に変えながらテストしていったところ、8KBを下回ったところで通信が成功しました。
WAFの公式ドキュメントには16KBがデフォルト値と書かれており、コンソール上でも16KBに設定されていましが、実際は8KBでブロックされていそうでした。
公式ドキュメントでは8KBがデフォルト値になるサービスもあると書かれていますが、今回は該当していなさそうです。開発者ツールに表示されているcontent-length
は単位がバイトじゃない?など色々調べましたが、結局分かりませんでした。何か知っている方教えて下さい、、🙏
ファイルアップロードも例外ではない
今回は長文のテキストデータでしたが、画像などファイルアップロードでも例外なく、このルールでブロックされるようなので注意が必要です。
解決方法
解決方法はいくつかありそうです。
- WAF自体をOFFにする
- リクエストのボディサイズのルールをOFFにする
- AWS WAFの設定で「Override to Count」にするなど
- リクエストのボディサイズが、しきい値以下になるように実装を変更する
- アプリケーション側にバリデーションを追加するなど
- しきい値をアップする
- 16KBよりも大きい値に変更すると、追加料金がかかるようなので注意が必要です
各サービスの状況や要件によって対応方法は異なります。
今回我々は、しきい値をアップすることで対応しました。
まとめ
Amplifyは簡単にWAFを追加できる反面、Amplifyの画面では詳細な設定を変更できないため、こういったルールにハマりやすいです。
みなさんも、Amplifyにデプロイしたアプリで、特定のエンドポイントが403になる際は、WAFを疑ってみてください。
この記事が誰かの役に立ったら幸いです!
余談ですが、Amplifyは裏側で動くLambdaに30秒の制限があるなど、使いづらい点もあるので、VercelやCloudflareへの移管も検討しています。
Discussion