まーぽんって誰がつけたの?

iOS→Scala→インフラなおじさん技術メモ

Play FrameworkのRequest.remoteAddressの値が突然変わった

現象

あるサービスの仕組みで処理結果を通知してくるために、自サーバーのapiをたたきにくるときがある。この際に、サーバー側では本当にそのサービスからのリクエストかどうかをみるために、あらかじめIPアドレスを設定しておいてvalidateしてるが、あるリリースのバージョンからvalidateに失敗するようになった。 ログを見てみると、該当サービスじゃなくてELBからのIPアドレスになっていた。

原因

  • play frameworkのverが勝手に上がってしまっていた。
  • addSbtPluginで指定しているplayは2.4.3
  • kamon-playが依存しているのがplay2.4.6だった
  • play2.4.3 -> play2.4.4 でx-forwarded-forヘッダの取得まわりで変更が入っていた
  • x-forwarded-forは簡単にspoofingできてしまうので、信頼できるproxyからだった場合にのみremoteAddressにx-forwarded-forヘッダを利用するようになった
  • サーバーではplay.http.forwarded.proxiesは設定していなかったため、remoteAddressがx-forwarded-forの値ではなく、単にhostの値(ELB)が使われるようになった。

対応

  • play.http.forwarded.proxies = [ "0.0.0.0/0", "::/0" ]を追加
  • Spec追加する
  • ただし、playのversionが上がるのは厳しいので、play2.4.6が入らないようにしたい