Trusted Proxy とは
Truested Proxyを設定することでProxyを介した際の、正しいURLの生成、リダイレクト、セッションハンドリング、ロギングが可能となる。
プロキシが背後のサーバに伝達するためのHeaderについて
ロードバランサなどのプロキシを介すと、その背後にあるサーバは元のリクエストがどのようなものだったのか具体的にわからなくなる。そのため、プロキシはデファクトスタンダードであるX-Forwarded-*
ヘッダを用いて、背後のサーバに元のリクエスト情報を伝達する。
- X-Forwarded-For - クライアントのIP
- X-Forwarded-Host - クライアントによってブラウザにアクセスされた際のホスト名
- X-Forwarded-Proto - クライアントによって指定されたスキーマやプロトコル(http/httpsなど)
- X-Forwarded-Port - クライアントによって指定されたポート番号(80/443など)
プロキシによってはすべてのヘッダーを設定してくれるわけではない。例えば、AWS ELBの場合X-Forwarded-Host
は取得できない。
それを使わない場合どのような問題が起き得るのか?
サーバの前段にプロキシがある場合、アプリケーションが以下の問題に陥ることがある。
- リダイレクトやサーバサイド言語が発行したURLが、アドレス、プロトコル、そしてポートなどの点において不正確となる
- 個別のセッションが各ユーザに作られなくなり、不適切なアカウントへのアクセスや、ログインができないことが起こり得る
- ロギングや他のデータ収集処理において、プロキシからの情報のみが伝達され、個別のクライアントからのトラフィックやアクションが区別できなくなる
例えば、Laravelにおいて
Laravel 5.5以降においてはデフォルトで同梱されており、外部ライブラリなどは必要としない。設定も簡単である。以下参照。
https://readouble.com/laravel/5.8/ja/requests.html#configuring-trusted-proxies
例えば、AWS ELBの場合は特別な設定がある。
Tip!! AWS Elastic Load Balancingを使用している場合、$headersの値はRequest::HEADER_X_FORWARDED_AWS_ELBに設定する必要があります。$headersで使用する内容の詳細は、Symfonyのtrusting proxiesドキュメントを参照してください。
また、クラウドサービスなどを使っている場合は、ロードバランサのIPアドレスが変化することがあるため、本来プロキシのIPアドレスを設定する場所でアスタリスクを設定する。アスタリスクが二つになると、最も近いプロキシだけでなくすべてのプロキシを信頼する。
<?php
return [
'proxies' => '*',
];
5.4以前のバージョンは以下を使う。
https://github.com/fideloper/TrustedProxy