ALB にて HTTP ステータスコード 501 エラーと処理されるリクエストを AWS WAF に転送可能(ブロック)か確認してみた
はじめに
テクニカルサポートの 片方 です。
ALB にて HTTP ステータスコード 501 エラーを検知した際、AWS WAF を利用してブロック可能か検証する機会があったので、紹介します。
先に結論から
HTTP ステータスコード 501 エラーはサポートされていない値を含む Transfer-Encoding ヘッダーがロードバランサーに送信されたことで発生します。
しかしながら、ALB にて HTTP ステータスコード 501 と処理されるリクエストを AWS WAF に転送することや、HTTP ステータスコード 501 以外で応答させることはできません。
AWS WAF に転送 (評価) 前に ALB が 501 エラーを返す仕様のためです。
HTTP 501: Not implemented
サポートされていない値を含む Transfer-Encoding ヘッダーがロードバランサーに送信されました。Transfer-Encoding でサポートされている値は、chunked と identity です。代わりに、Content-Encoding ヘッダーを使用することができます。
2.AWS WAF はどのようにトラフィックをブロックまたは許可しますか?
基礎となるサービスがウェブサイトへのリクエストを受け取ると、ルールに対して検査するためにそれらのリクエストを AWS WAF へ転送します。リクエストがルールで定義された条件を満たすと、AWS WAF は基礎となるサービスに対し、定義したアクションに基づいてリクエストのブロックまたは許可のいずれかを指示します。
確認してみた
ALB を作成して、AWS WAF をアタッチします。こちらには、IP セットにて、私の IP アドレスをブロックするように設定しました。
では、curl コマンドを利用して検証します。
通常アクセスして AWS WAF でブロックされるか検証
$ curl -v http://Test-A-Appli-usbIcmUS8RSN-1059972630.ap-northeast-1.elb.amazonaws.com/
* Trying 18.176.105.241:80...
* TCP_NODELAY set
* Connected to Test-A-Appli-usbIcmUS8RSN-1059972630.ap-northeast-1.elb.amazonaws.com (18.176.105.241) port 80 (#0)
> GET / HTTP/1.1
> Host: Test-A-Appli-usbIcmUS8RSN-1059972630.ap-northeast-1.elb.amazonaws.com
> User-Agent: curl/7.68.0
> Accept: */*
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 403 Forbidden
< Server: awselb/2.0
< Date: Sat, 01 Mar 2025 07:28:33 GMT
< Content-Type: text/html
< Content-Length: 118
< Connection: keep-alive
<
<html>
<head><title>403 Forbidden</title></head>
<body>
<center><h1>403 Forbidden</h1></center>
</body>
</html>
* Connection #0 to host Test-A-Appli-usbIcmUS8RSN-1059972630.ap-northeast-1.elb.amazonaws.com left intact
AWS WAF より 403 でブロックされていることが確認できました。
Transfer-Encoding ヘッダーを付与して検証
$ curl -v -H "Transfer-Encoding: invalid-value" http://Test-A-Appli-usbIcmUS8RSN-1059972630.ap-northeast-1.elb.amazonaws.com/
* Trying 18.176.105.241:80...
* TCP_NODELAY set
* Connected to Test-A-Appli-usbIcmUS8RSN-1059972630.ap-northeast-1.elb.amazonaws.com (18.176.105.241) port 80 (#0)
> GET / HTTP/1.1
> Host: Test-A-Appli-usbIcmUS8RSN-1059972630.ap-northeast-1.elb.amazonaws.com
> User-Agent: curl/7.68.0
> Accept: */*
> Transfer-Encoding: invalid-value
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 501 Not Implemented
< Server: awselb/2.0
< Date: Sat, 01 Mar 2025 07:33:11 GMT
< Content-Type: text/html
< Content-Length: 130
< Connection: close
<
<html>
<head><title>501 Not Implemented</title></head>
<body>
<center><h1>501 Not Implemented</h1></center>
</body>
</html>
* Closing connection 0
AWS WAF で 403 が返されず、501 が返されていることを確認しました。
ALB アクセスログを確認
念のため、ALB アクセスログを確認します。
※ 一部マスクします
2025-03-01T07:30:47.405000Z "waf,forward" "-" "-" "10.0.27.42:80" "200" "-" "-" TID_93dacd264d8260438aaa6a02f683140a
http 2025-03-01T07:33:11.100981Z app/Test-A-Appli-usbIcmUS8RSN/4de8d4acf5ca4aa8 124.144.xxx.xxx:54640 - -1 -1 -1 501 - 167 284 "GET http://test-a-appli-usbicmus8rsn-1059972630.ap-northeast-1.elb.amazonaws.com:80/ HTTP/1.1" "curl/7.68.0" - - - "-" "-" "-" - 2025-03-01T07:33:11.100000Z "-" "-" "-" "-" "-" "-" "-" TID_c02eb252d8ec62428ce1166a61ffb3a3
curl コマンド実行時において、WAF を通過していることを示す "waf,forward" がありました。
また、クライアントからの失敗したアクセス HTTP ステータスコード 501 エラーもあります。
まとめ
- ALB の HTTP ステータスコード 501 エラーは WAF による制御の前に発生する
- Transfer-Encoding ヘッダーなどの不正な値による 501 エラーは WAF でブロックできない
このような仕様であるため要件次第ではあるものの、HTTPコード 5xx のメトリクスではなく個別のメトリクス (HTTPCode_ELB_500_Count,HTTPCode_ELB_502_Count など) を利用して監視する事も検討ください。
本ブログが誰かの参考になれば幸いです。
参考資料
- Application Load Balancer のトラブルシューティング - エラスティックロードバランシング
- よくある質問 - AWS WAF | AWS
- AWS WAF での IP セットの作成と管理 - AWS WAF、 AWS Firewall Manager、および AWS Shield Advanced
アノテーション株式会社について
アノテーション株式会社は、クラスメソッド社のグループ企業として「オペレーション・エクセレンス」を担える企業を目指してチャレンジを続けています。「らしく働く、らしく生きる」のスローガンを掲げ、様々な背景をもつ多様なメンバーが自由度の高い働き方を通してお客様へサービスを提供し続けてきました。現在当社では一緒に会社を盛り上げていただけるメンバーを募集中です。少しでもご興味あれば、アノテーション株式会社WEBサイトをご覧ください。