nginx アップストリーム キープアライブを有効にすることのリスク

nginx アップストリーム キープアライブを有効にすることのリスク

PHP バックエンドを備えた Apache の HTTP リバース プロキシとして nginx を使用します (Web マスターには .htaccess の柔軟性が必要です)。Apache ログで http/1.0 が使用されているのを見て、キープアライブ接続を有効にする方法を調べてみました。

検索してみると、Nginxのこのブログ投稿が見つかりましたhttps://www.nginx.com/blog/avoiding-top-10-nginx-configuration-mistakes/#no-keepalives

デフォルトでは、NGINX は新しい受信リクエストごとにアップストリーム (バックエンド) サーバーへの新しい接続を開きます。これは安全ですが非効率的です。[...]

デフォルトの動作が安全である場合、アップストリーム キープアライブを有効にするとどのようなリスクがありますか?

答え1

キープアライブを使用して接続をプロキシすることは、HTTP 非同期攻撃 / リクエストの密輸のリスクがあると考えられています。これは、バックエンドがフロントエンドとまったく同じ方法で異なるクライアント リクエストを分割しない場合に発生します。各リクエストの後に接続を閉じることは、現在のリクエストが終了したことを明確に示すため、「安全な」オプションです。

見るhttps://book.hacktricks.xyz/pentesting-web/http-request-smuggling詳細については。

答え2

すでに述べたように、KeepAlive は接続をキャッシュするための最適化です。高スループットのトラフィックをサポートするためのものです。これを有効にしてもリスクはないと思います。実際、いずれにしてもより良い結果が得られます。

答え3

デフォルトの動作では、リクエストごとにアップストリームとの接続を作成することは、高負荷の場合安全ではありません。次の理由によります。

  1. 同じクライアント自体から nginx サーバーにリクエストが届くと、アップストリーム サーバーとの新しい接続が作成され、新しい利用可能なローカル ポートが使用されます。
  2. リクエストが完了すると、そのローカルポートの接続は確立状態から TIME_WAIT 状態に 120 秒間移行します。つまり、120 秒間、そのローカルポートは新しいリクエストに再利用できません。
  3. 同じクライアントから 2 番目のリクエストが来ると、手順 1 が繰り返されます。
  4. このように重い荷物の場合は、
    1. nginx で利用可能なすべてのローカルポート (65k) を使用することになる場合があります。
    2. リクエストごとに接続の作成と終了を行うのは非常にコストのかかる操作です

それを回避するには、接続をキャッシュして、リクエストが来たときに上流サーバーと同じ接続を再利用できるようにするのが最善です(前回のリクエストと同じローカルポートで)。

よろしくVj

関連情報