AWS-WAF

AWS WAF で X-Forwarded-For でIP制御してみた

皆さんこんにちは。構築担当の川合です。

前回に引き続き最近よく触っているAWS WAFについての記事になります。

レートベースのルールを作成していた時に、ソースのIPアドレスだけでなくX-Forwarded-For を用いてIPアドレスを判定出来るようになっている事が見て取れました。

この場合は、レートベースのルールでの遮断はどうなるのか?という部分が気になりましたので試してみた内容になります。

そもそも?

AWS WAF 自体は、ALBないしはCloudFrontだったりに適用するもので
そもそもソースのIPアドレス取得できるのでは?と思っていました。

ただ、よくよく考えてみるとCloudFront配下にALBを接続してそこにAWS WAF を設定するとソースのIPアドレスが判定出来ないなと思いました。
※そのままだと、ソースのIPアドレスがCloudFrontのエッジサーバーになってしまうので

AWS WAF もリクエストに応じた課金なので、CloudFrontである程度のアクセスをキャッシュしてしまえば、オリジンへのアクセスを減らすことが出来るので料金の節約に繋がるかなと思います。
※もっと潤沢に予算があれば、CloudFrontにも設定してあげればこの段階で攻撃も防げるかとは思います

Web ACL の用意

CloudFrontとALBは予め用意しておいて、X-Forwarded-For を指定するルールをAWS WAF で作ってみます。
今回は、あえてソースのIPアドレスを取得するルールも合わせて作っています。
※ルールはレートベースのルールを採用しています

ソースのIPアドレスで判定

ヘッダー内のX-Forwarded-Forで判定

ヘッダーからIPアドレスを取得する時の注意事項

レートベースのルールですと、上記の画像のようにX-Forwarded-Forの設定では特にオプション的なものは存在しません。

Position inside header の部分に注意書きがありますが、レートベースルールの場合はヘッダーに含まれる最初のIPアドレスが判定に使われます。

ちなみにルールグループに追加するタイプのルールですと、以下のようにさらにオプションを指定する事が可能です。
最初のIPアドレス、最後のIPアドレス、もしくは複数の判定が利用できます。

もし、AWS WAFまでに複数の経路を経由してきて取得したいIPアドレスが上手く取得出来ない場合は、レートベースルールは適さないかもしれません。

また、Overviewで確認できるSampled requestsではソースのIPアドレスしか表示されないようです。X-Forwarded-Forのルールを適用したルールでフィルタリングしてもCloudFrontのIPアドレス(US判定)でしか表示されませんでした。

ですので、以下の動作検証はAWS WAF のログを有効化したうえで進めています。
AWS WAF のログにはIPアドレスが記録されています。

CloudFrontでのキャッシュ

動作検証に際して、CloudFrontでは何もキャッシュしないように設定しています。

何度かテストしても一向に遮断されなかったので調べてみると、そもそもCloudFrontのキャッシュにヒットしていて、CloudFrontでアクセスが処理されていました。
ですので、AWS WAFを設定しているALBまでアクセスが到達しておらずレートベースの閾値にいつまでたっても到達しないという形でした。

こちらも注意点?になるかもしれませんので、頭の片隅にでも置いておいてもらえると助かります。

ソースのIPアドレスを取得した場合

事前に想定した動作だとソースのIPアドレスがCloudFrontのIPアドレスになるので、CloudFrontのIPアドレスが遮断されるのではという所でした。

CloudFrontから払い出されるデフォルトのDNS名でブラウザからアクセスして、実際に遮断される閾値までアクセスを継続して遮断を確認しました。

AWS WAF のログでは、CloudFrontのIPアドレスが判定されていました。

一部抜粋
"rateBasedRuleName":"test","limitKey":"IP","maxRateAllowed":100,"limitValue":"CloudFrontのIPアドレス"

X-Forwarded-For の場合

この場合は、ソースのIPアドレスを正しく取得出来ているので対象のIPアドレスからのアクセスを遮断する形になるかと思います。

同様にCloudFrontのDNS名でアクセスしています。

AWS WAF のログでは、ソースのIPアドレスが判定されていました。
※ちなみにCloudFrontのIPアドレスもログには記録されていました

一部抜粋
"rateBasedRuleName":"test","limitKey":"FORWARDEDIP","maxRateAllowed":100,"limitValue":"ソースのIPアドレス"

ヘッダー判定なので、ソースのIPアドレスでの場合に【IP】となっている箇所が【FORWARDEDIP】に変わっています。

まとめ

気になった内容を試しに異なる条件での判定を入れて実際に試してみました。

今回のようにCloudFrontの配下にAWS WAFを設定しているALBを接続している場合には、ソースのIPアドレスではなくヘッダーのIPアドレスを参照するように設定する事が必要です。

もし、ここの設定を間違えてしまうと前回の記事のようにレートベースのルールを設定した場合にCloudFront経由のアクセスを全て遮断してしまう場合があるので注意が必要です。

ここ何件かAWS WAFに関連するブログをあげましたが、色々設定が出来る分ちゃんと理解しないといけないと思う事もあり、どんどん便利になっているのでアップデートも追いかけていけるようにしていきたいと思います。

返信を残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA