PDA

View Full Version : سوال: چگونه در ASP.net سایت رو در برابر حملات دی داس محافظت کنم؟



mehrdad201
چهارشنبه 18 اردیبهشت 1387, 13:28 عصر
با عرض سلام خدمت همه دوستان و اساتید.

مشکلی برام پیش اومده. خواهش دارم هر کسی میتونه کمک کنه.
تو یکی از برنامه هایی که باید انجامش بدم در قید شده باید حتما سایت در زمینه حملات دی داس مقاوم باشه و داون نشه. (به قول خودمون نخوابه)
من خیلی در این زمینه تحقیق کردم. اکثر این هاست های شیرینگ (sharing) قوانینشون به این صورته که اگه یه موقع سایت شما مورد حمله دی داس قرار بگیره ، کل سرور رو تحت تاثیر قرار میده در نتیجه مسئول هاستینگ سایت شما رو از مجموعه خارج میکنه و ممکنه دیگه سایت رو هاست نکنه.

یکی به من گفت برو سرور اختصاصی بگیر. اما سرور اختصاصی جدایی از هزینه ای که در ماه داره در مقابل حملات دی داس کاری از پیش نمیبره.
یکی گفت برو از این دی داس پروتکشن ها بگیر. طی تحقیقاتی که کردم هزینه ای بالغ بر 500 دلار در ماه داره و اصلا برای ما مقدور نیست.
یکی گفت برو وی پی اس بگیر و روش فایروال و ... نصب کن.
خلاصه هر کسی یه نکته ای رو بیان میکرد.

از همه دوستانی که اطلاعاتی دارند خواهشمندم کمک کنند. چطوری میتونم سایت رو در مقابل حملات دی داس ایمن کنم. آیا حتما باید سرور اختصاصی یا وی پی اس داشته باشم؟ایا میتونم از هاستینگ اشتراکی استفاده کنم و به کمک کدهای asp.net سایت رو مقاوم کنم. خواهش میکنم هر کسی میتونه به من کمک کنه.

سپاسگذار از همه دوستان

Behrouz_Rad
چهارشنبه 18 اردیبهشت 1387, 13:43 عصر
خونسرد باش مهرداد جان. راه حلش ساده ست :)

برخی هاست ها فایروال هایی دارن که در ظاهر وظیفشون جلوگیری از حملات DOS هست اما در نهایت بیشترین کاری که می تونن انجام بدن جلوگیری از حملات TCP SYN هست. فایروالی که بتونه سایت رو به طور کامل در برابر حملات DOS محافظت کنه ندیدم.
در سطح برنامه نویسی، مطمئن ترین کاری که می تونی انجام بدی بررسی IP کاربر هست.
بدین شکل که ساختاری با 3 فیلد ایجاد کنی که شامل IP کاربر، تعداد درخواست های ارسال شده و نام صفحه هست. در هر درخواست، IP کاربر و صفحه ی درخواست شده رو بازیابی کنی و یک واحد به تعداد درخواستش اضافه کنی و این 3 فیلد رو در Cache ذخیره/آپدیت کنی. مقدار AbsoluteExpiration رو برای Cache به میزان دلخواه تنظیم کن. مثلا 10 ثانیه. اینجوری می تونی متوجه بشی که اگر در 10 ثانیه مثلا 50 درخواست با یک IP برای صفحه ای مشخص ارسال شد، با یک هزار دست! روبرو هستی و احتمالا باید به موزه منتقلش کنی ;)

موفق باشید.

mehrdad201
چهارشنبه 18 اردیبهشت 1387, 13:51 عصر
استاد راد منظور از ساختار همون دیتا تیبل هست؟؟؟؟

در ضمن ، این انتقال به موزه چطوری انجام میشه. راستش در این زمینه من اصلا در حد زیر صفرم.

Behrouz_Rad
چهارشنبه 18 اردیبهشت 1387, 13:55 عصر
منظور از ساختار همون دیتا تیبل هست؟؟؟؟

بله. می تونه مثلا یک DataTable باشه.


این انتقال به موزه چطوری انجام میشه.

با Response.End

mehrdad201
چهارشنبه 18 اردیبهشت 1387, 13:59 عصر
استاد

این کار باید در HTTPMODULE انجام بشه ؟؟؟

Behrouz_Rad
چهارشنبه 18 اردیبهشت 1387, 15:45 عصر
این کار باید در HTTPMODULE انجام بشه ؟؟؟

