Védekezés DoS támadás ellen ASP.NET alkalmazásokban

Egy elterjedt vélekedés szerint a (Distributed) Denial of Service támadások ellen nem lehet hatékonyan védekezni. Pont.

Ebben sok igazság van, különösen akkor, ha a támadás lényege a sok kis kérés küldése. De úgy is neki lehet esni egy szervernek, hogy óriási méretű HTTP kéréseket küldünk neki, ami memória problémákat okozhat. Ez egyébként előfordulhat akkor is, ha nem rosszindulatú, hanem figyelmetlen felhasználóink vannak (azok elég gyakran vannak), akiknek hiába írjuk ki, hogy maximum milyen méretű avatart töltsenek fel, gátlástalanul jön a gigaméretű panorámakép.

A HTTP kérés méretének korlátozásával csökkenthetjük ezt a veszélyt. Azonban nem elég a saját ASP.NET kódunkban vizsgálni a kérés méretét, hiszen addigra az már beérkezett a szerverre, de szerencsére a feldolgozási csővezeték korábbi részeiben mind az ASP.NET, mind pedig az IIS biztosít erre lehetőséget.

Az ASP.NET számára a web.config fájlban a maxRequestLength tulajdonság beállításával szabályozhatjuk a kérés maximális méretét. Itt az értéket kilóbájtban kell megadni és az alapértelmezett érték 4096.

<httpRuntime targetFramework="4.5" maxRequestLength="4096"/>

Azaz a 4MB-nál nagyobb kéréseket az ASP.NET eldobja, méghozzá egy HttpException formájában:

HttpException (0x80004005): Maximum request length exceeded.

Sajnos ez a kivétel nagyon általános, semmi olyan nincs benne, ami specifikusan erre a jelenségre utal (a lokalizált hibaüzenettől eltekintve), így csak az alábbi kóddal tudjuk kezelni:

void Application_Error( object sender, EventArgs e )
{
  HttpRuntimeSection section = ConfigurationManager.GetSection( 
"system.web/httpRuntime" ) as
HttpRuntimeSection; int maxRequestLength = section.MaxRequestLength; if( this.Request.ContentLength > maxRequestLength * 1024 ) { this.Server.ClearError(); // Naplózás, átirányítás stb. } }

Az IIS-ben található Request Filtering modul (sok egyéb funkció mellett) szintén ad lehetőséget a maximális kérés méret beállítására a maxAllowedContentLength tulajdonságban. Itt az alapérték 30000000, ami 28.6MB-nak felel meg, itt ugyanis bájtban kell megadni a limitet:

<system.webServer>
  <security>
    <requestFiltering>
      <requestLimits maxAllowedContentLength="30000000" />
    </requestFiltering>
  </security>
</system.webServer>

Ha a kérés ennél nagyobb, akkor a szerver 404.13 hibát dob:

iis-error-404-13

Ha a standard hibaoldal helyett egy barátságosabbat szeretnénk megjeleníteni, vagy épp naplózni szeretnénk a hibát, akkor ezt szintén a global.asax fájlban tehetjük meg, de az Application_EndRequest eseménykezelőben:

protected void Application_EndRequest( object sender, EventArgs e )
{
  if( this.Response.StatusCode == 404 && this.Response.SubStatusCode == 13 )
  {
    // Naplózás, átirányítás stb.
  }
}

 

Technorati-címkék: ,,,,,

2 thoughts on “Védekezés DoS támadás ellen ASP.NET alkalmazásokban

  1. Haraszti Gábor

    Nos azt kell eldönteni, hogy mi ellen akarunk védekezni a DDoS támadások kapcsán. Általános ökölszabály, hogy legyen minél több minél alulterheltebb szervered, mert annál nehezebb kiakasztani. Figyelni lehet a nem befejezett kérések gyakoriságát, a kérések hosszát és az egy pontból jövő kérések számát is.

Vélemény, hozzászólás?

Adatok megadása vagy bejelentkezés valamelyik ikonnal:

WordPress.com Logo

Hozzászólhat a WordPress.com felhasználói fiók használatával. Kilépés / Módosítás )

Twitter kép

Hozzászólhat a Twitter felhasználói fiók használatával. Kilépés / Módosítás )

Facebook kép

Hozzászólhat a Facebook felhasználói fiók használatával. Kilépés / Módosítás )

Google+ kép

Hozzászólhat a Google+ felhasználói fiók használatával. Kilépés / Módosítás )

Kapcsolódás: %s