Общая стратегия защиты
Для защиты от медленных запросов следует:
-
Сбрасывать все некорректные запросы
-
Ограничить заголовки и тело запроса минимальным разумным размером.
-
Установить минимальное время таймаута.
-
Выставить размер очереди запросов достаточно большим.
-
Ограничить минимальую скорость запросов.
Настройка Apache
-
Использование директив Limit и LimitExcept для сброса некорректных запросов не поможет, так как Apache будет ждать окончания запроса перед исполнением этих директив. Вместо этого нужно использовать директивы LimitRequestFields, LimitRequestFieldSize, LimitRequestBody, LimitRequestLine, LimitXMLRequestBody.
-
По умолчанию TimeOut и KeepAliveTimeOut имеют 300 секунд, что неприемлимо.
-
Директива ListenBackLog’s по умолчанию имеет значение 511, увеличение позволит серверу не принимать запросы слишком быстро.
-
Максимальное число процессов не должно отнимать всю имеющуюся память, выставляйте MaxRequestWorkers корректно.
-
Использование директивы AcceptFilter снижает уровень атаки на уровня ядра.
Существуют дополнительные модули Apache для минимизации медленных HTTP атак. Например, mod_reqtimeout позволяет управлять числом медленных запросов через директиву RequestReadTimeout.
Если вы используете Apache без проксирования, то переключение в режим MPM Event будет очень хорошим решением. Но при этом PHP может работать только в CGI/FastCGI режиме, что не всегда приемлемо.
Настройка Nginx
-
Некорректные запросы можно ограничить при помощи $request_method.
-
Установить разумный минимум для client_max_body_size, client_body_buffer_size, client_header_buffer_size, large_client_header_buffers, и увеличивать по мере необходимости.
-
По умолчанию client_body_timeout и client_header_timeout имеют слишком большие значения, что неприемлимо.
-
Ограничить число запросов с одного адреса можно с помощью HttpLimitReqModule и HttpLimitZoneModule.
-
Выставить worker_processes и worker_connections базируясь на числе CPU и общей нагрузке на сервер.
Комментировать