یا با HttpModule یا ایجاد یک کلاس پایه که از Page به ارث می بره و Override کردن روال OnInit و به ارث بردن بقیه ی صفحات از این کلاس پایه.

موفق باشید.

mehrdad201
چهارشنبه 18 اردیبهشت 1387, 16:06 عصر
استاد یه سوال دیگه داشتم.

این قضیه که هر بار در هر درخواست باید دیتا از کش خونده بشه. پردازشها انجام بشه ، دوباره ذخیره بشه و تصمیم گیری در مورد به موزه فرستادن یا نفرستادن گرفته بشه.

خود این فرایند سرور رو مشغول نمیکنه ؟ فرض کنید هزاران درخواست از سوی مهاجمین فرستاده بشه. به ازای هر درخواست باید این فرایند تکرار بشه.

نظر شما چیه ؟آیا استنباط من درسته ؟

Behrouz_Rad
چهارشنبه 18 اردیبهشت 1387, 16:40 عصر
تو در اولین مرحله ی پردازش درخواست، یعنی روال BeginRequest این بررسی رو انجام میدی و در صورتی که درخواست یک حمله تشخیص داده بشه، مراحل دیگه طی نمیشه. این یک مزیت هست اما کامل نیست! درگیری کمتره اما به هر حال وجود داره.
اینکه بشه یک پکت حاوی درخواست رو قبل از اینکه به منبع پردازش (در اینجا، IIS) ارسال بشه بررسی کرد بهترین راه حله. به همین دلیل هست که پیشنهاداتی در مورد سرور اختصاصی و راه حل های غیر برنامه نویسی دریافت کردی. اما با توجه به شرایطی که داری و محدودیت هایی که بیان کردی، روشی که توضیح دادم معقولانه ترین و کم هزینه ترین روشی هست که می تونی پیاده سازی کنی.

موفق باشید.

anubis_ir
چهارشنبه 18 اردیبهشت 1387, 17:04 عصر
يك نمونه پياده سازي مبحث:
http://msmvps.com/blogs/omar/archive/2007/03/24/prevent-denial-of-service-dos-attacks-in-your-web-application.aspx

mehrdad201
چهارشنبه 18 اردیبهشت 1387, 17:16 عصر
تو در اولین مرحله ی پردازش درخواست، یعنی روال BeginRequest این بررسی رو انجام میدی و در صورتی که درخواست یک حمله تشخیص داده بشه، مراحل دیگه طی نمیشه. این یک مزیت هست اما کامل نیست! درگیری کمتره اما به هر حال وجود داره.
اینکه بشه یک پکت حاوی درخواست رو قبل از اینکه به منبع پردازش (در اینجا، IIS) ارسال بشه بررسی کرد بهترین راه حله. به همین دلیل هست که پیشنهاداتی در مورد سرور اختصاصی و راه حل های غیر برنامه نویسی دریافت کردی. اما با توجه به شرایطی که داری و محدودیت هایی که بیان کردی، روشی که توضیح دادم معقولانه ترین و کم هزینه ترین روشی هست که می تونی پیاده سازی کنی.

موفق باشید.

ممنونم استاد
سوال دیگه ای داشتم.

تا اونجاییکه من متوجه شدم. دی داس پروتکشن ها لول های مختلف دادند.

به نظر شما این سیستم که مبتنی بر برنامه نویسی هست با چه سطحی برابری داره ؟

mehrdad201
چهارشنبه 18 اردیبهشت 1387, 17:20 عصر
يك نمونه پياده سازي مبحث:
http://msmvps.com/blogs/omar/archive/2007/03/24/prevent-denial-of-service-dos-attacks-in-your-web-application.aspx



دوست عزیز اول از همه ا شما تشکر میکنم.

در ثانی در این مثالی که هست.


1:
for(
int i = 0; i < 100000; i ++ )
2: {
3: WebClient client =
new WebClient();
4: client.DownloadString(
"http://www.pageflakes.com/default.aspx");
5: }این خطوط یک نوع حمله دی داسی هستند؟

shahab_ksh
چهارشنبه 18 اردیبهشت 1387, 18:47 عصر
از نظر سخت افزاری میشه چیکار کرد

mehrdad201
چهارشنبه 18 اردیبهشت 1387, 19:49 عصر
از نظر سخت افزاری ابزارهای سیسکو و .... هست اما هزینه بسیاری دارند.

