Ders 12 / 20
Saldırı Tespit ve Önleme Sistemleri
On dört olay sınıfı ve yedi imza aynı dönem üzerinde koşturulur: ağ tabanlı ile konak tabanlı algılayıcının gördüğü kalem farkı, yakalanan ve kaçan olay, uyarıların ne kadarının yanlış pozitif olduğu, önleme kipine geçilince kesilen meşru iş ve gürültülü imzayı kapatmanın aynı hamlede kaybettirdiği tespit.
İçindekiler
Önceki ders iki yüz on üç bin bağlantıyı bir kayda yazdırdı. Kayıt tutmak görmek değildir: dönemin kayıtları arasında hangisinin bakılmaya değer olduğunu söyleyen bir şey yok. Bu dersin konusu o söylemeyi üstlenen katmandır — ve o katmanın kendisi de sayılabilir bir şey yapar, çünkü her “bakılmaya değer” kararı bir doğru ve bir yanlış üretir.
Ölçülen üç sayı var: dönemin kötü olaylarından kaçı yakalanıyor, yakalananların yanında kaç meşru olay yanlışlıkla işaretleniyor ve tespitten önlemeye geçildiğinde — yani kayıt tutmak yerine bağlantı kesilmeye başlandığında — kaç meşru iş duruyor. Buna bir dördüncü ekleniyor: algılayıcı ağda mı yoksa konakta mı duruyor, çünkü ikisi aynı dönemde farklı olay kümesi görüyor. Bu derste hiçbir saldırı adımı yazılmadı; olay sınıfları savunmanın gördüğü belirtilerdir.
- CS18. On dört olay sınıfı, dönem sayıları ve yedi imza kurgusal bölgesel ölçüm ağına aittir.
Gerçek bir olay üretilmiyor; ölçülen şey
nodeile kurulan modeldir. - CS19. Olayların gerçek sınıfı elle işaretlendi. Gerçekte bu sınıf ancak inceleme sonrası bilinir; modelde bilindiği varsayılıyor ki yanlış pozitif sayılabilsin.
- CS20. Bir olay sınıfı ya tek bir imzayla eşleşiyor ya hiçbiriyle. Gerçekte bir olay birden çok imzaya değebilir; uyarı sayısını büyütür, oranların yönünü değiştirmez.
- CS21. Görünürlük üç değerle modellendi: yalnız ağdan, yalnız konaktan ya da ikisinden. Şifreli akış konak tarafında açık, ağ tarafında kapalı sayıldı.
- CS22. Eşik, sıklık penceresi ve öğrenme evresi modellenmedi. Bir imza ya uyarır ya uyarmaz.
- CS23. Önleme kipinde uyaran her olayın durdurulduğu varsayıldı; gecikme ve kısmi kesme yok.
Olay Kümesi ve İki Algılayıcı Türü
Model her olay sınıfı için beş şey tutuyor: adı, gerçek sınıfı, hangi konumdan görülebildiği, dönemdeki sayısı ve eşleştiği imza. Algılayıcının uyarması iki koşula bağlı — olayı görebilmesi ve bir imzanın eşleşmesi. İkisi ayrı ayrı sayılabildiği için kaçan olayları iki nedene ayırmak mümkün oluyor.
// olay.mjs — donem olay kumesi, imza listesi ve iki algilayici turu; model, gercek olay degil // [ad, gercek sinif, gorunurluk, donem sayisi, eslesen imza] export const OLAY = [ ['yonetim kapisina yogun deneme', 'kotu', 'ikisi', 12000, 'yogun-deneme'], ['bilinmeyen sunucu adina cikis', 'kotu', 'ag', 40, 'bilinmeyen-ad'], ['konakta yeni ayricalikli surec', 'kotu', 'konak', 6, 'yeni-surec'], ['duzenli aralikli kucuk cikis', 'kotu', 'ikisi', 2880, null], ['yerel dosya izninin degismesi', 'kotu', 'konak', 14, 'izin-degisikligi'], ['sifreli akis icinde bilinen yuk', 'kotu', 'konak', 3, 'bilinen-yuk'], ['ic bolgede tarama benzeri dizi', 'kotu', 'ag', 220, 'tarama-dizisi'], ['ceyrek sonu toplu sorgu', 'mesru', 'ikisi', 12, 'tarama-dizisi'], ['yedek aktarimi', 'mesru', 'ikisi', 12, 'buyuk-hacim'], ['yama dagitimi', 'mesru', 'ikisi', 90, 'yeni-surec'], ['saha ucu yeniden baglanma dalgasi', 'mesru', 'ag', 5100, 'yogun-deneme'], ['olcut cekme', 'mesru', 'ikisi', 259200, null], ['sube arayuz istekleri', 'mesru', 'ag', 184000, null], ['zaman kaynagi sorgusu', 'mesru', 'ag', 43200, null], ]; export const SENSOR = { ag: ['ag', 'ikisi'], konak: ['konak', 'ikisi'], ikisi: ['ag', 'konak', 'ikisi'] }; export const IMZA = [...new Set(OLAY.map((o) => o[4]).filter(Boolean))]; export const gorur = (s, o) => SENSOR[s].includes(o[2]); export const uyarir = (s, o, kapali = []) => gorur(s, o) && o[4] !== null && !kapali.includes(o[4]); export const topla = (l) => l.reduce((a, o) => a + o[3], 0); export function say(s, kapali = []) { const u = (f) => OLAY.filter((o) => f(o)); const yakalanan = u((o) => o[1] === 'kotu' && uyarir(s, o, kapali)); const kacan = u((o) => o[1] === 'kotu' && !uyarir(s, o, kapali)); const yanlis = u((o) => o[1] === 'mesru' && uyarir(s, o, kapali)); return { yakalanan, kacan, yanlis, uyari: topla(yakalanan) + topla(yanlis) }; }
İmza kümesi yedi kalemden oluşuyor ve hiçbiri bir ürüne ait değil; her biri bir belirtinin adıdır. Dönemin toplam olay sayısı beş yüz altı bini aşıyor, bunun büyük çoğunluğu üç sınıftan geliyor ve o üç sınıfın hiçbir imzası yok. Ölçüm bu yüzden hacimle değil sınıfla başlıyor: hangi sınıf hangi konumdan görünüyor, hangi sınıfa bir imza değiyor.
Ağ Tabanlı ile Konak Tabanlı
// kosum1.mjs — ag ve konak tabanli algilayicinin gordugu kalem, yakaladigi ve kacirdigi olay import { OLAY, SENSOR, IMZA, gorur, uyarir, topla, say } from './olay.mjs'; const KOTU = OLAY.filter((o) => o[1] === 'kotu'); console.log(`${OLAY.length} olay sinifi, ${KOTU.length} kotu / ${OLAY.length - KOTU.length} mesru; ` + `donemde ${topla(OLAY)} olay, ${IMZA.length} imza\n`); console.log(`${'olay sinifi'.padEnd(34)} ${'sinif'.padStart(6)} ${'sayi'.padStart(6)} ${'imza'.padStart(17)} ` + `${'ag'.padStart(8)} ${'konak'.padStart(8)}`); for (const o of OLAY) console.log(`${o[0].padEnd(34)} ${o[1].padStart(6)} ${String(o[3]).padStart(6)} ${String(o[4] ?? '-').padStart(17)} ` + `${(gorur('ag', o) ? (uyarir('ag', o) ? 'uyari' : 'gorur') : '-').padStart(8)} ` + `${(gorur('konak', o) ? (uyarir('konak', o) ? 'uyari' : 'gorur') : '-').padStart(8)}`); console.log(`\n${'algilayici'.padEnd(11)} ${'gordugu sinif'.padStart(13)} ${'yakalanan kotu'.padStart(14)} ` + `${'kacan kotu'.padStart(10)} ${'yanlis pozitif sinif'.padStart(20)} ${'donem uyarisi'.padStart(13)}`); for (const s of Object.keys(SENSOR)) { const r = say(s), gordugu = OLAY.filter((o) => gorur(s, o)).length; console.log(`${s.padEnd(11)} ${String(gordugu).padStart(13)} ${`${r.yakalanan.length}/${KOTU.length}`.padStart(14)} ` + `${String(r.kacan.length).padStart(10)} ${String(r.yanlis.length).padStart(20)} ${String(r.uyari).padStart(13)}`); } const ikisi = say('ikisi'); console.log(`\niki algilayici birlikteyken kacan kotu siniflar:`); for (const o of ikisi.kacan) console.log(` ${o[0].padEnd(34)} ${String(o[3]).padStart(6)} ${o[4] === null ? 'imza yok' : 'gorulmuyor'}`);
14 olay sinifi, 7 kotu / 7 mesru; donemde 506777 olay, 7 imza olay sinifi sinif sayi imza ag konak yonetim kapisina yogun deneme kotu 12000 yogun-deneme uyari uyari bilinmeyen sunucu adina cikis kotu 40 bilinmeyen-ad uyari - konakta yeni ayricalikli surec kotu 6 yeni-surec - uyari duzenli aralikli kucuk cikis kotu 2880 - gorur gorur yerel dosya izninin degismesi kotu 14 izin-degisikligi - uyari sifreli akis icinde bilinen yuk kotu 3 bilinen-yuk - uyari ic bolgede tarama benzeri dizi kotu 220 tarama-dizisi uyari - ceyrek sonu toplu sorgu mesru 12 tarama-dizisi uyari uyari yedek aktarimi mesru 12 buyuk-hacim uyari uyari yama dagitimi mesru 90 yeni-surec uyari uyari saha ucu yeniden baglanma dalgasi mesru 5100 yogun-deneme uyari - olcut cekme mesru 259200 - gorur gorur sube arayuz istekleri mesru 184000 - gorur - zaman kaynagi sorgusu mesru 43200 - gorur - algilayici gordugu sinif yakalanan kotu kacan kotu yanlis pozitif sinif donem uyarisi ag 11 3/7 4 4 17474 konak 9 4/7 3 3 12137 ikisi 14 6/7 1 4 17497 iki algilayici birlikteyken kacan kotu siniflar: duzenli aralikli kucuk cikis 2880 imza yok
İki algılayıcı türü aynı dönemde farklı kümeler görüyor ve kesişimleri tam değil. Ağ tabanlı olan on bir sınıf görüyor, konak tabanlı olan dokuz; ikisinin birleşimi on dörttür, yani her sınıf en az birinden görülüyor. Ayrıştıkları yer tek tek satırlarda okunuyor. Konakta açılan ayrıcalıklı bir süreç ve yerel dosya izninin değişmesi ağdan hiç görünmüyor, çünkü bu olaylar hiçbir paket üretmiyor. Şifreli akış içindeki bilinen yük de ağdan görünmüyor — ilk derste ölçülen kayıp burada tespit tarafında karşımıza çıkıyor. Buna karşılık iç bölgedeki tarama benzeri bağlantı dizisi konaktan görünmüyor: her makine kendi payına düşen tek bir bağlantıyı görür, diziyi görmek için bütün makinelerin bağlantılarına aynı anda bakmak gerekir.
Yakalanan sütunu bu farkın toplamıdır. Ağ tabanlı algılayıcı yedi kötü sınıfın üçünü, konak tabanlı dördünü yakalıyor; ikisi birlikte altısını. Tek bir sınıf ikisinden de kaçıyor ve nedeni görünürlük değil: düzenli aralıklı küçük çıkışları iki algılayıcı da görüyor, hiçbir imza eşleşmiyor. Bu olay hiçbir kurala aykırı değildir; aykırı olan düzenliliğidir ve düzenlilik bir imzayla değil, bir taban çizgisiyle yakalanır.
Yanlış pozitif sütunu ise ters yönde okunmalıdır. Ağ tabanlı algılayıcı dört sınıfta, konak tabanlı üç sınıfta yanlış uyarı üretiyor; ikisini birlikte çalıştırmak yanlış pozitif sınıfını dörtte tutuyor ama uyarı sayısını on yedi bin dört yüz yetmiş dörtten on yedi bin dört yüz doksan yediye çıkarıyor. İki algılayıcı aynı olayı iki kez işaretlediğinde yakalanan sınıf artmaz, kuyruk artar. İkisini birlikte kurmanın kazancı — yakalanan sınıfın üçten ya da dörtten altıya çıkması — bedelsiz değildir: iki ayrı kural kümesi, iki ayrı kuyruk ve konak tarafında her makineye yerleştirilecek bir kalem.
Tespit, Önleme ve İmzayı Kapatmak
// kosum2.mjs — ayni kume once tespit sonra onleme kipinde; imza kapatmanin iki yonu import { OLAY, IMZA, uyarir, topla, say } from './olay.mjs'; console.log(`${'imza'.padEnd(17)} ${'uyardigi kotu'.padStart(13)} ${'uyardigi mesru'.padStart(14)} ${'gurultu payi'.padStart(12)}`); for (const i of IMZA) { const e = OLAY.filter((o) => o[4] === i && uyarir('ikisi', o)); const [k, m] = [topla(e.filter((o) => o[1] === 'kotu')), topla(e.filter((o) => o[1] === 'mesru'))]; console.log(`${i.padEnd(17)} ${String(k).padStart(13)} ${String(m).padStart(14)} ${`%${(m * 100 / (k + m)).toFixed(1)}`.padStart(12)}`); } console.log(`\n${'imza kumesi'.padEnd(26)} ${'uyari'.padStart(6)} ${'gurultu'.padStart(7)} ${'yakalanan kotu'.padStart(14)} ` + `${'kacan kotu'.padStart(10)} ${'onlemede kesilen mesru'.padStart(22)}`); for (const [ad, kapali] of [['hepsi acik', []], ['buyuk-hacim kapali', ['buyuk-hacim']], ['+ yogun-deneme kapali', ['buyuk-hacim', 'yogun-deneme']]]) { const r = say('ikisi', kapali); console.log(`${ad.padEnd(26)} ${String(r.uyari).padStart(6)} ${`%${(topla(r.yanlis) * 100 / r.uyari).toFixed(1)}`.padStart(7)} ` + `${String(topla(r.yakalanan)).padStart(14)} ${String(topla(r.kacan)).padStart(10)} ${String(topla(r.yanlis)).padStart(22)}`); } const r = say('ikisi'); console.log('\nonleme kipine gecilince kesilen mesru is:'); for (const o of r.yanlis) console.log(` ${o[0].padEnd(34)} ${String(o[3]).padStart(5)} imza: ${o[4]}`); console.log(`\n${'olcu'.padEnd(30)} ${'tespit kipi'.padStart(11)} ${'onleme kipi'.padStart(11)}`); for (const [ad, t, o] of [['duran kotu olay', 0, topla(r.yakalanan)], ['kesilen mesru olay', 0, topla(r.yanlis)], ['elle bakilacak uyari', r.uyari, r.uyari], ['kacan kotu olay', topla(r.kacan), topla(r.kacan)]]) console.log(`${ad.padEnd(30)} ${String(t).padStart(11)} ${String(o).padStart(11)}`);
imza uyardigi kotu uyardigi mesru gurultu payi yogun-deneme 12000 5100 %29.8 bilinmeyen-ad 40 0 %0.0 yeni-surec 6 90 %93.8 izin-degisikligi 14 0 %0.0 bilinen-yuk 3 0 %0.0 tarama-dizisi 220 12 %5.2 buyuk-hacim 0 12 %100.0 imza kumesi uyari gurultu yakalanan kotu kacan kotu onlemede kesilen mesru hepsi acik 17497 %29.8 12283 2880 5214 buyuk-hacim kapali 17485 %29.8 12283 2880 5202 + yogun-deneme kapali 385 %26.5 283 14880 102 onleme kipine gecilince kesilen mesru is: ceyrek sonu toplu sorgu 12 imza: tarama-dizisi yedek aktarimi 12 imza: buyuk-hacim yama dagitimi 90 imza: yeni-surec saha ucu yeniden baglanma dalgasi 5100 imza: yogun-deneme olcu tespit kipi onleme kipi duran kotu olay 0 12283 kesilen mesru olay 0 5214 elle bakilacak uyari 17497 17497 kacan kotu olay 2880 2880
Üst tablo imzaları tek tek tartıyor ve iki uç var. Büyük hacimli aktarım imzası dönemde hiçbir kötü olay yakalamadı, on iki meşru yedek aktarımı işaretledi: gürültü payı yüzde yüz. Bilinen yük ve izin değişikliği imzaları hiç yanlış pozitif üretmedi. Aradaki fark imzanın ne kadar özel yazıldığıdır; hacim ölçen bir imza işin kendisiyle aynı şeye bakar, bir dosya izninin belirli bir biçimde değişmesi işin hiçbir yerinde olmaz.
Alt tablo bu tartının sonucunu koşturuyor. Gürültü payı yüzde yüz olan imzayı kapatmak on iki uyarı düşürüyor ve hiçbir tespit kaybettirmiyor — karşılıksız kazanç budur ve nadirdir. İkinci adım gerçek takası gösteriyor. Yoğun deneme imzası dönemin en gürültülü ikinci imzasıdır ve tek başına beş bin yüz yanlış pozitif üretir; kapatmak uyarı sayısını on yedi binden üç yüz seksen beşe indirir. Aynı hamle yakalanan kötü olayı on iki binden iki yüz seksen üçe düşürür, kaçan kötü olayı iki bin sekiz yüzden on dört bin sekiz yüze çıkarır. Gürültü payı ise yüzde otuzdan yüzde yirmi altıya iner: gürültünün oranı neredeyse değişmez, çünkü hem pay hem payda aynı imzadan geliyordu. Gürültü oranıyla karar veren bir düzen bu hamleyi bir iyileşme sanır.
Son tablo tespit ile önleme arasındaki tek gerçek farkı veriyor. İki kip aynı uyarıyı üretiyor ve aynı olayı kaçırıyor; ayrıştıkları yer ilk iki satırdır. Önleme kipi on iki bin iki yüz seksen üç kötü olayı durduruyor ve karşılığında beş bin iki yüz on dört meşru olayı kesiyor. Kesilen dört sınıfın hangileri olduğu alt listede yazıyor ve sayıdan daha önemli olan sınıfın kendisidir: doksan yama dağıtımı ve on iki yedek aktarımı kesiliyor. Bir önleme sistemi yama dağıtımını durdurduğunda ağı yalnız o dönem için korumuş olmaz; makineleri yamasız bıraktığı için sonraki dönemin açık kalemini kendisi üretir. Beş bin yüz saha ucu yeniden bağlanma denemesinin kesilmesi ise ölçüm verisinin kaybı demektir.
Kesilen sınıflardan biri bu takasın en dar hâlini gösteriyor. Yama dağıtımı ile konakta açılan ayrıcalıklı süreç aynı imzayı tetikliyor ve o imzanın gürültü payı yüzde doksan dörttür: doksan altı işaretin doksanı yanlıştır. Böyle bir imzayı önleme kipinde bırakmak, altı gerçek olayı durdurmak için doksan yama dağıtımını kesmek demektir. Kapatmak ise altı olayı tamamen görünmez kılar. Üçüncü bir seçenek modelde yok ve gerçekte de ucuz değildir: imzayı bağlama duyarlı hâle getirmek, yani süreci neyin başlattığını bilmek. O bilgi ağ katmanında hiç yoktur.
Tespit kipinde bu maliyetlerin hiçbiri yoktur; onun yerine on yedi bin dört yüz doksan yedi uyarının elle bakılacak bir kuyruk oluşturması vardır. İki kip arasındaki seçim bir doğruluk seçimi değildir — aynı imza kümesi, aynı yanlışlar. Seçilen şey yanlışın nereye yazılacağıdır: kesilen meşru işe mi, yoksa kimsenin sonuna kadar bakamayacağı bir kuyruğa mı.
Özet
- Ağ tabanlı algılayıcı 14 sınıfın 11’ini, konak tabanlı 9’unu görüyor. Konakta açılan ayrıcalıklı süreç ve dosya izni değişikliği ağdan hiç görünmüyor; iç bölgedeki tarama benzeri dizi ise konaktan görünmüyor, çünkü her makine yalnız kendi tek bağlantısını görür.
- İkisi birlikte 7 kötü sınıfın 6’sını yakalıyor. Kaçan tek sınıfı ikisi de görüyor; eşleşen imza yok — aykırı olan tek şey düzenliliğidir.
- 7 imzanın gürültü payı %0 ile %100 arasında değişiyor. Büyük hacim imzası dönemde hiç kötü olay yakalamayıp 12 meşru aktarım işaretliyor; kapatmak karşılıksız kazançtır.
- Yoğun deneme imzasını kapatmak uyarıyı 17.497’den 385’e indiriyor, ama yakalanan kötü olayı 12.283’ten 283’e düşürüp kaçanı 2.880’den 14.880’e çıkarıyor. Gürültü oranı %29,8’den %26,5’e iniyor: oranla karar veren düzen bu hamleyi iyileşme sanır.
- Önleme kipi 12.283 kötü olayı durdurup 4 sınıfta 5.214 meşru olayı kesiyor; kesilenlerin arasında 90 yama dağıtımı var. İki kip aynı olayı kaçırıyor; seçilen şey yanlışın kesilen işe mi yoksa bakılamayan uyarı kuyruğuna mı yazılacağıdır.
Sonraki Adım
Bu dersin bütün gürültüsü tek bir yerden geldi: imzalar hem meşru işin hem de kötü olayın geçtiği bir alana bakıyordu. Yanlış pozitif oranını düşürmenin yolu daha iyi imza yazmak değil, meşru işin hiç uğramadığı bir yere bakmaktır. Sonraki dersin sorusu budur: dönemde hiçbir meşru bağlantının hiç dokunmaması gereken bir kalem konulursa, ona gelen her etkileşimin yanlış pozitif oranı ne olur, bu sinyal dönemin kaçıncı gününde gelir ve aynı düzenin hiç göremediği kaç kalem kalır.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.