Как это работает
У любого веб-сервера ограничено число одновременных соединений или рабочих процессов. При атаке типа Slowloris клиент отправляет заголовки запроса очень медленно и никогда не заканчивает их. При Slow POST — объявляет большое тело запроса и передаёт его по несколько байт в минуту. Сервер честно ждёт, а соединение занято.
Признаки
- Число открытых соединений растёт до предела, а трафика почти нет.
- Сайт не открывается, хотя процессор и база данных не загружены.
- В журнале много запросов, завершившихся по таймауту, или запросов, которые не дошли до журнала вовсе.
Кто уязвим больше
Серверы с моделью «один процесс на соединение» — например, Apache с модулем prefork — уязвимы сильнее всего. Событийные серверы вроде nginx выдерживают больше соединений, но и у них есть предел, особенно если они передают запросы приложению с ограниченным числом рабочих процессов.
Защита
- Таймауты. Короткие таймауты на получение заголовков и тела запроса.
- Буферизация на фильтре. Фильтр принимает запрос целиком и только потом передаёт его серверу. Медленные клиенты тратят ресурсы фильтра, а не вашего приложения.
- Лимиты соединений на источник.
# nginx: короткие таймауты на заголовки и тело запроса
client_header_timeout 10s;
client_body_timeout 10s;
send_timeout 10s;
keepalive_timeout 30s;Вопросы и ответы
Помогает ли HTTP/2 от медленных атак?
HTTP/2 меняет картину, но не устраняет проблему: у протокола свои векторы истощения ресурсов. Буферизация запросов на фильтре защищает в обоих случаях.