Защита от медленных HTTP атак

Общая стратегия защиты

Для защиты от медленных запросов следует:
  1. Сбрасывать все некорректные запросы
  2. Ограничить заголовки и тело запроса минимальным разумным размером.
  3. Установить минимальное время таймаута.
  4. Выставить размер очереди запросов достаточно большим.
  5. Ограничить минимальую скорость запросов.

Настройка Apache

 

  1. Использование директив Limit и LimitExcept для сброса некорректных запросов не поможет, так как Apache будет ждать окончания запроса перед исполнением этих директив. Вместо этого нужно использовать директивы LimitRequestFields, LimitRequestFieldSize, LimitRequestBody, LimitRequestLine, LimitXMLRequestBody.
  2. По умолчанию TimeOut и KeepAliveTimeOut имеют 300 секунд, что неприемлимо.
  3. Директива ListenBackLog’s по умолчанию имеет значение 511, увеличение позволит серверу не принимать запросы слишком быстро.
  4. Максимальное число процессов не должно отнимать всю имеющуюся память, выставляйте MaxRequestWorkers корректно.
  5. Использование директивы AcceptFilter снижает уровень атаки на уровня ядра.

 

Существуют дополнительные модули Apache для минимизации медленных HTTP атак. Например,  mod_reqtimeout позволяет управлять числом медленных запросов через директиву RequestReadTimeout.
Если вы используете Apache без проксирования, то переключение в режим MPM Event будет очень хорошим решением. Но при этом PHP может работать только в CGI/FastCGI режиме, что не всегда приемлемо.

 

 

Настройка Nginx

 

  1. Некорректные запросы можно ограничить при помощи $request_method.
  2. Установить разумный минимум для client_max_body_size, client_body_buffer_size, client_header_buffer_size, large_client_header_buffers, и увеличивать по мере необходимости.
  3. По умолчанию client_body_timeout и client_header_timeout имеют слишком большие значения, что неприемлимо.
  4. Ограничить число запросов с одного адреса можно с помощью HttpLimitReqModule и HttpLimitZoneModule.
  5. Выставить worker_processes и worker_connections базируясь на числе CPU и общей нагрузке на сервер.