In Stanford Yapay Öğrenme kursu Andrew Ng IT ML uygulayarak söz. Bir süre sonra sitemizde orta büyüklükte (yaklaşık 20 bin bot) DDoS aldığımda basit Sinir Ağı sınıflandırıcısını kullanarak buna karşı savaşmaya karar verdim.
Bu python betiğini yaklaşık 30 dakika içinde yazdım:
https://github.com/SaveTheRbtz/junk/tree/master/neural_networks_vs_ddos
PyBrain kullanır ve ikisi Sinir Ağı'nı eğitmek için giriş olarak 3 nginx günlüğü alır :
- İyi sorgularla
- Kötü olanlarla
Ve sınıflandırma için bir günlük
Kötü sorgulardan ..
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/" "-"
...ve iyi...
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"
... bir sözlük oluşturur:
['__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']
Ağımızı eğittiğimiz her giriş / sınıflandırmamız gereken giriş ...
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)"
... özellik-vektörüne dönüştürülür:
[False, False, False, False, True, False, False, True, True, False, False, False, False, False, False, False, False, True, True, False, False, False, False]
Tüm bunlardan sonra, veri kümesini eğitim ve test setlerine ayırma, sinir ağlarını eğitme ve en iyisini seçmenin standart yolu vardır. Bu işlemden sonra (veri kümesi boyutuna bağlı olarak oldukça uzun zaman alabilir), sonunda günlükleri eğitimli ağ kullanarak sınıflandırabiliriz.
Ancak bu yaklaşımla ilgili bazı sorunlar şunlardır:
- Çünkü Denetimli makine öğrenimi, sorunun türü için tür yanlış botlar algılamak için ilk ihtiyaç botlar algılamak ve bu verilerle Sinir Ağı eğitmek.
- Müşterinin davranışını hesaba katmam. Her kullanıcı için sayfadan sayfaya geçişleri düşünmek daha iyidir.
- Müşterilerin yerelliklerini hesaba katmıyorum. Ağdaki bir bilgisayara virüs bulaşmışsa, o ağdaki diğer bilgisayarlara virüs bulaşma olasılığı daha yüksektir.
- Coğrafi konum verilerini hesaba almıyorum. Tabii ki Rusya'da bir site işletiyorsanız, Brezilya'dan müşterilerin çok az şansı var.
- Bu problemi çözmek için sinir ağını ve sınıflandırmayı kullanmanın doğru bir yol olup olmadığını bilmiyorum. Belki bazı anomali tespit sistemi ile daha iyi oldu.
- ML yöntemi "çevrimiçi" (veya "akış" olarak adlandırılır) olduğunda daha iyidir, böylece anında eğitilebilir.
İşte sorular:
Sadece mevcut web sunucusu günlükleri (iyi istemciler ve botlardan oluşur) ve geçmiş veriler (önceki gün / hafta / ay için günlükler) verildiğinde aynı DDoS saldırısına karşı aynı savunma sorunuyla karşılaşsaydınız ne yapardınız? çoğunlukla iyi müşterilerle)?
Hangi Makine Öğrenimi yaklaşımını seçersiniz.
Hangi algoritmaları kullanırsınız?