プロキシーサーバーは、リソースを別のサーバーから求めているクライアントが出した要求を仲介する役割を果たします。クライアントは、プロキシーサーバーに接続して、別のサーバーからサービスや利用可能なリソースを要求します。そして、このプロキシーサーバーは複雑な内容を簡素化して制御する方法の 1 つとして、その要求を評価します。
注釈
SSL オフロードまたは Tower 向けの SSL を処理するプロキシーの使用は、サポートされています。Tower が処理する SSL を無効にしておき、SSL の負荷をプロキシーまたはバランスローダーに分散しておく必要があります。また、プロキシー/ロードバランサーはリモートのホスト情報を渡すように設定しておく必要があります。SSL 処理を無効にするには、nginx_disable_https=true
を追加変数として設定して、設定 Playbook に渡す必要があります。設定 Playbook への追加変数の適用に関する情報は、設定用の Playbook を参照してください。
Tower のセッションは、作成時に IP アドレスと関連付けられます。Tower ポリシーでは、セッションを使用する場合には、セッションと、元に関連付けられた IP アドレスと一致することが要件となっています。
プロキシーサーバーをサポートできるように、Tower の設定 (/etc/tower/conf.d/remote_host_headers.py
) にある REMOTE_HOST_HEADERS
一覧の変数を使用して、Tower はプロキシー化された要求 (Tower、HAProxy、Squid、tinyproxy の前の ELB など) を処理します。デフォルトでは、REMOTE_HOST_HEADERS
は ['REMOTE_ADDR', 'REMOTE_HOST']
に設定されています。
プロキシーサーバーを有効化するには、REMOTE_HOST_HEADERS
を REMOTE_HOST_HEADERS = ['HTTP_X_FORWARDED_FOR', 'REMOTE_ADDR', 'REMOTE_HOST']
のように設定します。
注釈
Ansible Tower の新規インストールには、remote_host_headers.py
ファイルが含まれていませんが、Tower の設定ユーザーインターフェースのシステム設定でこれらの値を設定することができます。
Tower はリモートホストの IP アドレスを判断するために、最初の IP アドレスが特定されるまで、REMOTE_HOST_HEADERS
のヘッダー一覧を検索します。
注釈
ヘッダー名は、以下のロジックを使用して作成されます。
CONTENT_LENGTH
と CONTENT_TYPE
の例外を除いて、要求内の HTTP ヘッダーは META キーに変換されます。これは、すべての文字を大文字に変換して、ハイフンはアンダースコアに置き換え、名前に HTTP_
のプリフィックスを追加することで変換されます。たとえば、X-Barkley
と呼ばれるヘッダーは META キー HTTP_X_Barkley
にマッピングされます。
HTTP 要求および応答オブジェクトに関する情報は、https://docs.djangoproject.com/en/1.8/ref/request-response/#django.http.HttpRequest.META を参照してください。
注釈
ロードバランサーで SSL 中断を使用して、Tower ノードの別のポート (443 -> 80) にトラフィックを転送する場合は /etc/tower/settings.py
ファイルに適切に以下の値を設定します。
USE_X_FORWARDED_PORT = True
USE_X_FORWARDED_HOST = True
Tower が REMOTE_HOST_HEADERS = ['HTTP_X_FORWARDED_FOR', 'REMOTE_ADDR', 'REMOTE_HOST']
で設定された場合には、X-Forwarded-For
の値は Tower の前にあるプロキシー/ロードバランサーから取得していると想定されます。Tower にプロキシー/ロードバランサーを使用せずに到達できる場合や、プロキシーがヘッダーを検証しない場合には、X-Forwarded-For
は比較的簡単になりすましを行い、送信元の IP アドレスを偽造することができます。REMOTE_HOST_HEADERS
設定で HTTP_X_FORWARDED_FOR
を使用すると、アクセスすべきでない特定のリソースにも基本的にアクセス権を与えるので、攻撃を受けやすくなります。
これを回避するには、許可済みの「既知のプロキシー」を設定してください。これは、設定 API 経由で PROXY_IP_WHITELIST
設定で行います。この一覧に記載されていないロードバランサーやホストは拒否要求に追加されることになります。
PROXY_IP_WHITELIST
は、この一覧のプロキシーが正しくヘッダー入力をサニタイズし、X-Forwarded-For
の値をクライアントの実際のソース IP と同等に正しく設定した場合にのみ機能します。この設定で重要な点は、Tower が PROXY_IP_WHITELIST
内の IP/ホスト名に依存して、X-Forwarded-For
フィールドに攻撃を受けない値を指定することができる点です。
HTTP_X_FORWARDED_FOR
は、以下の点が満たされていない限り、REMOTE_HOST_HEADERS
の項目として設定 しない ようにしてください。
- SSL Termination でプロキシー環境を使用している
- プロキシーにより
X-Forwarded-For
ヘッダーのサニタイズおよび検証が行われクライアントの攻撃を防止することができる/etc/tower/conf.d/remote_host_headers.py
が信頼されたプロキシー/ロードバランサーの送信元 IP のみを含むPROXY_IP_WHITELIST
を定義している
リバースプロキシーの背後に環境がある場合には、HTTP_X_FORWARDED_FOR
のヘッダーフィールドを設定するようにしてください。X-Forwarded-For
(XFF) HTTP ヘッダーフィールドで、HTTP プロキシーまたはロードバランサー経由で Web サーバーに接続するクライアントの送信元 IP アドレスを指定します。
REMOTE_HOST_HEADERS = ['HTTP_X_FORWARDED_FOR', 'REMOTE_ADDR', 'REMOTE_HOST']