Есть 2 подхода к вышеуказанной проблеме:
- Использование модуля IIS Dynamic IP Restrictions
- Использование библиотеки 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