Pull to refresh

Завалить 30 серверов за секунду с лаптопа?

Reading time 2 min
Views 6.1K
Выпустив новую версию slowhttptest с поддержкой медленного чтения (Slow Read DoS attack), я помог нескольким пользователям протестировать их сервисы. Во время одного из тестов произошла поучительная история, которую я хочу рассказать.

Получил я значит письмо с просьбой взглянуть на результаты запуска slowhttptest. Согласно репорту, програмка нагнула сервис за считанные секунды, что показалось довольно невероятным. Сервис, согласно архитектуре, способен обслуживать тысячи клиентов со всего мира, а slowhttptest лимитирован тысячей соединений.

Чтобы дать представление о сервисе, скажу что организация имеет порядка 60000 зарегистрированных пользователей с установленным клиентским приложением, которое изредка соединяется с центральным сервером, получает инструкции и посылает результаты (Не ботнет это!).
В каждый момент времени работают порядка 2000 клиентских приложений, и несколько сотен из них соединены с сервером одновременно.
Поначалу я скептически отнесся к тому, что это можно завалить с одного компьютера, но чем не шутит, спросил про архитектуру.
Система оказалась построенной по известному чертежу, компоненты системы мониторились, патчи устанавливались вовремя, ничего странного, что могло позволить завалить ее.

Архитектура системы такова:
— round-robin DNS, работающий как load-balancer, и отвечающий на запросы IP адресом то одного, то другого Squid а, работающего как reverse proxy
— два зафайрволнутых Squid сервера на выделенных для них мощных машинах
— кластер веб серверов
— кластер application серверов

image

Запустил я dig — утилиту, помогающую запрашивать DNS, получил список IP адресов, соответствующих доменному имени и прописал один из адресов в /etc/hosts, чтоб концентрироваться на одном Squide.

Агрессивно настроил slowhttptest, дав ему URL с фоткой одного из начальников, пуск! 1000 соединений запрашивают картинку по 10 раз в соединении, и меедленно читают ответы сервера.
И правда лежит! Перепроверил из браузера через прокси, чтобы убедиться что не IP мой забанен, тут и парень этот подтянулся, требуя вырубить атаку.

Короче оказалось, что это простая ошибка конфигурации, и лимит операционки (Enterprise RedHat, кстати) на количество открытых файл-дескрипторов одним процессом равен 1024, так что Squid просто утыкался в это ограничение.

Мораль истории, кроме того, что добро победило зло, в том, что уровень защищенности системы определяется уровнем защищенности самого слабого звена, и подлянки нужно ждать где угодно, не полагаясь на «правильность» архитектуры. А так же в том, что недостаточно патчи вовремя устанавливать, а надо бы и оценку защищенности проводить со стороны. В частности, если система выдерживает 10000 соединений в течении минуты, это не значит, что она выдержит 1000 соединений в течении 6 секунд, если жизнь соединений 6 секунд, например.
Что делать, если с тобой все-таки соединились 20000 клиентов одновременно — тема другого обсуждения.
Tags:
Hubs:
+96
Comments 39
Comments Comments 39

Articles