コード日進月歩

しんくうの技術的な小話、メモ、つれづれ、など

RailsのIpSpoofAttackErrorとは何なのかをざっくり整理する

そもそもどういう事象なのかも含めて整理する。

前提としてIp Spoofing(IPスプーフィング)とは何か

送るリクエストの送信元IPを偽装してアクセスをする手法。IP制限などで特定のIPのリクエストしか受け付けない環境に対して、自身のIPを偽装をすることで制限を突破することなどを目的に行われる。

通常TCP/IPの方式ではTCPが送信元のIPを改ざんするのは難しい作りになっているため、TCPを用いる場合での送信元IPの偽装は難しいとされている。

RailsのIpSpoofAttackErrorとは

IpSpoofAttackErrorが発生するところのv7.2.0のソースコード を見ると、リクエスト元となるクライアントIPを推測する処理のところでraiseされる。

この処理ではIPアドレスをHTTPのヘッダ情報から類推して特定する処理となっている。その際に利用するのが REMOTE_ADDR , CLIENT-IP , X-FORWARDED-FOR ヘッダのいずれかを利用する。その際にあまり併用されることがない CLIENT-IPX-FORWARDED-FOR に関して送信元IPを含むべきX-FORWARDED-FORCLIENT-IPで書かれているIPが入っていない場合に異常として検知するもの。(X-FORWARDED-FOR に関しては過去の記事に書いたので説明は端折ります)該当コードとしては以下のあたりです。

should_check_ip = @check_ip && client_ips.last && forwarded_ips.last
if should_check_ip && !forwarded_ips.include?(client_ips.last)
  # We don't know which came from the proxy, and which from the user
  raise IpSpoofAttackError, "IP spoofing attack?! " \
    "HTTP_CLIENT_IP=#{@req.client_ip.inspect} " \
    "HTTP_X_FORWARDED_FOR=#{@req.x_forwarded_for.inspect}"
end

そのため、原義のIp SpoofingよりもHTTPヘッダでの整合性の合わない話へのエラーとなっている。

無効にするには

このraiseが上がらないように設定をすることもできる。Railsガイド曰く以下の通り。

この設定はconfig.action_dispatch.ip_spoofing_checkオプションとconfig.action_dispatch.trusted_proxiesオプションで変更可能です。 - Rails アプリケーションの設定項目 - Railsガイド

そのためしかるべきところで

config.action_dispatch.ip_spoofing_check = false

としておけばこのチェック自体がスキップされる。

余談:CLIENT-IP ヘッダについて

この調査の際に、CLIENT-IP ヘッダの仕様について調べようとしたところ2024年時点だと全然情報が見つけられずでした。仮に使うとしても X-Real-IP などで同様のことをやるのが一般的という情報しか出てこなかったので、今だとセットするほうが珍しい可能性があります。それ故にもしエラーが上がった場合は経路的にどこでセットされているのかを確かめるようほうが良いかもしれません。

参考・関連リンク