Какой-то скрипач из Дели, Индия, с прошлой ночи пытался взломать наш сайт. Он написал скрипт браузера, который делает запросы к нашему серверу в виде массивных вложенных циклов, пробуя все под солнцем.
Он никуда не денется и не преодолеет даже наших основных средств защиты (но он заполняет наши файлы журналов).
Мы отправляем обратно 403 Unauthorized
на его запросы почти сразу после их поступления, но чем быстрее мы блокируем его запросы, тем быстрее выполняется его сценарий.
Мы хотели бы ввести некоторую «задержку» перед отправкой ответа 403. Чем дольше, тем лучше.
Вопрос: Как мы можем отложить попытки взлома, не затрагивая остальную часть сайта?
403 Unauthorized
ошибка или, в конечном итоге, истекает время ожидания, поэтому мы, вероятно, можем даже выполнить неопределенное / бесконечное ожидание.Где-то перед вашим веб-сервером должен быть отдельный брандмауэр. Вы хотите, чтобы запросы оттуда никогда не доходили до вашего сервера, так что, что касается его IP-адреса, ваш сервер больше не существует.
Существуют большие и маленькие системы обнаружения вторжений, которые сделают это автоматически за вас в зависимости от различных фильтров, приманок и других механизмов.
Например см. fail2ban который можно настроить для выполнения действий на основе анализа журналов.
Таким образом вы можете
Существуют и другие, более крупные инструменты, см. Также раздел в Википедии.
Поскольку ваш вопрос отмечен как asp.net, я предполагаю, что ваша серверная платформа - это Windows. Тем не менее, если вы можете использовать брандмауэр Linux, вы можете попробовать описанный выше
Такой брандмауэр можно запустить на крайне скромном оборудовании - подумайте даже о маршрутизаторах Linksys (см. Вот) для очень приличной пропускной способности канала.
Если они поступают с определенного IP-адреса или блока адресов, вы можете добавить к нему маршрут черной дыры:
ip ro add blackhole 10.69.96.0/24
ip ro flush cache
Вы также можете добиться этого, используя правило iptables, но помните, что правила iptables проходят линейно, поэтому, если вы начнете добавлять правила iptables для каждого попавшегося злоумышленника, вы можете начать съедать много ресурсов процессора. Таблицы маршрутизации оптимизированы для обработки большого количества записей. Например, в одной из моих ящиков 350K записей в таблице маршрутизации без проблем. Но если бы у меня было 3К правил iptables, коробка почти наверняка упала бы.
Если вы попытаетесь сделать что-то, при котором ваше приложение не будет использовать эти соединения в течение многих секунд, вы можете в конечном итоге привязать достаточно ресурсов, и законные запросы не смогут получить никаких ресурсов.
Вы делаете не хотите замедлить его, потому что его неправильное замедление приведет к остановке вашего сайта, как если бы он подвергся DoS-атаке, потому что ваши потоки будут «заняты» обслуживанием запросов этого человека. Что вы хотите сделать, так это заблокировать его IP-адрес и покончить с этим. Нет причин приманить человека, который это делает.
Вам нужен модуль Apache mod_evaisve.
В дистрибутивах на основе Debian установите его, используя
apt-get install libapache2-mod-evasive
CentOS / RHEL
yum install mod_evasive
mod_evasive отслеживает запросы, поступающие в Apache, и блокирует IP-адреса, используя iptables, которые передают пороговое значение. Это идеальный инструмент против DoS-атак на основе HTTP и даже распределенных DoS-атак, когда вы нацелены на огромный ботнет с тысячами различных IP-адресов.
Он работает как модуль Apache, загружаемый во время выполнения, а не как отдельный демон.
Тем не менее, умный злоумышленник, контролирующий огромный ботнет, все равно может вывести из строя ваш веб-сервер, синхронизируя запросы, отправленные каждым зомби в ботнете, чтобы ни один из IP-адресов никогда не превышал пороговое значение.
В этом случае вы должны использовать IDS на основе аномалий и, вероятно, самостоятельно обучить систему. Но это вряд ли произойдет, если у вас нет серьезных врагов или кого-то с корпоративной повесткой дня.
Если вы используете Linux, используйте iptables, чтобы ограничить парня до 1 байта / с с большими задержками и заставить его брать навсегда даже получить один запрос. Если он будет распространен, это не поможет.
Я не уверен, как бы вы это сделали в Windows, но вы можете найти похожие варианты в вашем маршрутизаторе или аппаратном брандмауэре, если он у вас есть.
EDIT: согласен с вышеизложенным, это больше похоже на вопрос о неисправности сервера.
Если IP-адрес парня довольно постоянен, вы можете создать собственный HttpModule, подключить его через изменение в файле web.config и иметь задержку, когда он распознается как этот IP-адрес. Или вы можете отправить ему несколько кодов 404 или перенаправить в другое место.
Вы знаете, что они в Индии. Есть ли у вашего сайта значительные индийские клиенты, которые не позволили бы просто блокировать весь свой диапазон IP-адресов на уровне брандмауэра постепенно, пока поток не остановится? Это, конечно, не твердое решение, но если вы просто имеете дело с типичным «скрипачом», этого должно быть достаточно, чтобы отговорить их и отправить к другой цели.
Еще лучше, если это с одного IP-адреса, вы можете ответить собственной атакой отказа в обслуживании :)
В дополнение к полученному ответу вы захотите сохранить свою документацию (журналы, трассировки) и предоставить их поставщику услуг. Это наиболее эффективно во время инцидента, поскольку ваш провайдер может стать свидетелем вторжения. Даже если вы добились успеха в своих действиях, важно ограничить дальнейшие попытки, и это поможет вашему провайдеру передать запрос поставщику услуг злоумышленника; возможно, наиболее эффективным действием для провайдера злоумышленника является отказ в обслуживании своего клиента, идентифицированного злоумышленника.
если вы программист, вы могли бы работать с событием .net Begin_Request и поместить туда свой "сон"