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が入らないようにしたい