アウトライン
遅い攻撃、DDoS攻撃はバリアントバージョンです。一般的に、攻撃者だろう、それはサーバーにリクエストを送信することにより、通常のですが、接続が占有されている各時間が非常に長くなるように要求またはヘッド本体の要求の内容は、特に、長い伝送の特に低速でありますサービスのサーバー拒否となるようにサーバに要求を続けて、短い時間では、サーバーはすぐに、リソースが不足します。
HTTPサービスの場合、いくつかの基本的な攻撃があります。
スローヘッダ:Webアプリケーションが受信された彼らは、HTTPリクエストと何を処理する前に、HTTPヘッダのすべて、Webサーバを完了する必要があり、2つの連続した\ r \ nを受け、クライアントは頭の送信を完了し、かつ持続的ではないと思いますなどのクライアントは、データ、サーバー接続およびメモリリソースの消費を送信します。
スローボディ:攻撃者は、Webサーバーまたはプロキシクライアントは、大量のデータを送信するためにと考えているほど大きくHTTPのPOSTリクエスト、リクエストのContent-Lengthヘッダの値を送信します。接続を保持するサーバーがデータを受信する準備ができているが、攻撃が毎回、クライアントが少量のデータのみを送信し、その接続が生かされ、サーバ接続およびメモリリソースの消費量。
スローリード:クライアントとサーバーの接続を確立すると、HTTPリクエストを送信し、クライアントがサーバーに完全な要求を送信し、その後、接続が非常に低速読み取りレスポンスに維持されている、このような長い時間のクライアントは読み込みません接続がタイムアウトに高速サーバ接続とメモリリソースを消費するためにバイトを読み込むまで、クライアントがビジー間違えたように、サーバーへのゼロウィンドウを送信することにより、任意のデータを取ります。
nginxの最適配分
-
keepalive_timeout
nginxのは、キープアライブタイムアウト(タイムアウト)を指定するために使用しkeepalive_timeout。各TCP接続は、最大保持する期間を指定することができます。nginxのデフォルト値は、ほとんどの一部のブラウザでは75秒、60秒であり、それは60秒に設定することができます。それが0に設定されている場合は、キープアライブ接続を無効にします。
-
client_body_timeout
リクエストボディの接続を送信した後にタイムアウトを確立するために、クライアントとサーバーを指定します。クライアントが指定した時間内の任意のコンテンツを送信しない場合、nginxのは、HTTP 408(リクエストタイムアウト)を返します。
# 配置段: http, server, location
client_body_timeout 20s;
-
client_header_timeout
クライアントは、サーバーへの完全タイムアウト要求ヘッダを送信します。クライアントが指定した時間内に完全なリクエストヘッダを送信しない場合、nginxのは、HTTP 408(リクエストがタイムアウト)を返します。
# 配置段: http, server, location
client_header_timeout 10s;
-
send_timeout
クライアントにデータを送信するサーバーのタイムアウト。
# 配置段: http, server, location
send_timeout 30s;
-
client_body_buffer_size
この命令は、バッファサイズを要求された体のために提供されます。被写体がバッファサイズを超えている場合は、体の全部または一部は、一時ファイルを書き込むことができます。nginxのは、メモリバッファの代わりにファイルを使用するように設定されている場合は、命令は無視されます。デフォルトでは、命令セットは、16Kバッファは64ビットのシステムが提供され、32ビットのバッファ8Kです。この命令は、nginxのHTTP、サーバーの構成と場所のブロックを使用しています。
-
client_max_body_size
この命令は、最大設定のnginxのリクエストボディのサイズを扱うことができます。要求が指定したサイズよりも大きい場合は、バックnginxのHTTP 413(リクエストエンティティが大きすぎる)エラー。サーバーは、大容量ファイルのアップロードを処理する場合は、命令は非常に重要です。
デフォルトでは、指令値は1メートルです。次のように:
server{
client_max_body_size 2m;
}
その他の構成オプション:
-
client_body_in_file_only
このコマンドは、一時バッファとnginxのファイルストレージリクエストボディを無効にします。データが含まれているプレーンテキストファイル。この命令は、nginxのHTTP、サーバーの構成と場所のブロックを使用しています。可能な値は以下のとおりです。
オフ:この値は、ファイルの書き込みを無効にします
クリーン:要求は、ファイル本体に書き込まれます。ファイルには、要求を処理した後に削除されます。
上:要求したテキストファイルが書き込まれます。リクエストを処理した後のファイルは削除されません。
デフォルトでは、コマンドがオフになっています。次のように:
http{
client_body_in_file_only clean;
}
-
client_body_in_single_buffer
nginxのは、単一のバッファに格納されたリクエストの全身の命令セット。デフォルトでは、コマンドがオフになっています。有効にした場合の$のrequest_body変数I / O操作を読み込むとき、それは、最適化を伴います。例としては、次のとおりです:
server{
client_body_in_single_buffer on;
}
-
client_body_temp_path
この命令は、テキストを要求された一時ファイルの保存場所を指定します。場所に加えて、命令は、ファイル、フォルダ階層の三つのレベルに取ることができるかどうかを指定することができます。フォルダを生成したビット数に指定したレベル。
デフォルトでは、nginxのは、nginxのインストールパスの下のフォルダclient_body_tempファイルに一時ファイルを作成します。例としては、次のとおりです:
server{
client_body_temp_pathtemp_files 1 2;
}
-
client_header_buffer_size
この命令は、client_body_buffer_sizeに似ています。これは、要求ヘッダーのためのバッファを割り当てます。リクエストヘッダのサイズが指定されたバッファよりも大きい場合、大きなlarge_client_header_buffers命令バッファを割り当てるために使用されます。例としては、次のとおりです:
http{
client_header_buffer_size 1m;
}
-
large_client_header_buffers
この命令はヘッドバッファを読み取るための大規模なクライアント要求の最大数とサイズを指定します。バッファはデフォルトよりも小さい場合にのみオンデマンドでこれらのバッファ。接続切替処理要求またはアクティブのままにするとき、バッファを解放します。例としては、次のとおりです:
http{
large_client_header_buffers 4 8k;
}