Модуль ASP.Net для блокировки DOS-атак

Я хотел бы программно защитить свой веб-сайт ASP.Net 4.0 от повторяющихся вредоносных запросов. Если я замечу высокий номер запроса с IP-адреса, я хотел бы заблокировать этот IP-адрес на определенное время (например, на случай, если кто-то напишет цикл FOR и снова и снова запрашивает веб-страницу). Я знаю, что лучшая защита — это не передавать данные неавторизованным пользователям, но, к сожалению, некоторые общедоступные страницы содержат большое количество данных, и я ничего не могу с этим поделать.

Сегодня я рассмотрел несколько решений, но ни одно из них меня не удовлетворило. Я предполагаю, что это очень распространенная проблема, и я бы не хотел реализовывать что-то подобное с нуля.

Я видел решение, реализованное в виде модуля, и я бы нравится делать то же самое, но лучше. Мне нужны следующие функции:

  • Блокировать IP после обнаружения нечеловеческого шаблона
  • Желательно реализовать как HttpModule
  • Разрешить поисковым роботам
  • Блок должен истечь через определенный интервал
  • Легкий: модуль не должен замедлять работу сайта или обращаться к базе данных.

person Germstorm    schedule 06.02.2012    source источник
comment
Итак, вы знаете, что выиграли, почему бы не сделать это и не опубликовать здесь? Сканеры - это то, что легко исправить, но легко имитировать хакером, для истечения срока действия нужен таймер, нечеловеческий шаблон связан с обратными сообщениями, а HttpModule - это просто простой код...   -  person Aristos    schedule 06.02.2012
comment
Также для меня DOS-атака должна быть отдельным кодом от проверки нечеловеческих шаблонов. Одна — это атака, чтобы вывести вас из строя, другая — атака, чтобы совершить множество действий, чтобы заполнить ваши страницы спам-данными или получить контроль. Вам нужен другой допуск для страницы входа, чем для страницы контактов, чем для ввода комментариев.   -  person Aristos    schedule 06.02.2012


Ответы (1)


Есть 2 подхода к вышеуказанной проблеме:

  1. Использование модуля IIS Dynamic IP Restrictions
  2. Использование библиотеки HackerSpray на Github

Для 1-го подхода,

Расширение динамических IP-ограничений для IIS предоставляет ИТ-специалистам и хостерам настраиваемый модуль, который помогает смягчить или заблокировать атаки типа «отказ в обслуживании» или взлом паролей с помощью грубой силы путем временной блокировки адресов интернет-протокола (IP) клиентов HTTP, которые следуют шаблону, который может способствовать одной из таких атак. Этот модуль можно настроить таким образом, чтобы анализ и блокировка выполнялись на уровне веб-сервера или веб-сайта.


источник: https://www.iis.net/downloads/microsoft/dynamic-ip-restrictions:

Для 2-го подхода,

HackerSpray использует Redis для поддержки высокопроизводительных счетчиков действий и исходных IP-адресов. Вы вызываете Hacker.Defend(key, ip), чтобы проверить, не сделал ли определенный ключ или IP слишком много обращений. Вы можете вести черные списки для ключа, IP-адреса или диапазона IP-адресов. HackerSpray проверяет слишком много обращений к ключу, слишком много обращений к IP-адресу или IP-адрес, попадающий в черные списки. Это также позволяет занести в черный список определенный ключ для определенного IP-адреса или заблокировать определенный ключ для всех IP-адресов на лету. Удобно, когда вы хотите заблокировать пользователя от определенных URL-адресов.

Он поставляется с HttpModule, который защищает весь ваш сайт.

Примеры звонков:

var result = await Hacker.DefendAsync("/Account/LogOn", Request.UserHostAddress);

if (result == Hacker.Result.TooManyHitsFromOrigin) 
    await Hacker.BlacklistOriginAsync(Request.UserHostAddress, TimeSpan.FromMinutes(10)); 

else if (result == Hacker.Result.TooManyHitsOnKey) 
    await Hacker.BlacklistKeyAsync("/Account/LogOn", TimeSpan.FromMinutes(10));


 Hacker.DefendAsync("/Account/PasswordReset", Request.UserHostAddress, TimeSpan.FromMinutes(5), 100);
 Hacker.DefendAsync("Username" + username, Request.UserHostAddress);
 Hacker.DefendAsync("Comment", Request.UserHostAddress);

Пример логинконтроллера:

[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)
{
    if (!ModelState.IsValid)
    {
        return View(model);
    }
   return await Hacker.DefendAsync<ActionResult>(async (success, fail) =>
   {
       // This doesn't count login failures towards account lockout
       // To enable password failures to trigger account lockout, change to       shouldLockout: true
        var result = await SignInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, shouldLockout: false);
    switch (result)
    {
        case SignInStatus.Success:
            return await success(RedirectToLocal(returnUrl));
        case SignInStatus.LockedOut:
            return await fail(View("Lockout"));
        case SignInStatus.RequiresVerification:
            return await success(RedirectToAction("SendCode", new { ReturnUrl = returnUrl, RememberMe = model.RememberMe }));
        case SignInStatus.Failure:
        default:
            ModelState.AddModelError("", "Invalid login attempt.");
            return await fail(View(model));
    }
},
blocked => new HttpStatusCodeResult(HttpStatusCode.Forbidden),
    "ValidLogin:" + model.Email, 3, TimeSpan.FromMinutes(5),
    "InvalidLogin:" + model.Email, 4, TimeSpan.FromMinutes(5),
    Request.GetClientIp()
); }

В web.config нужно указать, какие пути защищать с помощью HttpModule.

<HackerSprayConfig redis="localhost" prefix="AuthTest:">
<keys>
  <add name="/Account/LogOn/" post="true" maxAttempts="100" interval="00:10:00" mode="perkeyperorigin" />
  <add name="/Home/" post="false" maxAttempts="10000" interval="00:01:00" mode="perorigin" />
  <add name="/" post="false" maxAttempts="10000" interval="00:01:00" mode="perorigin" />
</keys> </HackerSprayConfig>
  • redis — это строка подключения к серверу Redis.
  • префикс — все ключи, созданные в Redis, имеют этот префикс.
  • ключи - одна запись на путь, который вы хотите защитить
  • name - Путь к совпадению
  • сообщение - правда = POST, ложь = ПОЛУЧИТЬ
  • maxAttempts - максимально допустимое количество попаданий
  • интервал - хиты, как долго?
  • mode - How to count the hits and apply blocking
    • perkey - count hits from all IPs to this key. For ex, allow maximum 1000000 hits to Home page in 10 minutes period.
    • perorigin — при проверке попаданий по этому ключу, если IP-адрес источника произвел больше, чем общее количество попаданий maxAttempts для любого ключа, затем блокируется. Например, разрешите 1000 обращений на IP-адрес для любого ключа, но сделайте эту проверку на странице входа в систему.
    • perkeyorigin — количество обращений к этому ключу для каждого IP-адреса. Например, 1000 обращений на IP на странице входа.

Кредиты/Источник: https://github.com/oazabir/HackerSpray

person Kumar Lachhani    schedule 19.06.2017