سروش تن‌زاده
سروش تن‌زاده
خواندن ۶ دقیقه·۱ سال پیش

تشخیص ترافیک غیرنرمال در شبکه - قسمت دوم

در بخش قبلی در مورد روش SMA برای تشخیص ترافیک غیرنرمال گفتم، و یک‌سری چالش‌ها مثل انتخاب مشکل بودن انتخاب آستانه مناسب رو مطرح کردم. در این بخش مشکلات که SMA داره رو بیشتر بررسی می‌کنم و شیوه EWMA برای حل برخی از مشکلات مطرح میکنم.

اولین مشکل SMA در تشخیص ترافیک غیرنرمال سرعت پایین واکنش به تغییرات ناگهانی هست دلیلش هم شیوه محاسبه SMA هست. در SMA ما یک پنجره (window) از داده‌های زمانی رو در نظر میگیره (مثلا ۲ ساعت) و نسبت اون رو پنجره قبلی می‌سنجیم، این شیوه واکنش ممکنه در تشخیص ناهنجاری‌های کوتاه مدت عملکرد کارآمدی نداشته باشه، (ممکنه بگید که می‌تونی پنجره زمانی تشخیص رو کوچیک کنیم، ولی خب این قضیه false-positive ایجاد میکنه، یعنی ما تشخیص یک ترافیک غیرنرمال میدیم که اگر در اسکیل بزرگتر بهش نگاهی کنیم در واقع غیرنرمال نیست). این مسئله میتونه با دادن وزن به داده‌های سری‌زمانی حل بشه.

مشکل دیگه SMA اینه که از میانگین پنجره داده‌های سری‌زمانی استفاده می‌کنه که شیوه دقیقی برای تشخیص ترافیک غیرنرمال نیست، با میانگین‌گیری از یک‌سری زمانی ممکنه یک‌سری از ناهنجاری‌های ترافیکی رو lost کنیم، فرض کنید در بازه زمانی ۱ ساعته، افزایش نگهانی ترافیک و در عین حال کاهش نگهانی ترافیک داشتیم، ولی خب از اونجایی که داریم میانگین می‌گیریم این دو تغییر همدیگه رو در مجموع خنثی میکنند و میانگین یه عدد نرمال میشه درحالی که اون افزایش ناگهانی باعث شده بود که به خاطر CPU زدن سرورها با کاهش ترافیک ناگهانی مواجه بشیم.

برای حل این دو مشکل میشه از EWMA به جای SMA استفاده کرد، به جای اینکه داده‌های سری‌زمانی رو در یک پنجره مشخص میانگین‌گیری کنیم و باهم مقایسه کنیم، داده‌ها رو با توجه به یک وزن بین 0 و 1، به شکل smooth در بیاریم و داده‌های لحظه‌ای رو باهم مقایسه کنیم. فرمول EWMA به صورت زیر میشه.

Exponentially Weighted Moving Average
Exponentially Weighted Moving Average

که اینجا t نشون دهنده اندیس سری زمانی، r نشون دهنده مقدار سری‌زمانی در لحظه t و آلفا وزن انتخابی هست.

این رو اضافه کنم که این ساده‌ترین روش EWMA با وزن اولیه یکسان هست، در بسیاری از الگوریتم‌ها وزن به صورت خودکار مشخص میشه، و شیوه smooth کردن داده‌های سری‌زمانی مواردی بیش از وزن اولیه و مقادر در نقطه قبلی در نظر گرفته میشه، به دلیل ساده‌سازی مقاله برای خوانندگان از افزودن پیچیدگی به محاسبه EWMA خوداری می‌کنم.

در این شیوه با دادن وزن بیشتر به داده‌های جدید، در واقع اهمیت بیشتری برای داده‌های جدید در سری‌زمانی قائل میشیم.

پیاده‌سازی محاسبه EWMA برای یک مجموعه از داده‌ها به زبان Go

https://gist.github.com/soroosh-tanzadeh/3a06aed9ad482445d511c98b03a420f2

بریم سر بحث تشخیص غیرنرمال بودن ترافیک، حالا که می دونیم EWMA رو چجوری برای سری زمانی‌مون محاسبه کنیم، باید فکر کنیم که چطور میتونیم تشخیص بدیم که آیا مقادری که داریم در رنج مورد انتظار ما هست یا نه (یکم به مفهوم انتظار فکر کنید، انتظار در واقع به ما میگه قبلا چقدر این مقدار از رو در سری‌زمانی دیدیم،‌ یا بهتر اینجوری بگم که سری‌زمانی ما بیشتر وقتا عمدتا توی چه رنجی قرار داره).

قبل از اینکه از رنج مورد انتظار صحبت کنیم بزارید یک مفهوم آماری رو بهتون معرفی کنم: انحراف معیار

انحراف معیار (به انگلیسی: standard deviation) (نماد σ) یکی از شاخص های پراکندگی است که نشان می‌دهد به‌طور میانگین داده‌ها چه مقدار از مقدار میانگین فاصله دارند. اگر انحراف معیار مجموعه‌ای از داده‌ها نزدیک به صفر باشد، نشانه آن است که داده‌ها نزدیک به میانگین هستند و پراکندگی اندکی دارند؛ در حالی که انحراف معیار بزرگ بیانگر پراکندگی قابل توجه داده‌ها می‌باشد. انحراف معیار برابر ریشه دوم واریانس است. خوبی آن نسبت به واریانس، این است که هم بعد با داده‌ها می‌باشد. [wikipedia]

من اینجا از این فرمول برای انتخاب رنج مورد انتظار استفاده میکنم:

(انحراف معیار * آستانه تحمل) + مقادر لحظه‌ای EWMA

