DOS攻撃をブロックするASP.Netモジュール

私はプログラム的にASP.Net 4.0 Webサイトを有害な繰り返し要求から保護したいと思います。私がIPからの要求数が多いことに気がついたら、そのIPを特定の時間(例えば、誰かがFORサイクルを書き、Webページを何度も要求する場合)にそのIPをブロックしたいと思います。私は最高の防御は認証されていないユーザーにデータをサーバーすることではありませんが、残念なことに一部の公開ページはデータが重く、私はそれについて何もできません。

私は今日いくつかの解決策を見ていたが、どれも私を満足させなかった。私はこれが非常に一般的な問題であると推測しており、このようなものをゼロから実装するのは嫌です。

私はモジュールとして実装されたソリューションを見ました。同じことをしたいが、より良いことをしたい。私は以下の機能が必要です:

  • 非人間パターンを検出した後にIPをブロックする
  • 好ましくはHttpModuleとして実装されている
  • クローラを許可する
  • 一定の間隔が経過するとブロックが終了する
  • 軽量化:モジュールがウェブサイトを遅くしたり、データベースにアクセスしたりしてはなりません
1
だからあなたが勝ったものを知っている、なぜそれを作ってここに掲示しないのですか?クローラは簡単に修正できるものですが、ハッカーが簡単にシミュレートすることができます。期限切れにはタイマーが必要です。人間以外のパターンはポストバックと関係があり、HttpModuleは単なるコードです...
追加された 著者 Aristos,
私にとっては、DOS攻撃は人間以外のパターンチェックとは別のコードでなければなりません。 1つはあなたをクラッシュさせるための攻撃であり、もう1つはあなたのページを完全にあなたのスパムデータにするための多くの行動をとる攻撃です。コメントを入力するよりも、ログインページの連絡先ページとは異なる許容差が必要です。
追加された 著者 Aristos,

1 答え

上記の問題には2つのアプローチがあります。

  1. IIS動的IP制限モジュールの使用
  2. GithubでHackerSprayライブラリを使用する

第1のアプローチでは、

IIS用の動的IP制限拡張機能により、ITプロフェッショナルとホスティング者は、サービス拒否攻撃を緩和またはブロックしたり、ブルートフォースでパスワードをクラッキングするのに役立つ構成可能なモジュールを提供します。そのような攻撃の1つにつながる可能性のあるパターン。このモジュールは、WebサーバーまたはWebサイトレベルで分析およびブロックを実行できるように構成できます。


source: 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);

LoginControllerの例:

[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task Login(LoginViewModel model, string returnUrl)
{
    if (!ModelState.IsValid)
    {
        return View(model);
    }
   return await Hacker.DefendAsync(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を使用して保護するパスを指定する必要があります。



  
  
  
 
  • redis - This is the connection string to Redis server.
  • prefix - All keys created in redis is prefixed with this.
  • keys - one entry per path that you want to protect
  • name - The Path to match
  • post - true = POST, false = GET
  • maxAttempts - max number of hits to allow
  • interval - hits for how long?
  • 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 - While checking hits to this key, if the origin IP has produced more than the maxAttempts hit overall on any key, then block. For ex, allow 1000 hits per IP, to any key, but do this check on Login page hit.
    • perkeyorigin - Count hits to this key, per IP. For example, 1000 hits per IP on the Login page.

Credits/Source: https://github.com/oazabir/HackerSpray

1
追加された