में स्टैनफोर्ड मशीन लर्निंग पाठ्यक्रम एंड्रयू एनजी आईटी में एमएल लागू करने का उल्लेख किया। कुछ समय बाद जब मुझे हमारी साइट पर मध्यम आकार (लगभग 20k बॉट) DDoS मिला, तो मैंने सरल न्यूरल नेटवर्क क्लासिफायर का उपयोग करके इसके खिलाफ लड़ने का फैसला किया।
मैंने लगभग 30 मिनट में इस अजगर की पटकथा लिखी है:
https://github.com/SaveTheRbtz/junk/tree/master/neural_networks_vs_ddos
यह pyBrain का उपयोग करता है और इनपुट के रूप में 3 nginx लॉग लेता है , उनमें से दो तंत्रिका नेटवर्क को प्रशिक्षित करते हैं:
- अच्छे प्रश्नों के साथ
- बुरे लोगों के साथ
और वर्गीकरण के लिए एक लॉग
बुरे प्रश्नों से ।।
0.0.0.0 - - [20/Dec/2011:20:00:08 +0400] "POST /forum/index.php HTTP/1.1" 503 107 "http://www.mozilla-europe.org/" "-"
...और अच्छा...
0.0.0.0 - - [20/Dec/2011:15:00:03 +0400] "GET /forum/rss.php?topic=347425 HTTP/1.0" 200 1685 "-" "Mozilla/5.0 (Windows; U; Windows NT 5.1; pl; rv:1.9) Gecko/2008052906 Firefox/3.0"
... यह एक शब्दकोश का निर्माण करता है:
['__UA___OS_U', '__UA_EMPTY', '__REQ___METHOD_POST', '__REQ___HTTP_VER_HTTP/1.0',
'__REQ___URL___NETLOC_', '__REQ___URL___PATH_/forum/rss.php', '__REQ___URL___PATH_/forum/index.php',
'__REQ___URL___SCHEME_', '__REQ___HTTP_VER_HTTP/1.1', '__UA___VER_Firefox/3.0',
'__REFER___NETLOC_www.mozilla-europe.org', '__UA___OS_Windows', '__UA___BASE_Mozilla/5.0',
'__CODE_503', '__UA___OS_pl', '__REFER___PATH_/', '__REFER___SCHEME_http', '__NO_REFER__',
'__REQ___METHOD_GET', '__UA___OS_Windows NT 5.1', '__UA___OS_rv:1.9',
'__REQ___URL___QS_topic', '__UA___VER_Gecko/2008052906']
प्रत्येक प्रविष्टि जिसे हम अपने नेटवर्क को / प्रविष्टि के साथ प्रशिक्षित करते हैं जिसे हमें वर्गीकृत करने की आवश्यकता है ...
0.0.0.0 - - [20/Dec/2011:20:00:01 +0400] "GET /forum/viewtopic.php?t=425550 HTTP/1.1" 502 107 "-" "BTWebClient/3000(25824)"
... सुविधा-वेक्टर में परिवर्तित हो जाता है:
[False, False, False, False, True, False, False, True, True, False, False, False, False, False, False, False, False, True, True, False, False, False, False]
इस सब के बाद, डेटासेट को प्रशिक्षण और परीक्षण सेटों में विभाजित करने, तंत्रिका नेटवर्क को प्रशिक्षित करने और सर्वश्रेष्ठ का चयन करने का मानक मार्ग है। इस प्रक्रिया के बाद (जो कि डेटासेट आकार के आधार पर बहुत लंबा समय ले सकता है) हम अंततः प्रशिक्षित नेटवर्क का उपयोग करके लॉग को वर्गीकृत कर सकते हैं।
लेकिन यहाँ उस दृष्टिकोण के साथ कई समस्याएं हैं:
- पर्यवेक्षित मशीन लर्निंग उस प्रकार की समस्या के लिए थोड़े गलत है, क्योंकि बॉट का पता लगाने के लिए मुझे पहले बॉट का पता लगाने और उस डेटा के साथ न्यूरल नेटवर्क को प्रशिक्षित करने की आवश्यकता है ।
- मैं ग्राहक के व्यवहार को एक खाते में नहीं लेता हूं। प्रत्येक उपयोगकर्ता के लिए पृष्ठ के पेज परिवर्तन पर विचार करना बेहतर है।
- मैं ग्राहकों को एक खाते में नहीं लेता। यदि नेटवर्क में एक कंप्यूटर कुछ वायरस से संक्रमित है, तो इस बात की अधिक संभावना है कि उस नेटवर्क के अन्य कंप्यूटर संक्रमित हैं।
- मैं एक खाते में जियोलोकेशन डेटा नहीं लेता। बेशक अगर आप रूस में साइट चला रहे हैं तो ब्राजील के ग्राहकों की संभावना कम है।
- मुझे नहीं पता कि क्या इस तरह की समस्या को हल करने के लिए तंत्रिका नेटवर्क और वर्गीकरण का उपयोग करना सही था। हो सकता है कि मैं कुछ विसंगतियों का पता लगाने की प्रणाली से बेहतर था।
- यह बेहतर है जब एमएल विधि "ऑनलाइन" (या तथाकथित "स्ट्रीमिंग") है, इसलिए इसे मक्खी पर प्रशिक्षित किया जा सकता है।
तो यहाँ प्रश्न हैं:
यदि आप केवल DDoS हमले के खिलाफ वर्तमान वेबसर्वर लॉग (जिसमें अच्छे ग्राहक और बॉट होते हैं) और ऐतिहासिक डेटा (पिछले दिन / सप्ताह / महीने के लिए लॉग) दिए गए एक ही समस्या से सामना करने पर आप क्या करेंगे? ज्यादातर अच्छे ग्राहकों के साथ)?
आप कौन सी मशीन लर्निंग अप्रोच चुनेंगे।
आप किस एल्गोरिदम का उपयोग करेंगे?