最初に結論
今回は結論ファーストで書くと、AWS WAFはALBに適用する場合8KBのリクエストボディまでしか検査しないというつまらない記事になってしまう。これはマネージドルールでもカスタムルールでも同じである。
もう少し丁寧に説明しつつ、この仕様を知った経緯を書くことで同じ過ちに時間を取られる人を減らすことができたらと思う。
もう少し丁寧に説明
公式ドキュメントにもあるのですが、ALBおよびAppSyncに適用しているWAFでは8KBのリクエストボディまでしか対応していない。
ただ下記サービスについては、デフォルトで16KBまで、緩和申請を行うことで16KBとなる。
・CloudFront
・API Gateway
・Amazon Cognito
・App Runner
・Verified Access
ヘッダーでも8KB、Cookieでも8KBまでが上限で、例外となるサービスはない。
リクエスト容量をオーバーするとどうなるのか
カスタムルールの場合、この容量制限を超えた場合、「ルールステートメントのオーバーサイズの処理オプション」として「Continue」、「Match」、「No match」のアクションを選ぶことができる。
Continue:容量制限内のリクエストについて検査をする
Match:ルールに引っかかったリクエストとして処理する
No match:該当のルールについては問題ないリクエストとして処理する
WAFの処理の負担を減らすためにWCUがあるように、容量上限もWAFの負担を減らすための仕様なのだろうか。
経緯
今回やりたかったこととしては、ファイルアップロードをする機能のセキュリティを担保することであった。数MB程度の画像をアップロードしたい一方、数十GBのアップロードしまくった攻撃をされたら流石に困るという内容である。
最初は、WAFの導入と「コアルールセット (CRS) マネージドルールグループ」の適用を命じられたのだが、ファイルアップロードの機能がルールグループの中にある「SizeRestrictions_BODY」にひっかかってしまう。これが8KBのリクエストボディをブロックするというルール。
アップロードをブロックされたら困るので「SizeRestrictions_BODY」をオフにするが、その一方で上記の「大きすぎるファイルをアップロードされたら困る」という懸念が出る。
それなら、カスタムルールで数MB以上ならブロックするルールを作ればいいと思って試そうとしたが、冒頭の8KB上限の存在を知る。
WAFの容量制限より大きい容量で制限をかけたい場合の解決方法
という訳で解決方法だが、サーバーのPHPの設定ファイル(php.ini)やApacheの設定ファイル(httpd.conf)に容量制限を書いて解決。
結局、AWSサービスで完結させたいという気持ちがありつつも、サーバー内部を見る必要があったため、なかなかセキュリティ設定を完全にAWSに一元化するというのは難しいというのが現実。まあ、かなり小さいことではあるけど。