اگر مجموعه داده‌ای در رنج رندوم بین ۱ تا ۱۰ با میانگین ۵ و انحراف معیار ۳ داشته باشیم، بهمون میگه که عمده داده‌ها بین ۲ تا ۸ هستند، این به معنی نیست که هیچ داده‌ای کوچک‌تر ۲ یا بزرگ‌تر از ۸ نداریم، صرفن این مفهوم نشان‌دهنده میانگین فاصله داده‌ها از میانگین مجموع داده‌های ما هست. از اونجایی که انحراف معیار فاصله داده‌ها از میانگین رو نشون میده نمیتونه منفی باشه، و همیشه یک عدد مساوی یا بزرگتر از ۰ هست. فرمول محاسبه‌ش هم به شکل زیر هست:

فرمول محاسبه انحراف معیار نمونه و جمعیت
فرمول محاسبه انحراف معیار نمونه و جمعیت

در اینجا ما از انحراف معیار جمعیت استفاده میکنیم، چون برای ما مهمه که به طور کلی کل داده‌های سری‌زمانی ما در بلند مدت در چه بازه‌ای هستند، نه پنجره‌ای از داده‌ها.

در نهایت من کد زیر رو برای تشخیص وجود ناهنجاری (داده غیرنرمال) با Go نوشتم (دلیل اینکه خیلی توضیح نمیدم اینه کدش خودش نشون دهنده راه‌حل نهایی هست، و به فکر می‌کنم بهتره به جای توضیحات ریاضی که برای خیلیا خسته کننده هست، کد رو نشونتون بدم:))

https://gist.github.com/soroosh-tanzadeh/9838774455b456f7a39cbf7adbeb87f9

در این مثال، افت ترافیک از ۶۰ به ۱۰ و افزایش ترافیک از ۱۰ به ۱۰۹۰ به عنوان anomaly تشخیص داده میشود.

این روش تشخیص هم مثل SMA یک‌سری ایرادت در تشخیص ترافیک غیرنرمال داره، یکی از ایرادات ناتوانی تشخیص تغییرات غیرمنتظره کوچیک هست و مشکل در تشخیص تغییرات ترافیک فصلی هست

این مثال رو در نظر بگیرید: فرض کنید، هر روز ساعت ۲ ظهر افزایش ترافیک وجود داشته باشه، با توجه به اینکه مدت زمان افزایش ترافیک کم هست تاثیر کمی در انحراف معیار داده‌ها خواهد گذاشت در نتیجه با threshold مناسب هم همیشه ما اون تایم رو anomaly تشخیص میدیم(حتمن میگید بزاریم اون تایم threshold افزایش پیدا کنه که خب منطقی هم هست ولی انتخاب threshold مناسب کار رو سخت میکنه). البته یک‌سری راه‌کارها برای بهبود این روش وجود داره مثل استفاده از استفاده از احتمال(منظور p(x) هست، که بین 0 و 1 قرار داره) رخداد یک‌سری افزایش ترافیک‌ها در کنار threshold هست، و توزیع احتمال رخداد هر داده ترافیکی، که خارج از مباحث این مقاله هست (اگر علاقه دارید به مقالات تخصصی‌تر ارجاع‌تون میدم - برای این مورد آخرین مقاله از لیست مقالاتی که گذاشتم). در کل استفاده از EWMA به تنهایی عملکرد خوبی در تشخیص anomaly در محیطی که احتمال رخ‌داد افزایش ترافیک فصلی غیرقابل پیش‌بینی وجود داره، نداره.

مشکل بعدی بحث تشخیص ترافیک غیرمنتظره‌ای هست که به صورت آروم و پیوسته رخ میدن، اگر میزان ترافیک در مدت مثلا ۲۴ ساعت افزایش پیدا کنه، با توجه به ناگهانی نبودی افزایش ترافیک، امکان تشخیص اون توسط این روش وجود نداره، میشه به شکلی افزایش ترافیک روی قربانی حمله DDoS افزایش داده که هیچ‌وقت ترافیک ورودی از توزیع‌نرمال استریم مورد بررسی خارج نشه، اما ترافیک غیرمنطقی باشه (یعنی پرامتر‌های دیگه هم در کنار افزایش ترافیک باید در نظر گرفته بشه مثل توزیع‌ترافیک بر اساس آی‌پی‌های whitelist نشده). افزایش تعداد پرامترهای بررسی ترافیک به بهبود نحوه تشخیص کمک میکنه.

نکته: این شیوه تشخیص یه روش ابتدایی صرفا جهت آشنایی با نحوه تشخیص ترافیک غیرنرمال هست داده‌های مشخص شده در کد کاملا رندوم هست، و قطعا کامل نیست. بهتون پیشنهاد میکنم خودتون با اضافه کردن پارامترهای بیشتر و استفاده از داده‌های واقعی بهبودش بدید.

جهت آشنایی بیشتر با مبحث تشخیص anomaly شما رو به مقالات و کتاب‌های زیر رجوع میدم.

مقالات

Seasonal Anomaly Detection - Streaming Data

Use EWMA for defend against DDoS attacks

Control Chart Tests Based on Geometric Moving Averages

Time-Series Anomaly Detection Service at Microsoft

Real-time Anomaly Detection for Multivariate Data Streams

گیت‌هاب

Anomaly Detection for time series data

کتاب‌ها

Anomaly Detection for Monitoring

تشخیص ترافیک غیرنرمالشبکهexponentially moving averageترافیک شبکهترافیک غیرنرمال
یه developer کاملا معمولی در یک کلودپروایدر معمولی
شاید از این پست‌ها خوشتان بیاید