در ضمن دوستان اون مثالی که دوستمون در زمینه asp بیان کردند امکانش هست زبون php هم بشه این کار رو کرد؟؟؟؟؟؟؟؟

mehrdad201
چهارشنبه 18 اردیبهشت 1387, 21:51 عصر
خونسرد باش مهرداد جان. راه حلش ساده ست :)

برخی هاست ها فایروال هایی دارن که در ظاهر وظیفشون جلوگیری از حملات DOS هست اما در نهایت بیشترین کاری که می تونن انجام بدن جلوگیری از حملات TCP SYN هست. فایروالی که بتونه سایت رو به طور کامل در برابر حملات DOS محافظت کنه ندیدم.
در سطح برنامه نویسی، مطمئن ترین کاری که می تونی انجام بدی بررسی IP کاربر هست.
بدین شکل که ساختاری با 3 فیلد ایجاد کنی که شامل IP کاربر، تعداد درخواست های ارسال شده و نام صفحه هست. در هر درخواست، IP کاربر و صفحه ی درخواست شده رو بازیابی کنی و یک واحد به تعداد درخواستش اضافه کنی و این 3 فیلد رو در Cache ذخیره/آپدیت کنی. مقدار AbsoluteExpiration رو برای Cache به میزان دلخواه تنظیم کن. مثلا 10 ثانیه. اینجوری می تونی متوجه بشی که اگر در 10 ثانیه مثلا 50 درخواست با یک IP برای صفحه ای مشخص ارسال شد، با یک هزار دست! روبرو هستی و احتمالا باید به موزه منتقلش کنی ;)

موفق باشید.

استاد راد. یه جایی به مشکل خوردم.

ببینید من یه کلاس به اسم پروتکشن اضافه کردم به پروژه که از iHTTPModule مشتق شده


public class Protection : System.Web.IHttpModuleدر بخش init این کد رو قرار دادم


public void Init(HttpApplication context)
{
context.AuthorizeRequest += new EventHandler(context_AuthorizeRequest);
//throw new NotImplementedException();
}در داخل رویداد مورد نظر هم این کدها رو نوشتم


void context_AuthorizeRequest(object sender, EventArgs e)
{
HttpApplication xHttpApplication = sender as HttpApplication;

if (xHttpApplication.Context.Request.Browser.Crawler)
xHttpApplication.Context.Response.End();
else
{
string key = xHttpApplication.Context.Request.UserHostAddress;
int hit = (int)(xHttpApplication.Context.Cache[key] ?? 0);
if (hit > ValidatorCount)
xHttpApplication.Response.End();
else
hit++;

//# Add Data To Cache #//
//xHttpApplication.Context.Cache.Add(key ,hit ,null ,DateTime.Now.AddSeconds(ValidatorSecond),

}
}یه مشکلی که دارم اینه که Context.Cache.Add پارامترهایی داره که دقیقا نمیدونم بعضیهاشون رو باید چطوری مقدار بدم. یه توضیحی در موردش برام میدید؟

http://i32.tinypic.com/2uz9jc1.jpg================

در ضمن یه همچین کدی تو اون مثالی که دوستمون ادرسش رو داده بودن بود.


Context.Request.Browser.Crawlerاین دقیقا چه کار میکنه؟

mehrdad201
چهارشنبه 18 اردیبهشت 1387, 22:17 عصر
یک تاپیک در این مورد پیدا کردم

http://barnamenevis.org/forum/showthread.php?t=30859&highlight=cache+insert

فقط یه مقدار در مورد slidingExpiration توضیح بدید برام. که در اینجا باید چه مقداری قرار بدم؟

Behrouz_Rad
چهارشنبه 18 اردیبهشت 1387, 22:24 عصر
سوالاتی که به مبحث این تاپیک مربوط نمیشن رو در یک تاپیک جداگانه مطرح بفرمایید.

موفق باشید.

Behrouz_Rad
چهارشنبه 18 اردیبهشت 1387, 23:07 عصر
نمی دونم چرا در اون کد از Crawler استفاده شده! اینجوری از ایندکس صفحات توسط موتورهای جستجو جلوگیری میشه.


در مورد slidingExpiration توضیح بدید برام. که در اینجا باید چه مقداری قرار بدم؟

به sliding نیاز نیست. باید از absolute استفاده کنی. در یک زمان فقط از یکی از این مقادیر میشه استفاده کنی.
مقدارش رو برابر با مثلا 10 ثانیه قرار بده.

