2016-09-02 5 views
0

最近ロードバランシングのためにCitrixからHAProxyに切り替えました。HTTPヘッダーの余分なスペースはHAProxyで400エラーを返します

問題は、一部の要求のためにHAProxyは(Citrix社でうまく動作するために使用)400エラーを与え始めていることです。そこで、当面はHTTPベースのロードバランシングからTCPベースのロードバランシングに移行しました。さらに、我々はいくつかの要求は400エラーの原因となったHTTPヘッダー内の余分なスペースを持っていたことが分かった調査で

。私たちは、ソースコードを変更することはできませんので

profileID<space>:value 
vs 
profileID:value 

そして、これらの要求は、Androidアプリから来ました。

httpベースの負荷分散に戻ろうとしています。

スペースを無視できる設定がありますか。

+2

ブロックされたヘッダーは「コロンスペース」で、「スペースコロン」ではありませんか? – regilero

+2

コロンの後のスペースはHTTPでは無効ではなく、HAProxyによってブロックされません。ここには何か他のことがあります。あなたのログを見てください。カスタムログ形式を使用している場合は、終了状態の値 - %tsc'を探します。要求が成功すると、これは '----'として記録されます。失敗したリクエストの場合、最初の2文字(少なくとも)は異なるでしょう。これは非常に有用な情報です。あなたは何を見ますか?パケットトレースを取得しましたか? 'req [i] rep'ルールはありますか?あなたがそうするなら、それらを示してください - あなたは悪い正規表現でリクエストを破ることができます。 –

+0

@regilero:あなたは正しいです。質問を更新しました。 – pratikvasa

答えて

3

HAProxyはoption accept-invalid-http-requestと呼ばれるプロキシ設定ディレクティブをサポートしています。

HAProxy が正確にに着信要求に必要な厳密なプロトコル準拠の一部を緩和するので、その意味を理解していないと盲目的または不注意に使用しないでください。ドキュメントから

デフォルトでは、HAProxyは、メッセージの解析に関して、RFC7230に準拠しています。つまり、ヘッダー名の無効な文字は許可されず、エラーがクライアントに返されます。このような禁止文字は、サーバーの弱点を悪用した攻撃を構築し、セキュリティフィルタリングをバイパスするために使用されるため、望ましい動作です。

時々、バグのあるブラウザやサーバが何らかの理由(コンフィギュレーション、インプリメンテーション)に無効なヘッダ名を放出すると、問題はすぐに修正されません。そのような場合、このオプションを指定することによって、HAProxyのヘッダー名パーサを緩和して、それが意味をなさない場合でも任意の文字を受け入れることができます。

同様に、URIに表示できる文字のリストは、RFC3986でよく定義されており、0-31,32(スペース)、34( '' ')、60(' < ')、62 ( '|')、125( '}')、127(削除)、 '(') '、' ' Haproxyは常にそれらの数をブロックします(0..32,127)。残りのブロックは、このオプションが有効になっていない限り、デフォルトでブロックされます。このオプションは、HTTPバージョンでのテストも緩和します。

このオプションは、アプリケーションのバグやセキュリティ違反を隠すので、デフォルトで有効にするべきではありません。これは、HTTP/0.9リクエストが通過する(バージョンは指定されません)。のみ問題が確認された後に展開されます。

http://cbonte.github.io/haproxy-dconv/1.6/configuration.html#4-option%20accept-invalid-http-request (強調追加)

あなたconfigurarionファイルのそれぞれのfrontendのセクションには、このオプションを追加するこれらの無効なヘッダーが受け入れられるようにする必要があります。

ドキュメントに記載されている潜在的なセキュリティリスクは、HAProxyに内在するリスクではなく、通常、HAProxyがそのような無効な要求からこれらのコンポーネントを保護するため、プロキシの背後にあるスタック内の脆弱性を悪用するリスクがあります。

関連する問題