4
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

ロードバランサやクラウドWAF経由でX-Forwarded-Forを利用する場合のApache設定

Last updated at Posted at 2018-09-27

WEBサービスの話。サーバーにたどり着くまでにAWS-ELB等のロードバランサやクラウド型のWAFを経由する場合、正確なアクセス元IPを取得するにはX-Forwarded-For(今後XFFと呼ぶ)というリクエストヘッダーを見なければならない。
単純に見れば良いというわけではない事が分かったので図解。Apache設定(.htaccess)でゴニョゴニョしてアプリはXFFを見ればよい状態にする事が目的。そもそもアプリで解析して見れば良いのでは?という話は置いておく(一応、環境依存情報はなるべくミドルウェア設定に逃がす思想下の場合では有効)

※ ロードバランサ・クラウドWAF経由の正しい経路外のアクセスかどうかも判断することは難しい事が後々分かってくるので、正しい経路外のアクセスは絶たれている事が前提。まあ、そもそもその時点で負荷や攻撃から守られていないという事のなので何卒。

クライアント ⇒ ロードバランサ経由 ⇒ サーバー行

mermaidjs.github.io_mermaid-live-editor_ (2).png
Designed by Mermaid.js

  • ブラウザAは一般的なピーポー的な人。XFFはそのまま見ればよい。
  • ブラウザBはたまにやってくる人。不正っぽいからと除外してはいけない。
    (提供サービスエンドポイントへの接続元IPを正とする)
  • ブラウザCは明らかに攻撃する気満々な人。XFFヘッダを改ざんしてアクセス。

サーバーにたどり着いた時には、XFFを見ると金魚のフン状態ですが、要は一番後ろを見ればよい。
サーバーのApacheに以下設定を入れると正しいIPで詰め替えられるはず。(間違っていたらご指摘ください。)

Apache(httpd.conf/.htaccess)
    SetEnvIf X-Forwarded-For ", " multiforward
    RewriteCond %{HTTP:X-Forwarded-For} ,\ (.+)$
    RewriteRule .* - [E=CENV_CLIENT_ADDR:%1]
    RequestHeader set X-Forwarded-For "%{CENV_CLIENT_ADDR}e" env=multiforward

クライアント ⇒ クラウドWAF経由 ⇒ ロードバランサ経由 ⇒ サーバー行

mermaidjs.github.io_mermaid-live-editor_ (3).png
Designed by Mermaid.js

サーバーは何を見ればよいか? 要は**後ろから提供サービス内で経由された数(上記の例では2つ目)**を見ればよい。
サーバーのApacheに以下設定を入れると正しいIPで詰め替えられるはず。(間違っていたらご指摘ください。)

Apache(httpd.conf/.htaccess)
    SetEnvIf X-Forwarded-For ", " multiforward
    RewriteCond %{HTTP:X-Forwarded-For} ([0-9\.]+)(,\ [0-9\.]+){1}$
    RewriteRule .* - [E=CENV_CLIENT_ADDR:%1]
    RequestHeader set X-Forwarded-For "%{CENV_CLIENT_ADDR}e" env=multiforward

2行目最後の{1}の数字は後ろから飛ばす数。後ろから2つ目の場合は「後ろから1つ飛ばす」という意味で「1」を指定している。

4
5
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?