موفق باشید.

mehrdad201
پنج شنبه 19 اردیبهشت 1387, 10:59 صبح
نمی دونم چرا در اون کد از Crawler استفاده شده! اینجوری از ایندکس صفحات توسط موتورهای جستجو جلوگیری میشه.

به sliding نیاز نیست. باید از absolute استفاده کنی. در یک زمان فقط از یکی از این مقادیر میشه استفاده کنی.
مقدارش رو برابر با مثلا 10 ثانیه قرار بده.

موفق باشید.

مقدار sliding رو باید timestamp.zero قرار بدیم؟

Behrouz_Rad
پنج شنبه 19 اردیبهشت 1387, 11:21 صبح
مقدار sliding رو باید timestamp.zero قرار بدیم؟

بله........

mehrdad201
پنج شنبه 19 اردیبهشت 1387, 15:18 عصر
به نظر شما تعداد دفعات درخواست و بازه زمانی رو چه مقداری بگیرم مناسب هست تا دسترسی یوزرهای نورمال محدود نشه؟

Behrouz_Rad
پنج شنبه 19 اردیبهشت 1387, 15:44 عصر
زمانش مثلا 30 ثانیه خوبه. خودت فکر کن یک "انسان" در 30 ثانیه حداکثر چند صفحه می تونه باز کنه. یک واحد بیشتر از اون رو میزان تخطی از میزان غیر مجاز در نظر بگیر.
بعضی چیزها رو دیگه خودتون باید بتونید تشخیص بدید!

موفق باشید.

mehrdad201
جمعه 20 اردیبهشت 1387, 17:01 عصر
استاد راد

بین رویداد begin_request و رویداد init کلاسی که از IHTTPModule مشتق شده کدوم یک زودتر اجرا میشن؟

به نظر شما این بررسی در کدومیک از اینها انجام بشه؟

Behrouz_Rad
جمعه 20 اردیبهشت 1387, 19:35 عصر
BeginRequest اولین رویدادی هست که اجرا میشه. همین خوبه.

mehrdad201
جمعه 20 اردیبهشت 1387, 21:30 عصر
استاد در مورد اون کروالر (Crawler) فرموده بودید جلو ایندکس شدن صفحات رو میگیره؟

به نظر شما در beginrequest ازش استفاده کنم یا اینکه نه؟ آخه باید صفحات در گوگل ایندکس بشن.

Behrouz_Rad
جمعه 20 اردیبهشت 1387, 22:40 عصر
اون خط مربوط به Crawler رو ننویس.

mehrdad201
جمعه 20 اردیبهشت 1387, 23:10 عصر
استاد راد با عرض شرمندگی بابت مزاحمت ها

یه مشکلی پیش اومده. در حالت دیباگ متوجه شدم که وقتی یه صفحه رو اجرا میکنم چندین باز فرایند beginrequest اجرا میشه.در نتیجه اون عدد مربوط به شمارنده بیشتر از حالت عادی افزایش پیدا میکنه.

میتونید به من بگید چرا وقتی یه صفحه رو اجرا میکنم بیش از یک بار این فرایند اجرا میشه و برای فیلتر کردن چکار باید کرد؟؟؟؟؟؟؟؟

mehrdad201
شنبه 21 اردیبهشت 1387, 10:48 صبح
استاد راد یک سوال دیگه هم داشتم.

وقتی در سایت از آجاکس استفاده میشه کلاینت از طریق کدهای جاوا اسکریپت با سمت سرور ارتباط برقرار میکنه.

به عنوان مثال ما یه گرید ویو داریم که توی یه آپدیت پنل هست. وقتی میخوایم page های دیگه گرید ویو رو ببینیم از طریق آجاکسی محتویات داخل گرید اپدیت میشه.

سوالم اینه که ایا یه مهاجم میتونه با استفاده از این کدهای جاوا اسکریپت ایجاد شده وب سایت رو مورد حملات دی داس قرار بده؟؟؟؟؟؟؟؟؟؟؟؟

در صورتیکه جوابتون مثبت هست میشه بفرمایید برای جلوگیری از این کار چه راهی وجود داره؟

Behrouz_Rad
شنبه 21 اردیبهشت 1387, 12:14 عصر
نمی دونم....

Behrouz_Rad
شنبه 21 اردیبهشت 1387, 16:24 عصر
سوالم اینه که ایا یه مهاجم میتونه با استفاده از این کدهای جاوا اسکریپت ایجاد شده وب سایت رو مورد حملات دی داس قرار بده؟

اون "نمی دونم" مال پست قبلیت بود. پست بعدی رو ندیدم بودم.

البته ارتباط جاوا اسکریپت با DDOS رو نمی دونم چیه که در موردش سوال پرسیدی اما DOS تنها از طریق فراخوانی منابعی که بر روی سرور اجرا میشن نیست! مثلا درخواست مداوم یک تصویر یا یک فایل CSS هم می تونه نوعی مشغول کردن سرور محسوب بشه!

موفق باشید.

mehrdad201
شنبه 21 اردیبهشت 1387, 20:32 عصر
جواب اون سوال نمیدونم رو پیدا کردم.
میدونید استاد وقتی داشتم کار میکردم با یک مساله ای مواجه شدم.

من تمام اون فرایند چکینگ رو داخل begin request قرار دادم.

متوجه شدم به ازای هر ابچکت سروری (مثلا یک ابچکت تصویر یا لیبل یا یه فایل سی اس اس و ....... ) این رویداد فراخونی میشه.

دیدم که بایستی یه فیلتر بذارم که فقط صفحات اچ تی ام ال رو چک کنه. اما خب به قول شما اگه با فراخوانی یه فایل سی اس اس سرور مشغول بشه چه راهی هست که بشو جلو این کار رو گرفت ؟؟؟؟؟؟

اصلا میشه یا نه ؟

Behrouz_Rad
شنبه 21 اردیبهشت 1387, 21:30 عصر
اگر IIS در حالت Integrated باشه میشه.
وقتی در قراردادی قرار بر این هست که موردی رعایت بشه که ملموس نیست، می تونی رعایتش نکنی! نهایتا اگر زمانی به طریقی کارفرما تونست بهت ثابت کنه که در موردی کوتاهی کردی، می تونی بهش بگی که این احتمالا یک باگ هست و اون موقع سعی کنی تا حدی که می تونی مشکل رو بر طرف کنی.
اگر مثل الان نیاز به یک سرور اختصاصی یا استفاده از امکانات ویژه بود، به کارفرما بگو که چنین چیزی نیاز به امکانات ویژه داره. اگر هزینش رو دارید بسم ا...

موفق باشید.

mehrdad201
یک شنبه 22 اردیبهشت 1387, 00:31 صبح
میدونید استاد میترسم اون موقع اینا نه نگن و ما رو بندازن تو هچل..............

به هر حال. در صدد هستم یه فایروال خوب روی سروزی که قراره برنامه رو روش قرار بدم نصب کنم.

یکی از دوستان ISA مایکروسافت رو پیشنهاد کرد. میخواستم بپرسم در موردش اطلاعاتی دارید ؟؟؟؟؟؟؟؟

کلا شما خودتون بودید چه فایروالی رو انتخاب میکردید استاد راد ؟

Behrouz_Rad
یک شنبه 22 اردیبهشت 1387, 01:13 صبح
متاسفانه بنده در کار هاست نبودم و در مورد این نوع فایروال ها اطلاعی ندارم.

persian_bigboy
سه شنبه 02 آذر 1389, 22:23 عصر
سلام بحث جالبی بود ولی این نوع حلمه نمیشه :
Deny You of Service (DYOS)
برام جالب شد . ولی دی داس روی IP اور میکنه در ضمن فکر میکنم که کسی که دی داس میکنه از یک آیپی نیست بلکه از یک رنج آیپی حلمه میکنه ، یعنی یک دفعه از 2.000 تا کلاینت حمله میکنه و شما نمی تونید بنش کنید . در ضمن برای من در ایرانسل این انتفاق افتاد کار سختی بدون امکانات فایروال مدیریت و کنترل کنی حملات حرفه ای رو .

iman_ad
سه شنبه 02 آذر 1389, 23:37 عصر
روش هایی که توسط دوستان ذکر شد همه سمت application هست حالا فرض کنید حمله از طریق درخواست یک عکس انجام بشه درسته proccess کمتری نسبت به صفحه داینامیک لازم ولی IIS در حالت معمول همچین فایلی به app ارجا نمی ده پس مساله امنیت iis مطرح می شه آیا لازم برای همه فایل ها از جمله عکس، استایل شیتها و ... یک هندلر بنویسیم؟ یا راه حل دیگه ای پیشنهاد می دید؟